Two inputs, then one command per box and one artifact per command, with the arithmetic of each printed in the section that shows it.
The two boxes on the left are inputs, not commands: a provider's quotes or the user's own file, and the underlying's daily closes, which the commands fetch or are given rather than read from disk. Every other box is one command and the schema-validated artifact it writes under the artifact directory, and every arrow into one of those is what that command reads: an input, or an artifact already in the directory. This page reads all of them and writes nothing. The simulation and the backtest read the underlying's own closes rather than the chain, so they file under the symbol rather than an expiry; the exposure command reads the chain snapshot and prices its own gamma rather than reading the ladder; the forward ledger marks a saved plan against later chains. Replaced artifacts move to archive/<date>/ with a timestamp rather than being overwritten, and each one carries the same meta block: schema, timestamp, tool and engine versions, the provider used, a degraded flag with its reason, and notes. Each section below prints the arithmetic behind its own panel. Nothing here places an order.
model expected profit divided by capital at risk, ties broken by model probability of profit
Top of the ordering: bear put spread at 104.8% expected return on capital at risk, P(profit) 46.0%, ahead of the next by 11.3%.
| rank | structure | type | net | max gain | max loss | capital at risk | reward:risk | P(profit) | expected P/L | return on risk | delta | theta | vega | friction |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | bear put spread | debit | -0.90 | 4.10 | -0.90 | 0.90 | 4.56 | 46.0% | 0.94 | 104.8% | -0.257 | -0.008 | 3.12 | thin |
| 2 | bull call spread | debit | -0.90 | 4.10 | -0.90 | 0.90 | 4.56 | 43.4% | 0.84 | 93.4% | 0.261 | -0.008 | 1.88 | thin |
| 3 | iron condor | credit | 1.80 | 1.80 | -3.20 | 3.20 | 0.56 | 68.8% | 0.42 | 13.2% | -0.014 | 0.033 | -8.47 | thin |
| 4 | bull put spread | credit | 0.90 | 0.90 | -4.10 | 4.10 | 0.22 | 80.8% | 0.22 | 5.3% | 0.143 | 0.016 | -4.53 | thin |
| 5 | bear call spread | credit | 0.90 | 0.90 | -4.10 | 4.10 | 0.22 | 81.2% | 0.20 | 5.0% | -0.157 | 0.017 | -3.93 | thin |
| 6 | jade lizard | credit | 3.70 | 3.70 | -86.30 | 86.30 | 0.04 | 88.3% | 2.84 | 3.3% | -0.089 | 0.032 | -7.68 | ok |
| 7 | cash secured put | credit | 2.80 | 2.80 | -87.20 | 87.20 | 0.03 | 97.7% | 2.64 | 3.0% | 0.067 | 0.015 | -3.74 | ok |
| 8 | long call | debit | -4.60 | unlimited | -4.60 | 4.60 | n/a | 24.2% | -1.91 | -41.6% | 0.533 | -0.050 | 11.40 | ok |
| 9 | straddle | debit | -9.20 | unlimited | -9.20 | 9.20 | n/a | 17.1% | -3.83 | -41.6% | 0.066 | -0.089 | 22.80 | ok |
| 10 | long put | debit | -4.60 | 95.40 | -4.60 | 4.60 | 20.74 | 25.3% | -1.91 | -41.6% | -0.467 | -0.039 | 11.40 | ok |
| 11 | iron butterfly | credit | 1.80 | 1.80 | -3.20 | 3.20 | 0.56 | 21.1% | -1.78 | -55.7% | -0.004 | 0.016 | -5.00 | thin |
| 12 | long call butterfly | debit | -3.20 | 1.80 | -3.20 | 3.20 | 0.56 | 21.1% | -1.78 | -55.7% | -0.004 | 0.016 | -5.00 | thin |
| 13 | strangle | debit | -7.40 | unlimited | -7.40 | 7.40 | n/a | 6.5% | -5.61 | -75.8% | 0.062 | -0.074 | 17.79 | ok |
| ratio spread | credit | 1.00 | 11.00 | unlimited | n/a | n/a | 99.8% | 3.19 | n/a | 0.302 | 0.001 | 0.23 | thin |
Read this before using the order. Ranked by model expected profit per unit of capital at risk, under a lognormal settlement model at a single at-the-money volatility. The market prices each strike with its own volatility, so a positive expectation here largely measures that disagreement rather than an edge. Premiums are mid quotes, not fills. This is an ordering of structures under stated assumptions, not a recommendation to trade any of them.
Four measured quantities on one axis, with the weights shown. This is an ordering under stated weights, not an estimate of edge and not a view on what to do.
score = 100 * (0.30 pop + 0.30 edge + 0.25 rr + 0.15 (1 - es))
pop model probability of profit, on [0, 1]
edge (expected P/L - round trip friction) / premium,
clamped to [-1, 1] and mapped onto [0, 1]
rr min(reward:risk, 3) / 3; unbounded gain scores 1.000
es |expected shortfall| / worst case, capped at 1.000
then + 5 or - 5 for a volatility view, credit families
favoured on crush and debit families on expand
x 0.75 when the friction verdict is thin
clamped to [0, 100]
premium is floored at 0.05 so quote noise cannot inflate edgeThree horizons, not one, and they are not reconciled: the model figures settle at the 2026-11-15 expiry, 30.0 days away; no simulation is on disk, so that column is empty; no backtest is on disk, so those columns are empty.
The volatility view is neutral, because nothing on disk states one, so the tilt is +0.0 on every row. Under a crush view every credit structure gains 5 points and every debit structure loses 5; under expand the two swap.
| rank | structure | score | pop | edge | rr | es | shortfall | worst case | adjust | friction | model P(profit) | model P/L | sim P(profit) | sim mean | history trades | history win rate | history mean on risk | views |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | cash secured put | 72.9 | 0.977 | 0.957 | 0.011 | 0.025 | -2.14 | -87.20 | +0.0, x1.00 | ok | 97.7% | 2.64 | n/a | n/a | n/a | n/a | n/a | one view only |
| 2 | jade lizard | 67.2 | 0.883 | 0.852 | 0.014 | 0.014 | -1.24 | -86.30 | +0.0, x1.00 | ok | 88.3% | 2.84 | n/a | n/a | n/a | n/a | n/a | one view only |
| 3 | bear put spread | 50.7 | 0.460 | 0.935 | 1.000 | 0.950 | -0.86 | -0.90 | +0.0, x0.75 | thin | 46.0% | 0.94 | n/a | n/a | n/a | n/a | n/a | one view only |
| 4 | bull call spread | 48.8 | 0.434 | 0.878 | 1.000 | 0.954 | -0.86 | -0.90 | +0.0, x0.75 | thin | 43.4% | 0.84 | n/a | n/a | n/a | n/a | n/a | one view only |
| 5 | straddle | 45.1 | 0.171 | 0.283 | 1.000 | 0.572 | -5.26 | -9.20 | +0.0, x1.00 | ok | 17.1% | -3.83 | n/a | n/a | n/a | n/a | n/a | one view only |
| 6 | long put | 43.6 | 0.253 | 0.283 | 1.000 | 0.831 | -3.82 | -4.60 | +0.0, x1.00 | ok | 25.3% | -1.91 | n/a | n/a | n/a | n/a | n/a | one view only |
| 7 | long call | 43.1 | 0.242 | 0.283 | 1.000 | 0.846 | -3.89 | -4.60 | +0.0, x1.00 | ok | 24.2% | -1.91 | n/a | n/a | n/a | n/a | n/a | one view only |
| 8 | bull put spread | 35.8 | 0.808 | 0.532 | 0.073 | 0.623 | -2.55 | -4.10 | +0.0, x0.75 | thin | 80.8% | 0.22 | n/a | n/a | n/a | n/a | n/a | one view only |
| 9 | bear call spread | 35.3 | 0.812 | 0.525 | 0.073 | 0.661 | -2.71 | -4.10 | +0.0, x0.75 | thin | 81.2% | 0.20 | n/a | n/a | n/a | n/a | n/a | one view only |
| 10 | iron condor | 34.4 | 0.688 | 0.528 | 0.188 | 0.691 | -2.21 | -3.20 | +0.0, x0.75 | thin | 68.8% | 0.42 | n/a | n/a | n/a | n/a | n/a | one view only |
| 11 | strangle | 32.7 | 0.065 | 0.110 | 1.000 | 0.837 | -6.19 | -7.40 | +0.0, x1.00 | ok | 6.5% | -5.61 | n/a | n/a | n/a | n/a | n/a | one view only |
| 12 | long call butterfly | 14.6 | 0.211 | 0.171 | 0.187 | 0.782 | -2.50 | -3.20 | +0.0, x0.75 | thin | 21.1% | -1.78 | n/a | n/a | n/a | n/a | n/a | one view only |
| 13 | iron butterfly | 10.7 | 0.211 | 0.000 | 0.187 | 0.782 | -2.50 | -3.20 | +0.0, x0.75 | thin | 21.1% | -1.78 | n/a | n/a | n/a | n/a | n/a | one view only |
1 of the structures compared here carry no score. They are listed rather than dropped: a structure left out of an ordering is part of what the ordering says.
What this number is not. It is not an edge estimate. Three of the four components come from the same lognormal model at a single at-the-money volatility, so they move together and the composite is far less independent than four terms suggest. The weights were chosen and written down, not fitted to anything, and a different set would reorder the table. The model, simulation and history columns measure different things over different horizons and are shown side by side for exactly that reason. Where they disagree the last column says so, and that disagreement is not resolved here.
Exposure a hedger would have to trade per one percent move, calls above the line and puts below. Walls are where that hedging concentrates.
Signs assume dealers are long calls and short puts against the public. That convention is often wrong for a single name, especially around events and in heavily retail-traded tickers, and the walls move with it. Exposure is per one percent move in the underlying.
Running total across strikes. Where it crosses zero is the level below which hedging amplifies moves rather than damping them.
Calls up, puts down. Where the contracts actually sit, before any assumption about who is on which side.
Total payout to option holders at each settlement price. The minimum is the conventional max pain level. It describes where open interest sits, not where price is going.
per contract GEX = gamma x OI x 100 x S^2 x 0.01
gamma x S x 0.01 is the delta change over a one percent move, per share;
x S turns shares into currency; x 100 x OI scales it to every open contract
sign calls +, puts - (dealers long calls and short puts against the public: the conventional
assumption, stated on the panel because it is regularly wrong for a single name)
per strike net_K = sum over the contracts listed at K of signed GEX
net sum over strikes; above zero read as dampening, below zero as amplifying
walls call wall = the strike with the largest call GEX; put wall = the strike with the most negative put GEX
cumulative C_K = running sum of net_K from the lowest listed strike upward, so extending the ladder
shifts the whole profile
flip the level where C_K crosses zero, interpolated between the two strikes that straddle it;
with several crossings the one nearest spot is the headline and the rest are in the artifact
max pain argmin over settlement P of sum over K [ OI_call(K) max(P - K, 0) + OI_put(K) max(K - P, 0) ] x 100
evaluated at each listed strike: a description of where open interest sits, not a forecast
ratios put/call OI = sum of put OI / sum of call OI over the contracts in the profile, which are those
carrying gamma, open interest and strike; put/call volume = sum of put volume / sum of call volume
over every option in the chain, a missing volume counted as zero
skipped a contract missing gamma, open interest or strike is counted apart by cause, never treated as zero,
and is out of the profile and the OI ratio aboveat the money the listed strike nearest spot, calls winning a tie; not an interpolated forward
wings the call and the put whose model delta is nearest 0.25, accepted only within 0.10 of it;
a chain that does not reach a wing reports the figure as absent rather than substituted
risk reversal RR = sigma(put 25d) - sigma(call 25d) positive: the downside is bid
butterfly BF = ( sigma(put 25d) + sigma(call 25d) ) / 2 - sigma(atm)
skew slope least-squares slope of sigma against (K / S - 1) x 100, calls only, over every call in the chain
that carries a volatility: the whole chain, not the ladder's band
expected move EM = S x sigma(atm) x sqrt(30 / 365) one standard deviation over the life of the expiry
range = [ max(S - EM, 0), S + EM ]: about 68 percent of outcomes under a lognormal
term the same figures per expiry on file, so the slope across tenors is visible
realised sigma(real) = sqrt( (1 / n) sum over t of r_t^2 x 252 ), r_t = ln(S_t / S_t-1), over the simulation's
history window of n returns: the simulation's own estimator, uncentred and divided by n, not the
backtest's centred sample variance with n - 1
premium gap gap = sigma(atm) - sigma(real) per expiry: a disagreement between forecast and past, not an edgeImplied volatility by strike with the 25-delta wings marked. The gap between them is the risk reversal, and its sign says which side of the market is bid.
dV/dS per 1.0 of underlying
delta change per 1.0 of underlying
per 1.00 of volatility
value change per calendar day
d2V/dS dsigma
delta change per calendar day
Contracts traded today, calls up and puts down, across the whole chain rather than the graded band. Open interest is where positions sit; volume is where they moved.
Profit above the zero line, loss below. Spot dotted, breakevens dashed, expected move shaded. Premiums are mid quotes, so this is the structure's shape and not a fill.
| leg | strike | qty | price | bid | ask | iv | open int |
|---|
payoff P(S_T) = sum over legs of side x qty x ( value(S_T) - premium )
call value max(S_T - K, 0); put value max(K - S_T, 0); underlying S_T - entry price
side is +1 long, -1 short; premiums are snapshot mids, so this is a shape and not a fill
breakevens every settlement price where P(S_T) = 0, one per sign change of the piecewise-linear payoff
extremes max gain and max loss over all S_T; "unlimited" only on the upside, where the slope beyond the
last strike does not vanish; the downside is bounded by S_T = 0 and is evaluated there
capital capital at risk = |max loss| for a defined-risk structure; undefined where the loss is unbounded,
and such a structure is listed but not ranked
reward:risk max gain / |max loss|
P(profit) the lognormal mass of the profitable regions between breakevens, under
ln(S_T) ~ Normal( ln(S) + (mu - sigma^2 / 2) T, sigma^2 T ), mu = 0, T = days / 365
with sigma = one at-the-money implied volatility for every strike: a model estimate, not a win rate
expected P/L E[ P(S_T) ] under the same law, in closed form region by region, the regions cut at every strike
and every breakeven, because P is linear in S_T between strikes and the partial expectation of a
lognormal is analytic
shortfall expected loss = E[ P(S_T) | P(S_T) < 0 ], the same way
ranking expected return on risk = E[P] / capital at risk; the comparison orders on it, ties broken on P(profit)
friction half spread = (ask - bid) / 2 per option leg; entry = qty x half spread x 0.5
round trip = 2 x entry + commission; verdict ok below 10% of the net premium, thin up to 25%,
untradeable above that, where a leg quotes wider than 40% of its own mid, or where a leg has no bidTheta, charm, veta and color are per calendar day. Vega is per 1.00 of volatility, so divide by 100 for the per-point figure. Contracts with no usable implied volatility are not here: they were skipped, not estimated.
| strike | type | iv | price | delta | gamma | vega | theta | rho | vanna | vomma | charm | speed | zomma | color |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 85 | call | 0.2725 | 15.3227 | 0.984669 | 0.00493928 | 1.10626 | -0.014136 | 6.83377 | -0.295006 | 18.2805 | 0.00128569 | -0.00141594 | 0.0634934 | -0.00027339 |
| 90 | call | 0.26 | 10.523 | 0.932524 | 0.01751 | 3.74185 | -0.0252809 | 6.79968 | -0.712992 | 30.5562 | 0.00289774 | -0.00368664 | 0.0756413 | -0.000289296 |
| 95 | call | 0.2475 | 6.18745 | 0.789504 | 0.0406732 | 8.27394 | -0.042104 | 5.98051 | -0.855594 | 19.7386 | 0.00308359 | -0.00501941 | -0.0673049 | 0.000328183 |
| 100 | call | 0.235 | 2.85016 | 0.532869 | 0.0590134 | 11.3985 | -0.0501714 | 4.14549 | -0.0255679 | 0.060462 | -0.000546581 | -0.00131264 | -0.250808 | 0.000990248 |
| 105 | call | 0.2475 | 1.14385 | 0.272324 | 0.0467982 | 9.51991 | -0.0421286 | 2.14426 | 0.907977 | 15.7695 | -0.00425826 | 0.00352749 | -0.111564 | 0.000416414 |
| 110 | call | 0.26 | 0.407552 | 0.1156 | 0.0261366 | 5.58536 | -0.0254254 | 0.916639 | 0.952988 | 32.7111 | -0.00441604 | 0.00393676 | 0.0525456 | -0.000273705 |
| 115 | call | 0.2725 | 0.136239 | 0.0438324 | 0.0118787 | 2.66049 | -0.0125485 | 0.349069 | 0.608213 | 29.7796 | -0.00289248 | 0.002478 | 0.0893695 | -0.000434344 |
| 85 | put | 0.2725 | 0.0436899 | -0.015331 | 0.00493928 | 1.10626 | -0.00485148 | -0.129599 | -0.295006 | 18.2805 | 0.00128569 | -0.00141594 | 0.0634934 | -0.00027339 |
| 90 | put | 0.26 | 0.227631 | -0.0674757 | 0.01751 | 3.74185 | -0.0154503 | -0.573304 | -0.712992 | 30.5562 | 0.00289774 | -0.00368664 | 0.0756413 | -0.000289296 |
| 95 | put | 0.2475 | 0.875635 | -0.210496 | 0.0406732 | 8.27394 | -0.0317272 | -1.80208 | -0.855594 | 19.7386 | 0.00308359 | -0.00501941 | -0.0673049 | 0.000328183 |
| 100 | put | 0.235 | 2.52193 | -0.467131 | 0.0590134 | 11.3985 | -0.0392484 | -4.04671 | -0.0255679 | 0.060462 | -0.000546581 | -0.00131264 | -0.250808 | 0.000990248 |
| 105 | put | 0.2475 | 5.79921 | -0.727676 | 0.0467982 | 9.51991 | -0.0306596 | -6.45755 | 0.907977 | 15.7695 | -0.00425826 | 0.00352749 | -0.111564 | 0.000416414 |
| 110 | put | 0.26 | 10.0465 | -0.8844 | 0.0261366 | 5.58536 | -0.0134102 | -8.09478 | 0.952988 | 32.7111 | -0.00441604 | 0.00393676 | 0.0525456 | -0.000273705 |
| 115 | put | 0.2725 | 14.7588 | -0.956168 | 0.0118787 | 2.66049 | 1.28728e-05 | -9.07196 | 0.608213 | 29.7796 | -0.00289248 | 0.002478 | 0.0893695 | -0.000434344 |
model Black-Scholes-Merton, European exercise, continuous carry q
T = calendar days to expiry / 365
d1 = [ ln(S / K) + (r - q + sigma^2 / 2) T ] / ( sigma sqrt(T) )
d2 = d1 - sigma sqrt(T)
call = S exp(-qT) N(d1) - K exp(-rT) N(d2)
put = K exp(-rT) N(-d2) - S exp(-qT) N(-d1)
carry r and q are read from the chain snapshot (this chain: r = 0.0400, q = 0.0000); the engine defaults are r = 0.04, q = 0
implied sigma solves model(S, K, T, sigma) = mid, with mid = (bid + ask) / 2 where both sides are quoted
and the last trade standing in for mid where a side is missing, counted apart as a last-trade mark;
a user-supplied chain that carries its own volatility column keeps it as given and is never re-solved
Newton-Raphson from a fixed seed, bisection on [0.001, 5] when Newton leaves the bracket
a root is accepted only where the price is sensitive to volatility, vega > 0.0002;
otherwise the contract keeps the provider's figure and is counted as a fallback,
or carries no volatility at all and is skipped, never estimated
greeks analytic, first to third order, each checked against a central finite difference
of the price function in the test suite
delta = dV/dS gamma = d2V/dS2 vega = dV/dsigma, per 1.00
theta = dV per calendar day rho = dV/dr, per 1.00 lambda = delta S / V
vanna = d2V/dS dsigma vomma = d2V/dsigma2 charm = d delta per calendar day
veta = d vega per day speed = d3V/dS3 zomma = d gamma / dsigma
color = d gamma per day ultima = d3V/dsigma3 dual delta = dV/dK, dual gamma = d2V/dK2
the four per-day figures are the change as one calendar day passes, so a negative theta is decayThe same payoff curves drawn together, so the shapes can be compared directly rather than one at a time. Drag to zoom.
Each structure placed by model probability of profit and expected return on capital at risk, sized by that capital. Red is a structure friction calls untradeable. The dashed line is zero expectation: below it the model expects a loss.
Each structure with two short strikes, placed by how far apart those shorts are and by its expected return on capital at risk. Size is the capital at risk, colour is the model probability of profit. The dashed line is zero expectation. A butterfly sits at zero width: it is a condor whose shorts have been pulled together.
This is not a search across the chain. Nothing on disk enumerates the condors a chain admits, and the engine's playbook builds exactly one condor per expiry, at the edges of the expected-move band, so the alternatives it did not build were never priced and are not here. What is plotted is the 3 structures that exist as artifacts, across 2026-11-15: iron_butterfly, iron_condor, jade_lizard. Widths and wing distances are measured off each plan's own legs; the scores are that expiry's own comparison artifact, so no structure is ranked against another expiry's ordering. Adding an expiry adds points.
This page renders artifacts on disk. To add an underlying or an expiry, run the commands below and refresh. Any agent connected to the MCP server can run them for you.
optiondesk expiries QQQ # what is listed optiondesk chain QQQ --expiry 2026-09-18 optiondesk greeks --band 0.06 optiondesk exposure optiondesk compare # every structure, ranked optiondesk simulate QQQ --horizon 14 optiondesk backtest QQQ iron_condor --period 5y optiondesk expiries # what you already have
Currently showing SYNTH. Each command writes one schema-validated artifact into the artifact directory.