SYNTHETIC SAMPLE DATA / NOT CURRENT. Not current market data. Not investment advice. Do not use for trading, orders, or financial decisions.This page is the original Option Desk dashboard over a synthetic fixture. Upload data only when you have the right to send it for private analysis.

Option desk

SYNTHspot 100.00 · 2026-11-15 (30.0 days) · synthetic-demo
clean · generated 2026-10-16T20:21:49+00:00 · greeks_SYNTH_2026-11-15.json
underlyingSYNTH
on diskchain, comparison, exposure, greeks, 14 strategy plans

The pipeline

How this page was built

Two inputs, then one command per box and one artifact per command, with the arithmetic of each printed in the section that shows it.

a saved planeach plan on every pathProvider or your filequotes, open interest, closesdelayed and third party, or user suppliedchainchain_SYM_EXPIRY.jsonmid quotes; sigma solves BSM = midgreeksgreeks_SYM_EXPIRY.jsonsixteen analytic Greeks per contractexposureexposure_SYM_EXPIRY.jsonGEX, walls, flip, max pain, smilestrategystrategy_SYM_NAME_EXPIRY.jsonlegs, payoff, P(profit), frictioncomparecomparison_SYM_EXPIRY.jsonranked by E[P/L] / capital at riskforwardforward_ledger.jsonpaper positions marked at midDaily closesthe underlying's own historyr_t = ln(S_t / S_t-1)simulatesimulation_SYM_Nd.jsonGARCH-t posterior, fan, VaR, ESbacktestbacktest_SYM_STRAT_Nd.jsonmodelled premiums, block tests

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.

Structure comparison

Every structure, side by side

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%.

rankstructuretypenetmax gainmax losscapital at riskreward:riskP(profit)expected P/Lreturn on riskdeltathetavegafriction
1bear put spreaddebit-0.904.10-0.900.904.5646.0%0.94104.8%-0.257-0.0083.12thin
2bull call spreaddebit-0.904.10-0.900.904.5643.4%0.8493.4%0.261-0.0081.88thin
3iron condorcredit1.801.80-3.203.200.5668.8%0.4213.2%-0.0140.033-8.47thin
4bull put spreadcredit0.900.90-4.104.100.2280.8%0.225.3%0.1430.016-4.53thin
5bear call spreadcredit0.900.90-4.104.100.2281.2%0.205.0%-0.1570.017-3.93thin
6jade lizardcredit3.703.70-86.3086.300.0488.3%2.843.3%-0.0890.032-7.68ok
7cash secured putcredit2.802.80-87.2087.200.0397.7%2.643.0%0.0670.015-3.74ok
8long calldebit-4.60unlimited-4.604.60n/a24.2%-1.91-41.6%0.533-0.05011.40ok
9straddledebit-9.20unlimited-9.209.20n/a17.1%-3.83-41.6%0.066-0.08922.80ok
10long putdebit-4.6095.40-4.604.6020.7425.3%-1.91-41.6%-0.467-0.03911.40ok
11iron butterflycredit1.801.80-3.203.200.5621.1%-1.78-55.7%-0.0040.016-5.00thin
12long call butterflydebit-3.201.80-3.203.200.5621.1%-1.78-55.7%-0.0040.016-5.00thin
13strangledebit-7.40unlimited-7.407.40n/a6.5%-5.61-75.8%0.062-0.07417.79ok
ratio spreadcredit1.0011.00unlimitedn/an/a99.8%3.19n/a0.3020.0010.23thin

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.

Composite support

Which structure has the most support under one printed formula

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 edge

Three 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.

rankstructurescorepopedgerresshortfallworst caseadjustfrictionmodel P(profit)model P/Lsim P(profit)sim meanhistory tradeshistory win ratehistory mean on riskviews
1cash secured put72.90.9770.9570.0110.025-2.14-87.20+0.0, x1.00ok97.7%2.64n/an/an/an/an/aone view only
2jade lizard67.20.8830.8520.0140.014-1.24-86.30+0.0, x1.00ok88.3%2.84n/an/an/an/an/aone view only
3bear put spread50.70.4600.9351.0000.950-0.86-0.90+0.0, x0.75thin46.0%0.94n/an/an/an/an/aone view only
4bull call spread48.80.4340.8781.0000.954-0.86-0.90+0.0, x0.75thin43.4%0.84n/an/an/an/an/aone view only
5straddle45.10.1710.2831.0000.572-5.26-9.20+0.0, x1.00ok17.1%-3.83n/an/an/an/an/aone view only
6long put43.60.2530.2831.0000.831-3.82-4.60+0.0, x1.00ok25.3%-1.91n/an/an/an/an/aone view only
7long call43.10.2420.2831.0000.846-3.89-4.60+0.0, x1.00ok24.2%-1.91n/an/an/an/an/aone view only
8bull put spread35.80.8080.5320.0730.623-2.55-4.10+0.0, x0.75thin80.8%0.22n/an/an/an/an/aone view only
9bear call spread35.30.8120.5250.0730.661-2.71-4.10+0.0, x0.75thin81.2%0.20n/an/an/an/an/aone view only
10iron condor34.40.6880.5280.1880.691-2.21-3.20+0.0, x0.75thin68.8%0.42n/an/an/an/an/aone view only
11strangle32.70.0650.1101.0000.837-6.19-7.40+0.0, x1.00ok6.5%-5.61n/an/an/an/an/aone view only
12long call butterfly14.60.2110.1710.1870.782-2.50-3.20+0.0, x0.75thin21.1%-1.78n/an/an/an/an/aone view only
13iron butterfly10.70.2110.0000.1870.782-2.50-3.20+0.0, x0.75thin21.1%-1.78n/an/an/an/an/aone 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.

