● END OF DAY
SPXcurrent: every source’s date
SPX2026-10-28 VIX2026-10-28 LABELS2026-10-28 FIT2026-10-28 GREEKS2026-10-28 SURFACE2026-10-28 BACKTEST≤2025-03-24 MODELv2 BUILD088fc8d VIEWas of 2026-10-28
SPX7,743.98▲ +0.28% VIX16.91▼ −0.61 VVIX96.61▼ −2.84 9D→6M+5.64contango VIX/VIX3M0.880 RV219.69 VIX−RV21+7.22 VIX 1Y PCTL46th (percentile among the 252 sessions before 2026-10-28) RULER1short gamma2026-10-28 1M ATMF13.40%RR25−4.312026-10-28

SPX implied-volatility surface

Market quotes against the models, measured in the unit a market maker uses: half the bid–ask spread. A model inside the spread is as good as the quote.

Session 2026-10-28·17 expiries·3,343 quotes·models: eSSVI, SVI, SVI-cal, Heston
Chain: Yahoo Finance download·fetched 2026-10-29 07:32 UTC·Yahoo reports no quote times·T measured from the fetch·6,308 rows → 3,343 scored·17 expiries (other stored sessions 17–43)
1M ATMF
13.40%
8 sessions: 12.51–25.79
SVI-cal at 30 days, between 2026-11-27 and 2026-11-30
1M RR25
−4.31vol pts
8 sessions: −9.62 to −3.48
25Δ call − 25Δ put; negative: puts over calls
1M BF25
+0.66vol pts
8 sessions: 0.42–0.84
mean of the 25Δ wings − ATMF
1M VS − ATMF
+3.69vol pts
8 sessions: 2.19–5.18
VS 17.09% (the bracketing strips at 30 days) over ATMF: the skew premium · VIX replicated 17.19 · Cboe close 16.91
ATMF slope 1M → 1Y
+3.24vol pts
8 sessions: −4.15 to +4.76
1Y 16.64% − 1M 13.40%
SVI · median |z|
1.41half-spreads
8 sessions: 0.41–1.60 (out of sample)
33.7% inside the bid–ask · RMSE 0.57 vol pts · 1,689 out-of-sample quotes
SVI-cal · median |z|
1.60half-spreads
8 sessions: 0.45–1.98 (out of sample)
31.1% inside the bid–ask · RMSE 0.58 vol pts · 1,689 out-of-sample quotes
eSSVI · median |z|
6.72half-spreads
8 sessions: 1.24–7.66 (out of sample)
10.5% inside the bid–ask · RMSE 1.25 vol pts · 1,689 out-of-sample quotes
Heston · median |z|
14.78half-spreads
8 sessions: 4.42–17.21 (out of sample)
3.1% inside the bid–ask · RMSE 1.40 vol pts · 3,290 out-of-sample quotes
VIX from this chain
17.19
gap, 7 sessions: −0.78 to +0.28
Cboe close 16.91 · gap +0.28 · inside the day’s VIX range 16.21–17.77
Quotes failing static arbitrage at bid/ask
106quotes
of 3,343 quotes sit in a constraint row violated at bid/ask; 2,292 at mids. Yahoo Finance download, fetched 2026-10-29 07:32 UTC, Yahoo reports no quote times, T measured from the fetch; 25 of the 25 largest rows from single-quote outliers.

Surface in desk coordinates · delta pillars, RR / BF, skew and var-swap

SVI-cal · 2026-10-28
Listed expiries, 2026-10-28: undiscounted forward delta on the slice’s own vol (not premium-adjusted); ATMF = ln(K/F) = 0; RR = call − put (negative = puts over calls); BF = (call + put)/2 − ATMF; values of the fitted SVI-cal surface, not raw quotes
ExpiryT (d)F10ΔP25ΔPATMF25ΔC10ΔCRR25BF25RR10BF10ATM skewVS volVS − ATMFMedian half-spreadQuotes
2026-11-10137,734.1118.6815.2813.1511.8511.16−3.43+0.41−7.52+1.76−10.0415.53+2.380.07144
2026-11-11147,734.2219.1715.5313.3011.9411.24−3.59+0.44−7.93+1.91−9.9915.87+2.570.07141
2026-11-12157,734.9819.6415.7713.4412.0611.38−3.71+0.47−8.26+2.07−9.8416.18+2.740.06128
2026-11-25287,742.5421.6116.5213.6912.1611.58−4.35+0.65−10.03+2.91−8.1717.33+3.640.0691
2026-11-27307,744.9621.3416.2613.4411.9311.37−4.33+0.65−9.98+2.91−7.9817.13+3.690.05157
2026-11-30337,745.7421.0615.9713.2011.7411.22−4.23+0.66−9.84+2.94−7.5516.89+3.690.06416
2026-12-18517,758.4123.3617.4014.2012.5211.93−4.88+0.76−11.43+3.45−6.5218.61+4.410.04180
2026-12-31647,770.1923.6017.3914.1012.3911.79−5.00+0.79−11.81+3.60−6.0018.82+4.720.05447
2027-01-15797,787.3824.0617.6514.2612.4711.83−5.18+0.80−12.23+3.68−5.5419.14+4.880.03134
2027-01-29937,798.7324.4517.9614.4212.5611.93−5.40+0.84−12.53+3.77−5.3019.41+4.990.03269
2027-02-191147,814.1824.8218.2214.6612.7612.12−5.45+0.83−12.70+3.81−4.7819.71+5.050.0449
2027-03-311547,843.6225.4418.8815.1313.0412.31−5.84+0.83−13.14+3.74−4.3520.39+5.260.04410
2027-04-161697,860.8225.7319.1215.2813.1512.47−5.96+0.86−13.26+3.82−4.2221.14+5.860.04120
2027-05-212047,891.8726.1119.5915.6613.4012.66−6.20+0.83−13.44+3.72−3.9621.63+5.960.04130
2027-09-303378,010.6426.3720.4716.4913.9213.25−6.55+0.70−13.12+3.32−3.3021.02+4.530.03287
2027-10-153518,027.8726.4420.5216.5713.9713.24−6.56+0.68−13.20+3.27−3.2221.89+5.320.04140
2027-11-193868,060.2026.3820.6516.7314.1113.45−6.54+0.64−12.93+3.19−3.0821.96+5.230.07100

Vols and VS vol in %; RR, BF, VS − ATMF and median half-spread in vol pts; ATM skew = ∂σ/∂ln(K/F) at the forward, in vol pts per 0.1 of ln-moneyness. Every pillar of this session lies inside its expiry’s quoted ln(K/F) range: no wing is extrapolated. VS vol is the Cboe-formula variance-swap vol of the same expiry’s quotes (the strip below); at constant maturity, the two bracketing strips’ VS interpolated in total variance, with each strip’s strike count (puts + calls) under the tenor; VS − ATMF is taken against this grid’s ATMF, not the strip’s quote ATM.

Cited on: Calibration

Against an earlier session · constant maturity

7 earlier sessions
vs 2026-10-27, 1 NYSE session earlier: the SVI-cal surface at constant maturity, each cell 2026-10-27 → 2026-10-28 (ATMF in %; RR, BF and Δ in vol pts); Δ = 2026-10-28 − 2026-10-27
TenorATMFΔ ATMFRR25Δ RR25BF25Δ BF25
1M13.74 → 13.40−0.34−4.38 → −4.31+0.07+0.67 → +0.66−0.01
2M14.29 → 14.11−0.17−5.00 → −4.98+0.02+0.79 → +0.790.00
3M14.55 → 14.41−0.15−5.38 → −5.380.00+0.83 → +0.830.00
6M15.53 → 15.44−0.09−6.06 → −6.060.00+0.84 → +0.840.00
1Y16.70 → 16.64−0.06−6.56 → −6.55+0.01+0.65 → +0.66+0.01

