A replication and extension of Vähämaa (2004) and Hull & White (2017) using recent SPY options data.
The Black-Scholes model prices options under the assumption of constant volatility, yet equity option markets display a persistent implied volatility skew. Practitioners routinely override the flat-vol assumption by computing delta at the smile-consistent implied volatility for each strike — a heuristic known as practitioner Black-Scholes delta. This project replicates the empirical hedging experiments of Vähämaa (2004) and Hull & White (2017) on SPY options to quantify the hedging P&L cost of flat-vol delta relative to two smile-aware alternatives: practitioner BS delta and smile-adjusted delta derived from the full local-volatility surface. We decompose the hedging error across moneyness buckets (deep ITM, ATM, OTM), time-to-expiration regimes (< 30 days, 30–60 days, > 60 days), and realized-volatility regimes (low / medium / high VIX terciles). The primary metric is daily delta-hedged P&L variance; a smaller variance indicates a better hedge.
How much does using flat-vol Black-Scholes delta cost a delta hedger, relative to practitioner BS delta and smile-adjusted delta, and where does the gap come from — moneyness, time to expiration, or volatility regime?
We use the continuous-dividend Black-Scholes formula (Merton 1973) for both pricing and Greek computation. The spot price of SPY serves as S, Treasury yields as r, and the SPY trailing dividend yield as q.
For each option in the cross-section, we invert Black-Scholes numerically (Brent's method) to obtain the implied volatility σ(K, T). The resulting function of strike and expiration is the implied volatility surface.
| Label | Definition |
|---|---|
| Flat-vol delta | ∂C/∂S evaluated at a single ATM implied volatility; ignores the skew entirely. |
| Practitioner BS delta | ∂C/∂S evaluated at the option's own implied volatility σ(K, T). Standard industry practice. |
| Smile-adjusted delta | ∂C/∂S + ∂C/∂σ · ∂σ/∂S, where ∂σ/∂S is the slope of the smile with respect to the underlying (the "sticky-strike" vs "sticky-delta" correction). Following Hull & White (2017). |
We fit a parametric surface to the implied volatility grid using the SVI (Stochastic Volatility Inspired) parameterization of Gatheral (2004), which is arbitrage-free by construction in the time-slice dimension. The surface provides smooth ∂σ/∂K and, combined with the chain rule, ∂σ/∂S.
For each option in the sample, we construct a daily delta-hedged portfolio: long one option, short Δ shares of SPY, financed at the risk-free rate. We rebalance at close prices each day and record the daily P&L. The experiment follows the design of Vähämaa (2004): no transaction costs, no microstructure. We then compare variance of daily hedging P&L across the three delta variants.
Hedging error variance is regressed on indicator variables for moneyness quintile, DTE bucket, and VIX tercile, following the decomposition framework in Hull & White (2017) Section 4.
Current implementation: CBOE-listed SPY options sourced via yfinance
(point-in-time snapshot, no historical chains). This is sufficient for
surface-fitting and methodology validation but not for the full longitudinal
hedging experiment.
Target dataset: OptionMetrics (via WRDS) or ORATS, covering 2018–2024 to
span multiple vol regimes. See src/data_loader.py for the swap-in TODO.
Filters applied:
- Volume ≥ 10 contracts per day
- Bid-ask spread ≤ 10% of mid-price
- 7 ≤ DTE ≤ 180
- Strike within ±30% of spot (log-moneyness |ln(K/S)| ≤ 0.30)
.
├── src/
│ ├── greeks.py # Black-Scholes pricing and Greeks
│ ├── iv_solver.py # Implied volatility inversion
│ ├── surface.py # Volatility surface fitting (SVI / splines)
│ ├── hedging_sim.py # Daily delta-hedge simulation
│ ├── data_loader.py # Data ingestion and cleaning
│ ├── analysis.py # Decomposition regressions and summary stats
│ └── plots.py # Publication-quality figures
├── notebooks/
│ ├── 01_explore_data.ipynb # Data pull + IV smile smoke test
│ ├── 02_build_surface.ipynb # Surface fitting and diagnostics
│ ├── 03_run_hedging.ipynb # Hedging simulation
│ └── 04_results.ipynb # Final figures and tables
├── tests/
│ └── test_greeks.py # Unit tests for pricing and IV inversion
├── data/
│ ├── raw/ # Parquet snapshots from data_loader (gitignored)
│ └── processed/ # Cleaned option chains (gitignored)
└── results/
├── figures/ # PNG / PDF outputs
└── tables/ # CSV / LaTeX tables
pip install -r requirements.txt
pytest tests/ # should be all green
jupyter notebook notebooks/01_explore_data.ipynbBlack, F., & Scholes, M. (1973). The pricing of options and corporate liabilities. Journal of Political Economy, 81(3), 637–654.
Derman, E., & Kani, I. (1994). Riding on a smile. Risk, 7(2), 32–39.
Dumas, B., Fleming, J., & Whaley, R. E. (1998). Implied volatility functions: Empirical tests. Journal of Finance, 53(6), 2059–2106.
Gatheral, J. (2004). A parsimonious arbitrage-free implied volatility parameterization with application to the valuation of volatility derivatives. Presentation at Global Derivatives & Risk Management, Madrid.
Hull, J., & White, A. (2017). Optimal delta hedging for options. Journal of Banking & Finance, 82, 180–190.
Merton, R. C. (1973). Theory of rational option pricing. Bell Journal of Economics and Management Science, 4(1), 141–183.
Vähämaa, S. (2004). Delta hedging with the smile. Financial Markets and Portfolio Management, 18(3), 241–255.