project
Vol Surface Research Lab
SABR/Heston Calibration, Robustness, and Failure Diagnostics
result101 tests, 206 row recommended universe, SABR median RMSE 0.0190 to 0.0077, Heston global RMSE 0.1174.
A reproducible Python research engine for option-chain cleaning, implied-volatility surfaces, SABR/Heston calibration, robustness testing, and model failure analysis.
Problem
Options volatility models often look clean on generated data but become fragile on real option chains. This project asks what happens when a full calibration workflow is forced to handle a saved SPY yfinance snapshot with noisy quotes, ultra-short expiries, and model diagnostics recorded at every step.
Approach
I built a package-first Python research engine with deterministic scripts, pytest coverage, ruff checks, generated CSV outputs, and markdown research documentation.
The pipeline cleans option-chain rows, extracts forwards, builds OTM IV surface inputs, runs observed-quote static-arbitrage diagnostics, calibrates SABR and Heston, and compares models only on the same recommended calibration universe.
Key result
On the saved SPY snapshot, raw SABR calibration was unstable due to ultra-short expiries and noisy quotes. After deterministic expiry/liquidity filtering, SABR median RMSE dropped from 0.018955 to 0.007655.
Global and per-expiry Heston variants underfit SABR on the same filtered universe, despite passing synthetic Heston recovery and implementation sanity checks.
Technical pipeline
- Black-Scholes pricing, Greeks, parity, and IV inversion
- Option-chain schema normalization and quote filtering
- Put-call parity forward extraction
- OTM/ATM IV surface construction
- Observed-quote static-arbitrage diagnostics
- SABR calibration and robustness testing
- Heston pricing and calibration
- Heston sanity checks, synthetic recovery, and variant diagnostics
- Final same-universe SABR/Heston comparison
Metrics
What failed or changed
Raw SABR calibration was unstable on ultra-short expiries.
Global Heston underfit the filtered snapshot and produced suspicious parameter diagnostics.
Feller penalties did not fully stabilize Heston inside the deterministic runtime cap, and the Stage 5 fitted Heston parameters were quadrature-sensitive.
What improved
Deterministic expiry and liquidity filtering reduced SABR median RMSE from 0.018955 to 0.007655.
Heston synthetic recovery worked with RMSE IV 0.000043, and per-expiry Heston improved Heston fit relative to global Heston, though it still underfit SABR.
Heston sanity checks, synthetic recovery, multistart diagnostics, Feller/regularized variants, and per-expiry Heston helped isolate whether the underfit came from implementation, numerics, model rigidity, or data limitations.
Final interpretation
The central result is not that SABR is universally better than Heston. The central result is that, on this saved short-dated SPY snapshot, per-expiry SABR fit the filtered local smile much better than global or per-expiry Heston variants, while Heston sanity checks and synthetic recovery suggest the implementation was not simply broken.
The main contribution is the reproducible calibration and diagnostic framework, not a trading signal or universal model ranking.
Limitations
- Single saved yfinance SPY snapshot.
- Not vendor-certified data.
- No historical validation.
- No trading signal.
- American exercise and dividends are not fully modeled.
- Heston result is diagnostic, not an operational calibration claim.
- SABR/Heston comparison is not universal.
How to reproduce
The repository contains deterministic scripts, generated outputs, pytest coverage, and markdown documentation for reproducing the saved snapshot pipeline.
The final report outputs preserve the calibration universe, model comparisons, and diagnostic artifacts used in the writeup.