25Δ risk reversal by expiry, every stored session

RR25 = 25Δ call vol − 25Δ put vol of the SVI-cal surface per listed expiry: 2026-10-28 solid, the other stored sessions grey, the session chosen on the comparison tabs dashed. A wing extrapolated beyond the quoted strikes leaves a gap.

RR25 (vol pts) per listed expiry and stored session, SVI-cal surface
SessionExpiryT (d)RR25
2026-03-242026-03-317−8.07
2026-03-242026-04-018−8.52
2026-03-242026-04-029−8.65
2026-03-242026-04-0613−8.46
2026-03-242026-04-0714−8.66
2026-03-242026-04-0815−8.95
2026-03-242026-04-0916−9.07
2026-03-242026-04-1017−9.15
2026-03-242026-04-1320−8.95
2026-03-242026-04-1421−9.22
2026-03-242026-04-1522−9.32
2026-03-242026-04-1623−9.50
2026-03-242026-04-1724−9.78
2026-03-242026-04-2027−9.47
2026-03-242026-04-2128−9.52
2026-03-242026-04-2229−9.60
2026-03-242026-04-2330−9.62
2026-03-242026-04-2431−9.77
2026-03-242026-04-2734−9.57
2026-03-242026-04-2835−9.58
2026-03-242026-04-3037−9.40
2026-03-242026-05-0138−9.56
2026-03-242026-05-0845−9.57
2026-03-242026-05-1552−9.57
2026-03-242026-05-2966−9.79
2026-03-242026-06-1886−9.78
2026-03-242026-06-3098−9.77
2026-03-242026-07-17115−9.80
2026-03-242026-07-31129−9.79
2026-03-242026-08-21150−9.67
2026-03-242026-08-31160−9.60
2026-03-242026-09-18178−9.62
2026-03-242026-09-30190−9.55
2026-03-242026-10-16206−9.51
2026-03-242026-11-20241−9.40
2026-03-242026-12-18269−9.28
2026-03-242026-12-31282−9.21
2026-03-242027-01-15297−9.15
2026-03-242027-02-19332−9.04
2026-03-242027-03-19360−8.98
2026-03-242027-04-16388−8.86
2026-03-242027-06-17450−8.67
2026-03-242027-12-17633−8.29
2026-03-272026-04-0610−4.78
2026-03-272026-04-0711−5.53
2026-03-272026-04-0812−6.28
2026-03-272026-04-0913−6.66
2026-03-272026-04-1014−7.22
2026-03-272026-04-1317−7.54
2026-03-272026-04-1418−8.11
2026-03-272026-04-1519−8.21
2026-03-272026-04-1620−8.48
2026-03-272026-04-1721−8.64
2026-03-272026-04-2024−8.42
2026-03-272026-04-2125−8.72
2026-03-272026-04-2226−8.95
2026-03-272026-04-2327−8.88
2026-03-272026-04-2428−9.35
2026-03-272026-04-2731−9.38
2026-03-272026-04-2832−9.58
2026-03-272026-04-3034−9.59
2026-03-272026-05-0135−9.91
2026-03-272026-05-0842−10.04
2026-03-272026-05-1549−10.22
2026-03-272026-05-2963−10.24
2026-03-272026-06-1883−10.37
2026-03-272026-06-3095−10.51
2026-03-272026-07-17112−10.56
2026-03-272026-07-31126−10.49
2026-03-272026-08-21147−10.44
2026-03-272026-08-31157−10.27
2026-03-272026-09-18175−10.27
2026-03-272026-09-30187−10.15
2026-03-272026-10-16203−10.07
2026-03-272026-11-20238−9.81
2026-03-272026-12-18266−9.64
2026-03-272026-12-31279−9.54
2026-03-272027-01-15294−9.47
2026-03-272027-02-19329−9.33
2026-03-272027-03-19357−9.23
2026-03-272027-04-16385−9.16
2026-03-272027-06-17447−8.95
2026-03-272027-12-17630−8.51
2026-05-292026-06-057−2.49
2026-05-292026-06-0810−2.47
2026-05-292026-06-0911−2.56
2026-05-292026-06-1012−2.71
2026-05-292026-06-1113−2.81
2026-05-292026-06-1214−2.92
2026-05-292026-06-1517−2.91
2026-05-292026-06-1618−2.98
2026-05-292026-06-1719−3.19
2026-05-292026-06-1820−3.21
2026-05-292026-06-2224−3.27
2026-05-292026-06-2325−3.30
2026-05-292026-06-2426−3.38
2026-05-292026-06-2527−3.43
2026-05-292026-06-2628−3.47
2026-05-292026-06-2931−3.48
2026-05-292026-06-3032−3.51
2026-05-292026-07-0133−3.63
2026-05-292026-07-0234−3.63
2026-05-292026-07-1042−3.76
2026-05-292026-07-1749−3.89
2026-05-292026-07-2456−4.07
2026-05-292026-07-3163−4.17
2026-05-292026-08-2184−4.50
2026-05-292026-08-3194−4.59
2026-05-292026-09-18112−4.93
2026-05-292026-09-30124−5.09
2026-05-292026-10-16140−5.30
2026-05-292026-10-30154−5.52
2026-05-292026-11-20175−5.71
2026-05-292026-12-18203−5.98
2026-05-292026-12-31216−6.04
2026-05-292027-01-15231−6.08
2026-05-292027-02-19266−6.27
2026-05-292027-03-19294−6.40
2026-05-292027-03-31306−6.44
2026-05-292027-04-16322−6.52
2026-05-292027-05-21357−6.63
2026-05-292027-06-17384−6.65
2026-05-292027-09-17476−6.73
2026-05-292027-12-17567−6.75
2026-06-182026-06-257−3.18
2026-06-182026-06-268−3.37
2026-06-182026-06-2911−3.44
2026-06-182026-06-3012−3.48
2026-06-182026-07-0113−3.59
2026-06-182026-07-0214−3.68
2026-06-182026-07-0618−3.53
2026-06-182026-07-0719−3.65
2026-06-182026-07-0820−3.71
2026-06-182026-07-0921−3.74
2026-06-182026-07-1022−3.88
2026-06-182026-07-1325−3.87
2026-06-182026-07-1426−3.99
2026-06-182026-07-1527−4.00
2026-06-182026-07-1628−4.16
2026-06-182026-07-1729−3.82
2026-06-182026-07-2032−3.97
2026-06-182026-07-2133−4.10
2026-06-182026-07-2234−4.15
2026-06-182026-07-2335−4.13
2026-06-182026-07-2436−4.30
2026-06-182026-07-3143−4.41
2026-06-182026-08-0750−4.61
2026-06-182026-08-1457−4.71
2026-06-182026-08-2164−4.73
2026-06-182026-08-3174−4.90
2026-06-182026-09-1892−5.25
2026-06-182026-09-30104−5.44
2026-06-182026-10-16120−5.69
2026-06-182026-10-30134−5.93
2026-06-182026-11-20155−6.05
2026-06-182026-11-30165−6.09
2026-06-182026-12-18183−6.27
2026-06-182026-12-31196−6.34
2026-06-182027-01-15211−6.41
2026-06-182027-02-19246−6.63
2026-06-182027-03-19274−6.74
2026-06-182027-03-31286−6.77
2026-06-182027-04-16302−6.87
2026-06-182027-05-21337−6.98
2026-06-182027-06-17364−6.98
2026-06-182027-09-17456−7.08
2026-06-182027-12-17547−7.03
2026-10-162026-10-2913−5.36
2026-10-162026-10-3014−5.44
2026-10-162026-11-0217−5.29
2026-10-162026-11-1328−5.99
2026-10-162026-11-1631−5.82
2026-10-162026-11-1732−5.85
2026-10-162026-12-0449−6.10
2026-10-162026-12-1863−6.20
2026-10-162026-12-3176−6.22
2026-10-162027-01-1591−6.12
2026-10-162027-01-29105−6.25
2026-10-162027-03-31166−6.32
2026-10-162027-04-16182−6.36
2026-10-162027-05-21217−6.50
2026-10-162027-09-30349−6.67
2026-10-162027-10-15364−6.67
2026-10-162027-12-17427−6.61
2026-10-262026-11-0611−3.97
2026-10-262026-11-0914−3.96
2026-10-262026-11-1015−4.12
2026-10-262026-11-2429−4.74
2026-10-262026-11-2530−4.81
2026-10-262026-11-2732−4.78
2026-10-262026-12-1853−5.27
2026-10-262026-12-3166−5.35
2026-10-262027-01-1581−5.46
2026-10-262027-01-2995−5.68
2026-10-262027-02-19116−5.70
2026-10-262027-03-31156−6.02
2026-10-262027-04-16171−6.14
2026-10-262027-05-21206−6.35
2026-10-262027-09-30339−6.67
2026-10-262027-10-15353−6.68
2026-10-262027-11-19388−6.66
2026-10-272026-11-0912−3.53
2026-10-272026-11-1013−3.70
2026-10-272026-11-1114−3.80
2026-10-272026-11-2427−4.32
2026-10-272026-11-2528−4.39
2026-10-272026-11-2730−4.37
2026-10-272026-12-1851−4.91
2026-10-272026-12-3164−5.02
2026-10-272027-01-1579−5.21
2026-10-272027-01-2993−5.41
2026-10-272027-02-19114−5.46
2026-10-272027-03-31154−5.84
2026-10-272027-04-16170−5.96
2026-10-272027-05-21205−6.23
2026-10-272027-09-30337−6.56
2026-10-272027-10-15352−6.57
2026-10-272027-11-19387−6.55
2026-10-282026-11-1013−3.43
2026-10-282026-11-1114−3.59
2026-10-282026-11-1215−3.71
2026-10-282026-11-2528−4.35
2026-10-282026-11-2730−4.33
2026-10-282026-11-3033−4.23
2026-10-282026-12-1851−4.88
2026-10-282026-12-3164−5.00
2026-10-282027-01-1579−5.18
2026-10-282027-01-2993−5.40
2026-10-282027-02-19114−5.45
2026-10-282027-03-31154−5.84
2026-10-282027-04-16169−5.96
2026-10-282027-05-21204−6.20
2026-10-282027-09-30337−6.55
2026-10-282027-10-15351−6.56
2026-10-282027-11-19386−6.54

