Joint SPX/VIX calibration
An end-of-day research system for SPX and VIX options. Its daily job is built to store each U.S. session's option books, fit an arbitrage-free market surface and one stochastic-volatility model jointly to the SPX smile and the VIX index term structure (VIX options are a research leg, not in the fit), and score both on quotes they were not fitted to, in units of the quoted half-spread; the pipeline panel lists what is stored so far. Greeks, scenarios and a mark-to-model backtest with its statistical inference are built from the same fits.
Findings at a glance
Works
- Arbitrage-free SVI surface: median 1.60 half-spreads from the mid, 31.1% inside the bid–ask, on the held-out strikes of 2026-10-28.
- VIX replicated from the stored chain: +0.28 index pts from the Cboe close (replicated − official) on 2026-10-28, by the Cboe formula, with 13 listed departures (Surface).
- The gate keeps broken-data fits off the page: 37 pre-C22 fits labelled legacy, none published; 8 current-schema fits stored (the job stores only fits that pass the gate; a rejected fit is recorded in its run log, not stored).
Does not work
- One-factor Heston at the short end: 3.06 vol pts out of sample on the 2026-11-12 expiry (15 days), VVIX 188 against 97 (2026-10-28).
- Heston's ATM skew is steeper than the market's: ×1.02 to ×1.77 the SVI-cal market skew at every listed expiry of 2026-10-28 (|skew| 1.78 against 1.00 vol per unit ln(K/F) at 13 d); the market's slope in T is −0.45 to −0.32 over 8 sessions (SVI-cal, all expiries).
- The mark-to-model backtest loses: −22.2% over 2018–2025, Sharpe −0.99 (95% CI −1.81 to −0.30).
- The ML regime classifier: 74.9% out-of-sample accuracy against 87.0% for the predict-yesterday baseline; research only, it never trades.
Next · not done yet
- Forward test at executable prices: not yet evidence: 3 registered sessions so far; the ledger fixes targets before any later price exists.
- Rough Heston in production: not adopted: lower out-of-sample error on 4 of 8 sessions, and on 2026-10-28 it returns H = ½, which is Heston.
- VX futures in the joint objective: not done: the fits score VX settlements out of sample only, 1.85–3.18 index pts RMSE on 4 of 8 gated fits, the model below the settlement on 35 of 35 contracts. VX futures table ends 2026-10-09; none stored for 2026-10-28.
- A wider production σ box: not done: σ ≤ 2 is kept because the NN pricer's domain, the vomma shock and the bound chips are tied to it (Corrections C23-M1).
Key results
Every figure is read from the committed artifact named under it. A half-spread is half the quoted bid–ask in implied-vol terms, so a model within one half-spread of the mid sits inside the quote. Backtest dollars are mark-to-model, never traded fills.
Regime · rule label
M10 DB lag · OKDeterministic rule (rv₂₀ against VIX, VVIX gate); the label the backtest trades, lagged one session. Label as of 2026-10-28.
Rule inputs on 2026-10-28:
- rv₂₀ (20-session)
- 9.89%
- VIX
- 16.91
- VVIX
- 96.61
- R2 gate
- 107.06 (rolling 252-day 80th percentile of VVIX)
- Gate distance
- VVIX 96.61 vs R2 gate 107.06 (−10.45 below)
- Rule gives
- R1; stored label for 2026-10-28: R1
Rule definitions
- R0
- Realised > implied (rv₂₀ > VIX) → long gamma
- R1
- Implied ≥ realised (rv₂₀ ≤ VIX) → sell premium
- R2
- VVIX above its rolling 252-day 80th percentile (overrides R0/R1) → vomma trades
VIX term structure
^VIX9D, ^VIX, ^VIX3M and ^VIX6M on one session, and dashed on 2026-10-27 (1 session earlier), 2026-10-21 (5 sessions earlier), 2026-09-29 (21 sessions earlier); tenor on a linear axis, straight segments.
| Tenor | 2026-10-28 | 2026-10-27 | 2026-10-21 | 2026-09-29 |
|---|---|---|---|---|
| 9d | 15.60 | 16.65 | 15.49 | 14.21 |
| 30d | 16.91 | 17.52 | 16.68 | 16.04 |
| 93d | 19.22 | 19.57 | 18.72 | 18.09 |
| 184d | 21.24 | 21.42 | 20.62 | 20.20 |
9d 15.60 → 184d 21.24 (slope +5.64 index pts, contango).
Implied vs forecast vol
PDV ranks 2 of 7 on 21-day MSE and 6 of 7 on QLIKE (2018-01-02 → 2025-03-24); in the 90% model confidence set: yes on both; best on both: VIX² (risk-neutral, contains the variance premium).
Within this spread's usual range.
70th percentile of 3,645 prior sessions (2012-04-30 → 2026-10-27); mean +3.38 vol pts.
Last 60 sessions of the spread; the line marks zero.
VIX − RV21 (trailing) +7.22 vol pts, 2026-10-28 (VIX 16.91 against the RMS realised vol of the last 21 sessions, 9.69%).
Methodology and caveats
The forecast is the expected realised vol (RMS) of the next 21 sessions, the VIX horizon. VIX is a risk-neutral variance quote, so the spread mixes the variance risk premium with a convexity gap (E[σ] < √E[σ²]); it is not a pure premium. Forecast and history are the purged walk-forward forecast (refitted daily on labels known at each close), so the percentile ranks today against out-of-sample values only.
σ₁ (EWMA, 5-day half-life) 10.18%; σ₂ (EWMA, 60-day half-life) 12.16%. Walk-forward R²: 0.29 (ex-2020 0.26) on 3,625 forecasts 2012-04-30 → 2026-09-29.
COVID stress test, 2020-03-16: forecast made at the 2020-03-13 close (refitted on the 2,484 labels known then) 54.5%. Realised over its 21-session horizon (2020-03-16 → 2020-04-14, RMS, annualised): 77.1%; error −22.5 vol pts. A backward-looking model cannot see a jump coming.
VX futures curve · on its own date
Settlements of 2026-10-09, 13 NYSE sessions before the market database’s 2026-10-28; the daily job does not refresh the futures table.
9 monthly contracts on 2026-10-09, front month first; M1 → M2 +4.28%.
| Contract | Final settlement | Days | 2026-10-09 | 2026-10-08 | Change |
|---|---|---|---|---|---|
| 2026-10 | 2026-10-21 | 12 | 17.12 | 17.62 | −0.51 |
| 2026-11 | 2026-11-18 | 40 | 17.85 | 18.01 | −0.16 |
| 2026-12 | 2026-12-16 | 68 | 18.44 | 18.52 | −0.08 |
| 2027-01 | 2027-01-20 | 103 | 19.27 | 19.32 | −0.05 |
| 2027-02 | 2027-02-17 | 131 | 19.81 | 19.80 | +0.01 |
| 2027-03 | 2027-03-17 | 159 | 20.00 | 20.00 | +0.01 |
| 2027-04 | 2027-04-21 | 194 | 20.32 | 20.32 | 0.00 |
| 2027-05 | 2027-05-18 | 221 | 20.47 | 20.48 | 0.00 |
| 2027-06 | 2027-06-16 | 250 | 20.68 | 20.75 | −0.07 |
M1 → M2 +4.28% (17.12 → 17.85): VX2 / VX1 − 1, the second monthly contract over the first; positive is contango. Monthly contracts only (weeklies excluded), at Cboe’s daily settlement; dashed: 2026-10-08. A future settles on VIX at its expiry, so this curve is not the spot term structure above and is not drawn on it.
VIX / VIX3M · since 2010-01-04
Daily VIX over VIX3M closes; above 1 (the 30-day index over the 3-month one) on 7.6% of 4,231 sessions; today 0.880.
| Year | Sessions | Above 1 (%) | Mean |
|---|---|---|---|
| 2010 | 252 | 8.7 | 0.901 |
| 2011 | 252 | 20.2 | 0.941 |
| 2012 | 250 | 0.4 | 0.873 |
| 2013 | 252 | 3.2 | 0.901 |
| 2014 | 252 | 7.5 | 0.904 |
| 2015 | 252 | 7.5 | 0.891 |
| 2016 | 252 | 6.0 | 0.857 |
| 2017 | 251 | 0.8 | 0.825 |
| 2018 | 251 | 21.1 | 0.931 |
| 2019 | 252 | 5.2 | 0.900 |
| 2020 | 253 | 20.9 | 0.936 |
| 2021 | 252 | 0.8 | 0.843 |
| 2022 | 251 | 6.0 | 0.925 |
| 2023 | 250 | 0.0 | 0.881 |
| 2024 | 252 | 3.6 | 0.901 |
| 2025 | 250 | 11.6 | 0.899 |
| 2026 | 207 | 4.8 | 0.881 |
Above 1 (backwardation: the 30-day index over the 3-month one) on 7.6% of 4,231 sessions, shaded. Today 0.880, the 48th percentile of the 4,230 prior sessions since 2010-01-04.
Headline fit · Heston, joint SPX/VIX
Evidence on the Calibration page: out-of-sample error by expiry · the VIX leg, indices and VX futures.
κ 4.049 · θ 0.0578 · σ 1.648 · ρ −0.680 · v₀ 0.0220
Market surface, SVI-cal at 30 days: 1M ATMF 13.40% · RR25 −4.31 · BF25 +0.66 vol pts (surface 2026-10-28, the newest session). Delta grid.
No parameter on a bound. Feller VIOLATED (margin −2.25; diagnostic, not imposed). Refitted in a wider box (σ ≤ 10, κ ≤ 60; production has κ ≤ 20), it goes to σ 1.65, κ 4.0, loss 0.0%, out-of-sample RMSE 1.40 → 1.40 vol pts. Calibration page.
Pipeline · what is stored
| Cboe option books | SPX 2026-10-28: 28,872 lines (27,802 two-sided, 54 expiries), quotes 2026-10-29 07:16:06 UTC (overnight book); VIX 2026-10-28: 1,520 lines (1,362 two-sided, 13 expiries), quotes 2026-10-29 07:16:04 UTC (overnight book) |
|---|---|
| Accepted joint fits | 8 (model_version 2), newest 2026-10-28 |
| Surface reports | 8 sessions, 2026-03-24 → 2026-10-28 |
| Calibration diagnostics | 8 sessions (σ profile, identifiability, rough Heston) |
| Forward ledger | 3 sessions, 2026-10-26 → 2026-10-28 |
| Backtest window | ends 2025-03-24, fixed (mark-to-model) |
What the repository holds, whoever wrote it: a record does not say whether the scheduled job or a manual run of the job's code produced it (the git history does). Each input's as-of date and age in NYSE sessions is in the status bar and in the table at the foot of every page. Research prototypes (the ML regime classifier, the NN pricer, the Quintic OU) are on the Research and Calibration pages; none feeds a number on this page; the findings above cite one prototype's accuracy, as a negative result.