← Back to all projects

Project / 01

SPX Implied Volatility Surface

CategoryOptions research

StatusCompleted notebook

Year2026

Three-dimensional SPX implied-volatility surface over log-moneyness and maturity
Interpolated surface shown only over the observed moneyness and maturity domain.
InputSPX quotes
ForwardParity
OutputOTM IV

I cleaned a dataset of SPX option quotes, matched calls and puts by strike and expiry, and estimated maturity-specific forward levels through put–call parity. I then inverted Black–76 prices to obtain out-of-the-money implied volatilities and visualised their evolution across moneyness and maturity.

Particular attention was given to duplicate contracts, quote quality, failed volatility inversions and the distinction between observed data and interpolation.

The resulting surface is a descriptive view of the supplied market snapshot rather than a live pricing or trading tool.

What I wanted to understand

Turn a raw listed-option chain into a clean, inspectable set of implied volatilities without hiding the data-quality decisions made along the way.

What the project covers

  1. Filter bid–ask spreads and liquidity, then audit duplicate contracts before keeping one quote per instrument.
  2. Match calls and puts by strike and expiry and infer maturity-specific forwards through put–call parity.
  3. Select out-of-the-money options and invert Black–76 prices to recover implied volatility.
  4. Run monotonicity and convexity diagnostics, then separate observed quotes from the interpolation used for visualisation.
pairs["forward_est"] = pairs["strike"] + np.exp(r * pairs["T"]) * (
    pairs["mid_call"] - pairs["mid_put"]
)

clean["log_moneyness"] = np.log(clean["strike"] / clean["forward"])
otm = clean[clean["is_otm"]].copy()

What the result does not claim

The analysis uses mid prices, a flat interest rate and a single market snapshot. It does not include a dividend curve, executable prices or a complete static-arbitrage repair.

PythonpandasNumPySciPyMatplotlibOptions
Next project / 02Black–Scholes & Heston