SVI-cal surface, listed expiries; 2026-10-28 solid, the others grey, the session chosen under “Against an earlier session” dashed. A gap is a wing extrapolated beyond the quoted strikes.

The stored sessions are irregular (the surface report runs on sessions with a stored chain), so a change spans the gap shown, not a day. “—”: a session without that tenor among its listed expiries (never extrapolated), or an RR / BF with a wing beyond the quoted strikes. The tabs also set the dashed lines of the ATM and RR25 charts.

ATM term structure · quotes, eSSVI and SVI-cal

ATM implied vol per quoted expiry, from the mids at the parity forward and from the eSSVI and SVI-cal surfaces, and the forward ATM vol between the constant maturities 1M, 2M, 3M, 6M and 1Y as dotted steps; the dashed line is the SVI-cal ATM of the earlier session chosen on the comparison tabs, named with its date.

ATM term structure
ExpiryDaysATM mid (%)eSSVI ATM (%)eSSVI ATM skewParity rParity qQuotes
2026-11-101313.1512.86−1.2982.97%6.69%144
2026-11-111413.3012.98−1.2933.35%6.75%141
2026-11-121513.4313.09−1.2773.24%6.17%128
2026-11-252813.6413.37−1.1604.73%4.98%91
2026-11-273013.3913.15−1.0834.56%4.41%157
2026-11-303313.1612.83−1.1404.11%3.85%416
2026-12-185114.0913.80−0.8864.36%3.02%180
2026-12-316414.0313.77−0.8924.65%2.71%447
2027-01-157914.1913.88−0.7544.42%1.82%134
2027-01-299314.3914.18−0.7024.81%2.03%269
2027-02-1911414.6414.37−0.6484.78%1.87%49
2027-03-3115415.0814.85−0.5494.80%1.76%410
2027-04-1616915.2815.14−0.5264.78%1.55%120
2027-05-2120415.6615.61−0.4754.74%1.36%130
2027-09-3033716.5016.50−0.3484.90%1.23%287
2027-10-1535116.5716.59−0.3454.91%1.17%140
2027-11-1938616.7416.75−0.3194.93%1.15%100
SVI-cal ATM vol of 2026-10-27, the earlier session compared
ExpiryDaysATM (%)
2026-11-091213.48
2026-11-101313.81
2026-11-111413.89
2026-11-242713.88
2026-11-252813.95
2026-11-273013.68
2026-12-185114.38
2026-12-316414.26
2027-01-157914.43
2027-01-299314.58
2027-02-1911414.80
2027-03-3115415.24
2027-04-1617015.38
2027-05-2120515.77
2027-09-3033716.57
2027-10-1535216.64
2027-11-1938716.80

Forward ATM vol of the SVI-cal surface between its constant maturities, √((w₂ − w₁)/(T₂ − T₁)) with w = ATMF²·T (dotted steps): 1M → 2M 14.77% · 2M → 3M 14.98% · 3M → 6M 16.41% · 6M → 1Y 17.75%. Each pair spans at least 7 days, so no AM/PM pair of one date is a forward period.

Volatility cone · SPX realised vol by horizon, SVI-cal ATMF on it

windows ending 2026-10-28

Percentiles (5, 25, 50, 75, 95) of SPX close-to-close realised vol over windows of 10 to 252 sessions, in the sample the tab picks, ending 2026-10-28; the realised vol of the windows ending that day; and the SVI-cal ATMF of each listed expiry, its calendar days placed at days × 252/365 sessions.

Realised-vol cone of SPX (%), windows ending on or before 2026-10-28; RVh = 100·√(252/h·Σr²)
Sessions≈ daysSampleWindows5th pct25th pct50th pct75th pct95th pctRV ending 2026-10-28
1014Since 20104,2215.68.611.917.229.610.7
1014Last 3 years7426.49.111.414.723.010.7
2130Since 20104,2106.59.512.417.229.09.7
2130Last 3 years7317.710.012.014.021.39.7
4261Since 20104,1897.210.412.717.028.410.1
4261Last 3 years7109.311.012.014.235.310.1
6391Since 20104,1687.311.012.917.029.010.3
6391Last 3 years6899.911.112.514.730.510.3
126182Since 20104,1057.711.613.418.027.312.0
126182Last 3 years62610.911.713.414.424.012.0
252365Since 20103,9799.812.214.818.632.812.7
252365Last 3 years50012.312.816.618.819.612.7

Grey lines: the 5th, 25th, median, 75th and 95th percentiles of SPX realised vol RVh = 100·√(252/h · Σ r²) over every window of h = 10, 21, 42, 63, 126 and 252 sessions (close-to-close log returns, zero mean, the site’s RV21 convention), in the sample the tab picks: since 2010 2010-01-04 → 2026-10-28, last 3 years 2023-10-30 → 2026-10-28. Every sample ends on the surface’s session, so no later close enters. An expiry of T calendar days sits at T·252/365 sessions. The windows overlap (one per session), so neighbouring windows share most of their returns: at 252 sessions the last 3 years hold about three independent years. Since 2010 includes 2020; the last 3 years does not.