Positioning

Net gamma exposure
0.00
per 1% move
Hedging regime
amplifying
dampening or amplifying
Gamma flip
n/a
cumulative crosses zero
Call wall
100.00
767.2k
Put wall
100.00
-767.2k
Max pain
100.00
least payout
Put / call OI
1.00
open interest
Put / call volume
1.00
today

Dealer gamma exposure by strike

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.

Cumulative exposure and the flip

Running total across strikes. Where it crosses zero is the level below which hedging amplifies moves rather than damping them.

Open interest

Calls up, puts down. Where the contracts actually sit, before any assumption about who is on which side.

Max pain profile

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.

The maths
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 above

Volatility

At-the-money IV
23.50%
strike 100.00
25-delta risk reversal
0.00%
put minus call
25-delta butterfly
1.25%
wings minus body
Skew slope
-0.0000
iv per 1% of strike
Expected move
6.74
one standard deviation
Expected range
93.26 to 106.74
68% of outcomes
The maths
at 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 edge

The smile

Implied 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.

Delta

dV/dS per 1.0 of underlying

Gamma

delta change per 1.0 of underlying

Vega

per 1.00 of volatility

Theta

value change per calendar day

Vanna

d2V/dS dsigma

Charm

delta change per calendar day

Volume by strike

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.

Structures

Payoff at expiry

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.

legstrikeqtypricebidaskivopen int
The maths
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 bid

The ladder

14 graded contracts

Theta, 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.

striketypeivpricedeltagammavegathetarhovannavommacharmspeedzommacolor
85call0.272515.32270.9846690.004939281.10626-0.0141366.83377-0.29500618.28050.00128569-0.001415940.0634934-0.00027339
90call0.2610.5230.9325240.017513.74185-0.02528096.79968-0.71299230.55620.00289774-0.003686640.0756413-0.000289296
95call0.24756.187450.7895040.04067328.27394-0.0421045.98051-0.85559419.73860.00308359-0.00501941-0.06730490.000328183
100call0.2352.850160.5328690.059013411.3985-0.05017144.14549-0.02556790.060462-0.000546581-0.00131264-0.2508080.000990248
105call0.24751.143850.2723240.04679829.51991-0.04212862.144260.90797715.7695-0.004258260.00352749-0.1115640.000416414
110call0.260.4075520.11560.02613665.58536-0.02542540.9166390.95298832.7111-0.004416040.003936760.0525456-0.000273705
115call0.27250.1362390.04383240.01187872.66049-0.01254850.3490690.60821329.7796-0.002892480.0024780.0893695-0.000434344
85put0.27250.0436899-0.0153310.004939281.10626-0.00485148-0.129599-0.29500618.28050.00128569-0.001415940.0634934-0.00027339
90put0.260.227631-0.06747570.017513.74185-0.0154503-0.573304-0.71299230.55620.00289774-0.003686640.0756413-0.000289296
95put0.24750.875635-0.2104960.04067328.27394-0.0317272-1.80208-0.85559419.73860.00308359-0.00501941-0.06730490.000328183
100put0.2352.52193-0.4671310.059013411.3985-0.0392484-4.04671-0.02556790.060462-0.000546581-0.00131264-0.2508080.000990248
105put0.24755.79921-0.7276760.04679829.51991-0.0306596-6.457550.90797715.7695-0.004258260.00352749-0.1115640.000416414
110put0.2610.0465-0.88440.02613665.58536-0.0134102-8.094780.95298832.7111-0.004416040.003936760.0525456-0.000273705
115put0.272514.7588-0.9561680.01187872.660491.28728e-05-9.071960.60821329.7796-0.002892480.0024780.0893695-0.000434344
The maths
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 decay

Every structure on one axis

The same payoff curves drawn together, so the shapes can be compared directly rather than one at a time. Drag to zoom.

Probability against expected return

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.

Condor search

Every condor on file, by the distance between its shorts

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.

Adding data

Analysing something else

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.