SVI-cal ATMF against the realised cone

16 listed expiries

The listed expiry nearest 30 days, 2026-11-27 (30 d), has an SVI-cal ATMF of 13.44% (the 1M tile’s 13.40% is the surface interpolated to exactly 30 days), above 57% of the 20-session RV windows since 2010 and 65% of those in the last 3 years. The 21-session cone since 2010 runs 6.5–29.0% (5th–95th percentile), median 12.4%; the 21 sessions to 2026-10-28 realised 9.7%.

SVI-cal ATMF of each listed expiry up to 252 sessions, 2026-10-28, and the share (%) of realised-vol windows of the same length (T·252/365 sessions, rounded) below it, since 2010 and in the last 3 years
ExpiryDaysSessionsATMF (%)Since 2010Last 3 y
2026-11-1013913.155763
2026-11-1114913.305865
2026-11-12151013.445867
2026-11-25281913.695867
2026-11-27302013.445765
2026-11-30332213.205563
2026-12-18513514.206274
2026-12-31644414.106275
2027-01-15795414.266271
2027-01-29936414.426171
2027-02-191147814.666275
2027-03-3115410615.136583
2027-04-1616911715.286581
2027-05-2120414115.666576
2027-09-3033723216.496456
2027-10-1535124316.576353

Implied vol carries the variance risk premium, so an ATMF above the realised median is the usual state, not by itself rich. Close-to-close RV leaves out intraday range (the database holds daily closes only). The ATMF is the SVI-cal slice at ln(K/F) = 0 of a listed expiry, not an interpolation; 1 listed expiry beyond 252 sessions is past the cone and left out.

Risk-neutral density · SVI-cal slices nearest 30, 91 and 182 days

Breeden–Litzenberger · 2026-10-28

Breeden–Litzenberger density of ln(S T/F) from each listed SVI-cal slice, p(k) = g(k)/√(2πw)·exp(−d₋²/2), drawn only inside the expiry's quoted strikes; risk-neutral, not a forecast.

Risk-neutral density of ln(ST/F) (per unit of ln-moneyness) at round ln(K/F); — outside the expiry's quoted strikes
ln(K/F)K/F2026-11-27 (30 d)2027-01-29 (93 d)2027-04-16 (169 d)
−0.300.7410.0290.1080.190
−0.250.7790.0470.1600.270
−0.200.8190.0840.2600.412
−0.150.8610.1830.4890.692
−0.100.9050.5551.1031.286
−0.050.9512.5772.8432.526
0.001.00011.7276.3564.455
+0.051.0514.1926.3835.200
+0.101.105—1.7143.046
+0.151.162—0.2190.949

Risk-neutral density of ln(ST/F) under each expiry’s T-forward measure, read off one butterfly-certified SVI-cal slice: p(k) = g(k)/√(2πw)·exp(−d₋²/2), with w(k) the slice’s total variance and g Durrleman’s function: the call price’s second strike derivative (Breeden–Litzenberger) in closed form. Each curve is a listed expiry (2026-11-27 (30 d, nearest 30 d); 2027-01-29 (93 d, nearest 91 d); 2027-04-16 (169 d, nearest 182 d)), not an interpolation, and is drawn only across its quoted strikes; beyond them the slice is the SVI linear wing, an extrapolation.

Risk-neutral tail probabilities by expiry

SVI-cal · 2026-10-28

P(S T < 0.80 F) and P(S T < 0.90 F), the downside tails, in one colour, and P(S T > 1.10 F), the upside tail, in another, of each listed SVI-cal slice; a gap is a threshold beyond the expiry's quoted strikes, where no probability is printed.

Risk-neutral tail probabilities (%) by listed expiry
ExpiryDaysP(ST < 0.80 F)P(ST < 0.90 F)P(ST > 1.10 F)
2026-11-10130.120.71beyond quoted strikes
2026-11-11140.150.86beyond quoted strikes
2026-11-12150.191.02beyond quoted strikes
2026-11-25280.622.67beyond quoted strikes
2026-11-27300.662.800.21
2026-11-30330.732.940.28
2026-12-18511.515.151.34
2026-12-31641.956.132.23
2027-01-15792.467.333.64
2027-01-29933.038.515.16
2027-02-191143.719.917.76
2027-03-311545.2112.6012.49
2027-04-161695.8113.4414.13
2027-05-212047.0815.3317.76
2027-09-3033711.2420.4726.80
2027-10-1535111.5920.8927.70
2027-11-1938612.5521.9529.18

Risk-neutral, not a forecast: these probabilities price claims and carry the market’s risk premia, so they are not real-world odds. A move is measured from each expiry’s parity forward F, not from spot. A gap is a threshold beyond the expiry’s quoted strikes (4 of 17 expiries quote no strike as high as 1.10 F): no probability is printed there.

Tail probabilities and distribution checks · every listed SVI-cal slice

17 expiries
Risk-neutral probabilities in % of each listed SVI-cal slice, 2026-10-28: P(ST < K) = N(−d₋) + φ(d₋)·w′/(2√w) at K = threshold × F, printed only when K lies inside the expiry’s quoted K/F range (“beyond quoted strikes” otherwise); mass below / above quoted = P(ST < lowest quoted strike) and P(ST > highest), in %; distribution check = max(|∫p − 1|, |E[ST/F] − 1|) over the whole line, wings included (0 for an exact distribution with mean F); gmin from the butterfly certificate
ExpiryDaysQuoted K/FST < 0.80 FST < 0.90 FOutside 0.95–1.05 FST > 1.10 FMass below quotedMass above quotedDistribution checkgmin
2026-11-10130.776–1.0540.120.714.81beyond quoted strikes0.090.392.2 × 10⁻¹⁶1.0 × 10⁻⁸
2026-11-11140.750–1.0570.150.865.55beyond quoted strikes0.090.370.00009.9 × 10⁻⁹
2026-11-12150.724–1.0630.191.026.36beyond quoted strikes0.080.262.2 × 10⁻¹⁶1.6 × 10⁻⁹
2026-11-25280.723–1.0850.622.6714.92beyond quoted strikes0.260.490.00000.0348
2026-11-27 nearest 30 d300.723–1.1040.662.8015.460.210.270.172.2 × 10⁻¹⁶0.0374
2026-11-30330.710–1.1130.732.9416.520.280.270.142.2 × 10⁻¹⁶0.0450
2026-12-18510.709–1.1151.515.1528.351.340.650.652.2 × 10⁻¹⁶0.0848
2026-12-31640.701–1.1581.956.1333.072.230.840.200.00000.1017
2027-01-15790.706–1.1562.467.3338.523.641.170.402.2 × 10⁻¹⁶0.1127
2027-01-29 nearest 91 d930.705–1.1803.038.5142.585.161.440.322.2 × 10⁻¹⁶0.1340
2027-02-191140.710–1.2033.719.9147.897.761.920.322.2 × 10⁻¹⁶0.1506
2027-03-311540.701–1.2245.2112.6055.6312.492.620.480.00000.1763
2027-04-16 nearest 182 d1690.703–1.2725.8113.4457.6614.133.020.252.2 × 10⁻¹⁶0.1951
2027-05-212040.700–1.2927.0815.3362.1817.763.720.322.2 × 10⁻¹⁶0.2120
2027-09-303370.705–1.22311.2420.4772.0426.806.634.812.2 × 10⁻¹⁶0.2485
2027-10-153510.704–1.29511.5920.8972.8427.706.851.812.2 × 10⁻¹⁶0.2484
2027-11-193860.710–1.26512.5521.9574.4229.187.803.610.00000.2484

“Beyond quoted strikes”: 4 thresholds lie outside their expiry’s quoted K/F range, where the slice is SVI wing extrapolation, so no probability is printed. The mass below and above the quoted range is the same closed form at the range’s edge, set by the quoted smile there; how that mass spreads beyond the edge is the linear wing, so the density is drawn only inside the quotes and no skewness or kurtosis is shown (the wings set them). Over every slice |∫p − 1| ≤ 2.2 × 10⁻¹⁶ and |E[ST/F] − 1| ≤ 2.2 × 10⁻¹⁶: each slice is a distribution with the forward as its mean (checked in the tests for every certified slice of every stored session). gmin ≥ 0 is the butterfly certificate: the density is non-negative everywhere. The slices are fitted to the repaired quotes: 45 quotes the l1 repair moved outside their bid–ask are left out of the fitted set (static arbitrage).

Implied vol by expiry and ln(K/F) · market mids

3,343 quotes
Median mid implied vol (%) of the quotes in each expiry (rows) and log-moneyness bucket (columns; heads are bucket midpoints)
Expiry≤ −0.30−0.25−0.17−0.115−0.07−0.035−0.01+0.01+0.035+0.07+0.115+0.17+0.25
2026-11-10 · 13d 2026-11-10 · ln(K/F) ≤ −0.30: no quotes46.136.829.821.017.314.312.311.212.32026-11-10 · ln(K/F) +0.09…+0.14: no quotes2026-11-10 · ln(K/F) +0.14…+0.20: no quotes2026-11-10 · ln(K/F) +0.20…+0.30: no quotes
2026-11-11 · 14d 2026-11-11 · ln(K/F) ≤ −0.30: no quotes47.736.429.621.117.414.512.411.412.32026-11-11 · ln(K/F) +0.09…+0.14: no quotes2026-11-11 · ln(K/F) +0.14…+0.20: no quotes2026-11-11 · ln(K/F) +0.20…+0.30: no quotes
2026-11-12 · 15d 57.347.335.529.421.117.614.712.411.412.52026-11-12 · ln(K/F) +0.09…+0.14: no quotes2026-11-12 · ln(K/F) +0.14…+0.20: no quotes2026-11-12 · ln(K/F) +0.20…+0.30: no quotes
2026-11-25 · 28d 48.640.031.225.721.016.614.713.111.711.82026-11-25 · ln(K/F) +0.09…+0.14: no quotes2026-11-25 · ln(K/F) +0.14…+0.20: no quotes2026-11-25 · ln(K/F) +0.20…+0.30: no quotes
2026-11-27 · 30d 47.438.630.925.320.116.914.312.611.611.713.62026-11-27 · ln(K/F) +0.14…+0.20: no quotes2026-11-27 · ln(K/F) +0.20…+0.30: no quotes
2026-11-30 · 33d 45.737.230.824.620.216.514.112.411.311.613.12026-11-30 · ln(K/F) +0.14…+0.20: no quotes2026-11-30 · ln(K/F) +0.20…+0.30: no quotes
2026-12-18 · 51d 42.337.527.923.919.917.015.113.412.412.012.82026-12-18 · ln(K/F) +0.14…+0.20: no quotes2026-12-18 · ln(K/F) +0.20…+0.30: no quotes
2026-12-31 · 64d 38.233.127.522.819.216.614.713.412.311.812.313.72026-12-31 · ln(K/F) +0.20…+0.30: no quotes
2027-01-15 · 79d 37.231.625.523.019.316.315.113.712.712.012.213.02027-01-15 · ln(K/F) +0.20…+0.30: no quotes
2027-01-29 · 93d 35.529.825.621.618.816.515.013.912.912.112.012.92027-01-29 · ln(K/F) +0.20…+0.30: no quotes
2027-02-19 · 114d 34.528.325.421.918.516.615.313.913.312.512.112.92027-02-19 · ln(K/F) +0.20…+0.30: no quotes
2027-03-31 · 154d 31.527.723.921.018.616.815.614.713.812.912.412.413.0
2027-04-16 · 169d 31.427.723.520.918.716.915.714.813.913.012.612.513.5
2027-05-21 · 204d 30.226.923.320.718.817.216.115.214.313.412.912.613.1
2027-09-30 · 337d 27.524.722.220.918.817.716.816.015.414.713.613.313.1
2027-10-15 · 351d 27.424.922.320.519.017.816.916.215.514.613.813.313.1
2027-11-19 · 386d 26.824.621.720.419.117.917.016.415.814.814.113.613.3

Hover or focus a cell (arrow keys move) for its details.

Two-sided out-of-the-money quotes on each expiry's parity forward (identical to JointCalibrator.spx_surface_full; 0-6 DTE expiries are excluded, as in the calibrator). Median half-spread 0.04 vol pts. The outer columns hold every quote beyond ±0.30, so the 3,343 quotes in the cells are all of them; the colour scale spans the cells shown.

Smile slice · bid–ask, mid and models

Quote readout: hover a quote, or focus here and step with ← → (Page Up / Down: 10 quotes; Home / End).

Arrow keys step through the shown expiry’s quotes; each step reads the quote’s strike, bid, mid and ask and each shown model’s IV and z.

One expiry at a time (choose it above the chart): bid–ask bars, mids and the Heston fit's anchors (diamonds); model IVs at the quoted strikes for Heston, SVI, SVI-cal, eSSVI (Heston and SVI-cal shown, the others behind their toggles). The dashed line is the forward, ln(K/F) = 0. Under the smile, each shown model's (model − mid) / half-spread per quote, the band ±1 is inside the spread. The readout under the chart steps through the quotes with the arrow keys.

Quotes per expiry
ExpiryDaysQuotesMedian half-spread (vol pts)
2026-11-10131440.07
2026-11-11141410.07
2026-11-12151280.06
2026-11-2528910.06
2026-11-27301570.05
2026-11-30334160.06
2026-12-18511800.04
2026-12-31644470.05
2027-01-15791340.03
2027-01-29932690.03
2027-02-19114490.04
2027-03-311544100.04
2027-04-161691200.04
2027-05-212041300.04
2027-09-303372870.03
2027-10-153511400.04
2027-11-193861000.07
2026-11-27 (30 days): median implied vol (%) by ln(K/F) bucket
ln(K/F)QuotesBidMidAskHestonSVISVI-caleSSVI
≤ −0.30147.1247.3747.6139.1545.7345.3739.20
−0.30…−0.20838.3638.5638.7534.1937.9337.7833.90
−0.20…−0.141030.8030.9131.0129.5930.9630.9429.05
−0.14…−0.091425.2725.3525.4225.7525.5725.6025.08
−0.09…−0.052520.0020.0620.1221.2120.0520.0620.52
−0.05…−0.022816.8816.9316.9817.8916.8016.7917.30
−0.02…+0.001814.2114.2514.3014.5414.2514.2414.23
+0.00…+0.021912.5612.6012.6412.0112.6812.6912.17
+0.02…+0.052111.5411.6011.6511.0911.6111.6211.52
+0.05…+0.091111.6511.7311.8012.3211.6011.5312.66
+0.09…+0.14213.3013.5813.8413.7513.2412.8914.09

Model scorecard · each model’s out-of-sample quotes, same metric

M4 OOS half-spreads · BREACHsource: scorecard.json
Out-of-sample quotes of each model (the quotes it was not fitted to); |z| = |model − mid| in half-spreads; RMSE and bias (mean of model − mid) in vol pts
ModelParamsFitted toScoredMedian |z|InsideWithin 2RMSEBiasDense-grid arb. (fly / cal)
SVI851,6541,6891.4133.7%71.1%0.57−0.060 / 54
SVI-cal851,6541,6891.6031.1%62.1%0.58−0.070 / 0
eSSVI511,6541,6896.7210.5%19.5%1.25−0.200 / 0
Heston5533,29014.783.1%6.7%1.40+0.170 / 0

Every model is scored on the same quote universe (the calibrator's cleaned quotes, 3,343) with the same metrics and dense-grid checks. Each model's out_of_sample set is the quotes it was not fitted to, so its size differs by model (essvi 1,689, svi 1,689, svi_cal 1,689, heston_v2 3,290); metrics.common_out_of_sample scores every model on the same 1,664 quotes, those no model was fitted to.

Surfaces are fitted to alternate strikes, so their out-of-sample quotes are the strikes in between (an interpolation test); Heston's in-sample set is its calibration anchors, fitted jointly with the VIX index leg, and its out-of-sample set is every other quote.

svi_cal is the arbitrage-free surface on this session: every slice passes svi.butterfly_certificate (Durrleman g >= 0 on a 1e-4 grid over k in [−3, 2] and a 1/k grid out to |k| = 2,000-3,000, each local minimum refined, and the |k| -> inf limit; minimum g 1.62e-09) and every consecutive pair passes svi.ordering_certificate (total variance ordered to 1e-10 on the same grids, wing slopes and tied-wing intercepts included; minimum w_(i+1) - w_i −6.6e-11). Numerical certificates, not closed-form; fields surface.json surfaces.svi_cal.butterfly_certificate / calendar_ordering. svi has no calendar constraint and its calendar violations are counted in dense_grid.

Yahoo snapshots carry no quote time: part of every model's spread misses can be stale quotes rather than model error.

The surfaces interpolate between fitted strikes where Heston must extrapolate from its anchors: read them as the quote-noise floor, not as rival models.

Model descriptions
SVI
raw SVI per expiry; Durrleman g(k) >= 0 rows on 481 points of k in [−3, 2] plus cutting planes until svi.butterfly_certificate passes, and Lee wing bounds; no calendar constraint between slices; inverse half-spread weights
SVI-cal
raw SVI per expiry with Durrleman g(k) >= 0 rows on 481 points of k in [−3, 2] and Lee wing bounds, and calendar ordering w_(i-1) <= w_i <= w_(i+1); a slice is accepted only when svi.butterfly_certificate and svi.ordering_certificate pass (cutting planes until they do); block coordinate descent from the eSSVI fit; inverse half-spread weights
eSSVI
eSSVI global surface (theta, psi, rho per expiry); Gatheral-Jacquier butterfly conditions, monotone theta and wing slopes, and slice ordering certified on a 4,001-point k-grid; inverse half-spread weights
Heston
Heston at the stored model_version-2 joint SPX/VIX-index fit (DE + L-BFGS-B on 53 z-grid anchors and 4 VIX indices; repo Lewis engine)
Cited on: Calibration

Median |z| by expiry · every model

Each model's out-of-sample quotes of each expiry, the scorecard's quote sets; 1 half-spread is the edge of the quoted bid–ask.

Median |model − mid| (half-spreads) by expiry, out-of-sample quotes
Model2026-11-10 · 13d2026-11-11 · 14d2026-11-12 · 15d2026-11-25 · 28d2026-11-27 · 30d2026-11-30 · 33d2026-12-18 · 51d2026-12-31 · 64d2027-01-15 · 79d2027-01-29 · 93d2027-02-19 · 114d2027-03-31 · 154d2027-04-16 · 169d2027-05-21 · 204d2027-09-30 · 337d2027-10-15 · 351d2027-11-19 · 386d
SVI1.21.31.51.71.51.51.51.91.91.61.71.51.51.51.01.20.3
SVI-cal1.21.21.51.81.92.12.02.52.51.82.21.91.51.41.01.10.4
eSSVI5.36.36.17.37.49.39.012.89.710.111.17.56.75.21.42.30.5
Heston13.712.113.110.414.312.612.313.116.513.212.117.011.911.925.921.312.7

Out-of-sample quotes only: the quote sets of the scorecard beside it, split by expiry.

Residuals in half-spreads · (model − mid) / half-spread

out-of-sample quotes
eSSVI: median (model − mid) / half-spread of its 1,689 out-of-sample quotes by expiry and log-moneyness bucket (column heads are bucket midpoints); |value| ≤ 1 is inside the spread
Expiry≤ −0.30−0.25−0.17−0.115−0.07−0.035−0.01+0.01+0.035+0.07+0.115+0.17+0.25
2026-11-10 · 13d 2026-11-10 · ln(K/F) ≤ −0.30: no quotes−17.6−19.2−13.4+3.8+6.9+0.2−4.8+5.7+3.32026-11-10 · ln(K/F) +0.09…+0.14: no quotes2026-11-10 · ln(K/F) +0.14…+0.20: no quotes2026-11-10 · ln(K/F) +0.20…+0.30: no quotes
2026-11-11 · 14d 2026-11-11 · ln(K/F) ≤ −0.30: no quotes−24.9−23.6−9.5+4.9+7.6+0.1−5.3+8.2+6.02026-11-11 · ln(K/F) +0.09…+0.14: no quotes2026-11-11 · ln(K/F) +0.14…+0.20: no quotes2026-11-11 · ln(K/F) +0.20…+0.30: no quotes
2026-11-12 · 15d 2026-11-12 · ln(K/F) ≤ −0.30: no quotes−24.4−23.2−10.8+5.0+6.4−1.8−7.0+7.2+3.82026-11-12 · ln(K/F) +0.09…+0.14: no quotes2026-11-12 · ln(K/F) +0.14…+0.20: no quotes2026-11-12 · ln(K/F) +0.20…+0.30: no quotes
2026-11-25 · 28d 2026-11-25 · ln(K/F) ≤ −0.30: no quotes−28.1−14.9−0.7+8.9+8.1+0.1−9.4−2.6+7.82026-11-25 · ln(K/F) +0.09…+0.14: no quotes2026-11-25 · ln(K/F) +0.14…+0.20: no quotes2026-11-25 · ln(K/F) +0.20…+0.30: no quotes
2026-11-27 · 30d 2026-11-27 · ln(K/F) ≤ −0.30: no quotes−24.3−16.9−3.7+7.7+7.6−0.8−8.5−2.3+12.3+2.12026-11-27 · ln(K/F) +0.14…+0.20: no quotes2026-11-27 · ln(K/F) +0.20…+0.30: no quotes
2026-11-30 · 33d −31.3−21.4−12.5+3.3+12.8+12.2−1.4−15.3−5.5+5.4+1.12026-11-30 · ln(K/F) +0.14…+0.20: no quotes2026-11-30 · ln(K/F) +0.20…+0.30: no quotes
2026-12-18 · 51d −33.2−31.7−8.1+3.4+10.9+8.1−3.1−14.0−9.4+10.3+10.22026-12-18 · ln(K/F) +0.14…+0.20: no quotes2026-12-18 · ln(K/F) +0.20…+0.30: no quotes
2026-12-31 · 64d −28.4−15.9+1.6+15.8+20.9+12.6−1.5−15.5−18.7+4.9+12.32026-12-31 · ln(K/F) +0.14…+0.20: no quotes2026-12-31 · ln(K/F) +0.20…+0.30: no quotes
2027-01-15 · 79d −34.4−19.2+0.5+8.4+12.5+5.7−2.9−13.0−16.6+2.4+18.3+14.12027-01-15 · ln(K/F) +0.20…+0.30: no quotes
2027-01-29 · 93d −24.4−12.2+0.7+10.7+12.7+7.5−1.4−11.1−13.6+2.6+12.8+9.52027-01-29 · ln(K/F) +0.20…+0.30: no quotes
2027-02-19 · 114d −28.7−8.6+3.3+13.5+13.5+6.2−1.8−14.5−16.7−5.7+11.6+16.92027-02-19 · ln(K/F) +0.20…+0.30: no quotes
2027-03-31 · 154d −15.5−5.7+5.4+9.0+7.5+1.8−4.5−10.2−13.6−5.0+12.7+19.3+12.6
2027-04-16 · 169d −13.2−3.1+6.1+8.1+7.6+3.0−1.2−4.3−8.4−6.8+7.2+13.9+6.1
2027-05-21 · 204d −10.0−1.3+5.8+6.8+5.6+2.8−0.3−2.1−5.1−5.8−0.4+12.3+8.9
2027-09-30 · 337d −7.8−0.7+1.9+2.1+1.2+0.8+0.5−0.5−1.1−2.2−2.0+1.52027-09-30 · ln(K/F) +0.20…+0.30: no quotes
2027-10-15 · 351d −4.6+0.9+3.4+2.9+1.7+1.1+0.2−0.2−1.1−2.9−4.3+0.4+7.8
2027-11-19 · 386d −2.1+0.1+0.9+0.7+0.5+0.4+0.2+0.2−0.1−0.6−0.9+0.6+4.2

Hover or focus a cell (arrow keys move) for its details.

Static arbitrage · screen and repair

V1 static arbitrage · WATCH
Constraint rows of the stored quotes (CRW 2020 Table 1): a row is one no-arbitrage inequality between quotes, so these count rows, not quotes (3,343 quotes)
ConstraintConstraint rowsViolated at midsViolated at bid/ask
Outright bounds1700
Vertical bound1700
Vertical spread3,3431715
Butterfly3,32695231
Calendar spread000
Calendar vertical3,23466
Calendar butterfly9,5491616

An l1 repair (linear programme, HiGHS) moves 1,517 quotes, 45 of them outside their bid–ask (largest move 110 half-spreads); those are flagged and left out of the surfaces' fitted set.

The 25 largest violations at mids of 991 constraint rows violated · the 8 largest here, 17 more below

arbitrage.largest_mid_violations: legs as weight and strike per expiry; shortfall in idx pts and $ per SPX contract (×100)
ConstraintLegsShortfall (idx pts)$ per contractAt bid/ask
C3 vertical butterfly2027-03-31 +0.50 P6260 −1 P6265 +0.50 P627099.59—bad quote: 2027-03-31 P6265
C6 calendar butterfly2027-03-31 −1 P6265 +0.43 P6270
2027-04-16 +0.57 P6275
95.17—bad quote: 2027-03-31 P6265
C2 vertical spread2027-03-31 +1 P6260 −1 P626594.97—bad quote: 2027-03-31 P6265
C6 calendar butterfly2027-03-31 −1 P6265
2027-04-16 +0.85 P6275 +0.15 P6300
91.90—bad quote: 2027-03-31 P6265
C5 calendar vertical spread2027-03-31 −1 P6265
2027-04-16 +1 P6275
88.40—bad quote: 2027-03-31 P6265
C3 vertical butterfly2027-03-31 +0.33 P6445 −1 P6455 +0.67 P646078.49—bad quote: 2027-03-31 P6455
C3 vertical butterfly2027-03-31 +0.50 P6380 −1 P6385 +0.50 P639074.27—bad quote: 2027-03-31 P6385
C6 calendar butterfly2027-03-31 −1 P6455
2027-04-16 +0.62 P6450 +0.38 P6500
69.71—bad quote: 2027-03-31 P6455
The other 17 violations · ranks 9–25
Ranks 9–25 of arbitrage.largest_mid_violations, in the columns of the table above
ConstraintLegsShortfall (idx pts)$ per contractAt bid/ask
C2 vertical spread2027-03-31 +1 P6380 −1 P638569.55—bad quote: 2027-03-31 P6385
C2 vertical spread2027-03-31 +1 P6445 −1 P645569.19—bad quote: 2027-03-31 P6455
C6 calendar butterfly2027-03-31 −1 P6385
2027-04-16 +0.34 P6300 +0.66 P6450
65.77—bad quote: 2027-03-31 P6385
C3 vertical butterfly2027-03-31 +0.33 P5910 −1 P5920 +0.67 P592553.78—bad quote: 2027-03-31 P5920
C5 calendar vertical spread2027-03-31 −1 P6455
2027-04-16 +1 P6450
52.09—bad quote: 2027-03-31 P6455
C6 calendar butterfly2027-03-31 −1 P5920 +0.61 P5925
2027-04-16 +0.39 P5925
51.54—bad quote: 2027-03-31 P5920
C3 vertical butterfly2026-12-31 +0.60 P6275 −1 P6285 +0.40 P630050.05—bad quote: 2026-12-31 P6285
C6 calendar butterfly2027-03-31 −1 P5920
2027-04-16 +0.68 P5925 +0.32 P5950
47.94—bad quote: 2027-03-31 P5920
C3 vertical butterfly2027-03-31 +0.50 P5705 −1 P5710 +0.50 P571545.92—bad quote: 2027-03-31 P5710
C2 vertical spread2027-03-31 +1 P5910 −1 P592044.17—bad quote: 2027-03-31 P5920
C6 calendar butterfly2026-12-31 −1 P6285
2027-01-15 +0.78 P6250 +0.22 P6475
43.43—bad quote: 2026-12-31 P6285
C6 calendar butterfly2027-03-31 +0.33 P5705 −1 P5710
2027-04-16 +0.67 P5725
42.56—bad quote: 2027-03-31 P5710
C2 vertical spread2027-03-31 +1 P5705 −1 P571041.09—bad quote: 2027-03-31 P5710
C6 calendar butterfly2027-03-31 −1 P5710
2027-04-16 +0.10 P5700 +0.90 P5725
40.92—bad quote: 2027-03-31 P5710
C5 calendar vertical spread2027-03-31 −1 P5920
2027-04-16 +1 P5925
40.33—bad quote: 2027-03-31 P5920
C2 vertical spread2026-12-31 +1 P6275 −1 P628540.26—bad quote: 2026-12-31 P6285
C3 vertical butterfly2027-03-31 +0.50 P7450 −1 P7455 +0.50 P746029.19—bad quote: 2027-03-31 P7455

A shortfall is the amount, in index points, by which the legs’ mid prices break the constraint’s inequality (for a vertical spread, a price below zero or above the strike width). “Executable”: the violation survives at the bid and the ask too. “Bad quote”: the shortfall is larger than the row’s widest strike gap, more than any spread on those strikes pays, so one quote is wrong rather than tradeable; the leg named is the one such rows share, and every row holding it is flagged with it, with no dollar value.

Dense-grid checks of the fitted surfaces: eSSVI 0 butterfly / 0 calendar violations; SVI 0 butterfly / 54 calendar violations; SVI-cal 0 butterfly / 0 calendar violations.

VIX family replicated from the same chain

V1 VIX replication · OKCboe VIX methodology
Replicated index against the Cboe close (index points); gap = replicated − Cboe close
IndexReplicatedCboe closeGap
VIX9D—15.60—
VIX17.1916.91+0.28
VIX3M19.4019.22+0.18
VIX6M21.3321.24+0.09
The two listed expiries each index interpolates and the near term’s weight; the gap above split as gap = missing-strike shortfall + unexplained (index points; each part rounded on its own)
IndexNear / next (d)Near weightMissing-strike shortfall (replicated − full strip)Unexplained
VIX9D29.5 / 50.51.977——
VIX29.5 / 50.50.977−0.01+0.29
VIX3M92.5 / 113.50.977−0.06+0.24
VIX6M169.2 / 204.20.579−0.01+0.10

Near weight: the near term’s share of the constant-maturity combination; outside [0, 1] it would extrapolate. VIX9D is not replicated: its nearest candidate pair would extrapolate. Missing-strike shortfall: the replication on the stored strip less the same on the full strip, valued on the SVI-cal surface’s wing (negative: the strip lacks strikes that add variance). Unexplained: what the chain leaves of the gap (snapshot timing against the 16:15 ET print, stale quotes or the rate; not measured). The stored quotes beyond the surface’s fitted range price above that wing (VIX +0.22, VIX3M +0.56, VIX6M +1.25 index points), so the shortfall there likely understates.

VIX-term ATM / VIX on this chain: 0.794 (the ATM mids of the VIX's own two expiries, combined with its constant-maturity weights). The backtest's β estimator (30-day ATM-forward Black-76 vol / VIX) gives 0.785 on the same chain. The backtest marks every straddle at one fixed β; see the β chains on Research.

Where the replication departs from Cboe
  • R is the Treasury zero curve's 91-day rate (cc) for both terms, not Cboe's CMT spline per expiry; dVIX/dR ~ VIX T / 2.
  • Calculation time is the chain's T origin; Yahoo snapshots carry no quote time.
  • parity_forward replaces the single-strike forward with the cleaned chain's parity-regression F and D (robust to one stale strike).
  • K0 falls back to the nearest lower strike with both sides quoted when the listed K0 lacks one (two-sided-only storage); flagged per term.
  • VIX9D/VIX3M/VIX6M use the VIX candidate set and bracket rule at 9/93/184 days (analogues, not Cboe's index-specific series sets).
  • SPXW PM lines stand in for the AM SPX monthly on 2026-12-18, 2027-01-15, 2027-02-19 (the chain stores no SPX-root lines there); their T runs to the 16:00 PM settlement, 6.5 h past the 09:30 SOQ the AM series settles on.
  • VIX9D is not replicated from the stored chain: no stored Cboe candidate expiries on both sides of 9 days: the nearest pair 2026-11-27 (29.5d) / 2026-12-18 (50.5d) would extrapolate (near weight 1.977, outside [0, 1]), which is not Cboe's interpolation.
  • The stored chain holds no zero-bid lines (two-sided capture), so Cboe's two-consecutive-zero-bid stop cannot trigger: every stored OTM strike with a bid enters the strip, which can only add variance relative to Cboe's rule on the same book; the stored book's own strike range is the binding limit.
  • The first Cboe candidate expiry after 30 days (2026-12-04) is not in the stored chain (the bot stores calibration expiries and neighbours), so the bracket is 2026-11-27 (29.5d) - 2026-12-18 (50.5d) instead of a <= 7-day bracket.
  • near-term 2026-11-27: 113 puts / 57 calls, strip K/F 0.465-1.162
  • next-term 2026-12-18: 133 puts / 62 calls, strip K/F 0.412-1.237; K0 fell back to the nearest lower strike with both sides quoted
  • Model variance swaps at 30 days (k in [−3, 2], wings beyond the fitted K/F 0.70-1.30 extrapolated, so each inherits its model's wing bias): SVI-cal 16.79, SVI 16.87, eSSVI 16.18.
  • Gap attribution (VIX, SVI-cal surface; gap = replicated − Cboe close): +0.28 = missing-strike shortfall −0.01 + unexplained +0.29 (each part rounded on its own). Missing-strike shortfall (replicated − full strip): what the replication lacks without the strikes beyond the stored strip, valued on the surface’s wing. The stored quotes beyond the fitted K/F 0.70–1.30 price 0.22 index points above that wing, so the shortfall likely understates what the strip lacks. Inside the fitted K/F 0.70–1.30, market minus surface is +0.10; with the far-wing term it sets the replication against the surface and is not part of the gap. Unexplained by the chain: +0.29, 105% of the gap (snapshot timing against the 16:15 ET print, stale quotes, the rate).

Variance-swap strip · same chain

The single-term variance-swap vol of every stored expiry against its ATM vol; the gap is the skew premium. Hollow circles: the official VIX-family closes at their constant maturities (9, 30, 93 and 184 days), where the replication's gaps show against the strip.

Variance-swap strip (vols in %; var-swap − ATM in vol pts)
ExpiryDaysVar-swap volATM volVar-swap − ATM (vol pts)ATM / var-swapStrikes
2026-11-101315.5313.15+2.380.847159
2026-11-111415.8713.30+2.570.838155
2026-11-121516.1813.43+2.750.830138
2026-11-252817.3313.64+3.690.787102
2026-11-273017.1313.39+3.740.782170
2026-11-303316.8913.16+3.720.780466
2026-12-185118.6114.09+4.520.757195
2026-12-316418.8214.03+4.780.746604
2027-01-157919.1414.19+4.950.741150
2027-01-299319.4114.39+5.020.741296
2027-02-1911419.7114.64+5.070.74360
2027-03-3115420.3915.08+5.310.740496
2027-04-1616921.1415.28+5.870.723218
2027-05-2120421.6315.66+5.970.724215
2027-09-3033721.0216.50+4.520.785304
2027-10-1535121.8916.57+5.320.757198
2027-11-1938621.9616.74+5.220.762130

Var-swap minus ATM vol is the skew premium in the 30-day VIX: the reason a straddle is not worth the VIX.

Hollow circles: the Cboe closes (16:15 ET; the replication is timed 2026-10-29 03:32 ET) at their constant maturities, VIX9D 15.60 at 9 d, VIX 16.91 at 30 d, VIX3M 19.22 at 93 d, VIX6M 21.24 at 184 d: against the single-expiry strip they show the replication gaps of the table beside.

Cited on: Research

Every session the surface report covers

8 sessions
Median |z| in half-spreads of each model’s out-of-sample quotes (its scorecard.json, the population every headline on the site uses) by session; repair moves outside the bid–ask; the VIX replicated from the chain against the close; ATM vol / VIX by the replication's VIX-term interpolation and by the backtest's β estimator
SessionScored quotesExpirieseSSVI |z|, out of sampleSVI |z|, out of sampleSVI-cal |z|, out of sampleHeston |z|, out of sampleRepair moves outside spreadVIX rep. − closeVIX-term ATM / VIXβ estimator ATM 30d / VIX
2026-10-283,343176.721.411.6014.7845+0.280.7940.785
2026-10-273,035177.661.601.7717.2154——0.777
2026-10-263,102175.761.461.6012.5145−0.340.7530.760
2026-10-162,913172.050.480.556.3285−0.290.7120.702
2026-06-187,022435.481.601.9815.60439+0.090.8190.814
2026-05-296,698413.680.410.4511.08123−0.300.8270.813
2026-03-275,512401.240.900.904.4252−0.780.8540.841
2026-03-246,674431.741.401.427.32266−0.290.8270.824

8 sessions with a stored chain: a range across sessions, not a sampling interval. The tiles at the top give each model’s range over these sessions (dashed rule).

Keyboard shortcuts

g o
Overview
g s
Surface
g c
Calibration
g r
Risk
g e
Research
g x
Corrections
g m
Model Risk
?
This list
← → ↑ ↓
Move between heatmap cells
[ ]
Previous / next expiry: the smile, the heatmap and delta-grid rows and the by-expiry chart follow

Units, signs and definitions: every term the pages abbreviate, with its formula.