Volatility surface
A market-consistent map across strike and maturity—and a hypothesis about everything between the quotes
01Read a surface as linked smile and term slices rather than a decorative 3D object.
02Distinguish quoted nodes, interpolation choices and model-generated dynamics.
03Use total variance and option-price checks to reason about static arbitrage.
04Connect the surface to vanilla marking, local volatility, stochastic volatility and hedge behavior.
Build the state before the equation.
A volatility surface stacks option-implied volatility across strike and expiry. Every visible point is a compact encoding of an option price under a stated convention; every gap between liquid points is a modelling decision.
A smile slice answers how downside, ATM and upside options differ at one expiry.
A term slice answers how the market distributes uncertainty and event risk through time.
The fitted surface marks vanilla books today. A dynamics model determines how it moves tomorrow.
The product exists before the model.
Desks need continuous values for marking, interpolation, scenario risk and calibration even though only a sparse set of options trades reliably.
listed or OTC vanilla grids
variance-sensitive products
barriers and digitals
forward-start and cliquet structures
This lesson uses spot moneyness K/S and ACT/365-like maturity for education. Production equity, FX and rates surfaces require their native forward, delta, premium, ATM and normal/lognormal conventions.
Notation, units and exact claims.
k = log(K/F_T): log-forward moneynessw(k,T) = σ_imp²(k,T)T: total implied varianceC(K,T): call-price surfaceσ_loc(K,T): local volatilitySurface coordinate
Forward log-moneyness makes strike geometry comparable across maturities.
Total variance
Many no-arbitrage and interpolation questions are more naturally expressed in total variance than volatility.
Risk-neutral density
Convex call prices imply a non-negative risk-neutral terminal density.
Dupire local variance
A sufficiently smooth arbitrage-consistent vanilla surface identifies one local-volatility diffusion.
Do not jump to the final expression.
From a call-price surface to local volatility
Dupire’s result is an inversion of the forward equation. It shows why surface smoothness and convexity are numerical requirements, not styling preferences.
- 01
Assume risk-neutral local dynamics
Let instantaneous volatility depend on state and time while the drift remains risk-neutral.
- 02
Write the forward density equation
The transition density evolves under the Fokker–Planck equation associated with the diffusion.
- 03
Differentiate option prices by strike
Breeden–Litzenberger links the strike curvature of call prices to the discounted risk-neutral density.
- 04
Differentiate by maturity
Insert the forward density evolution into the maturity derivative of the call payoff integral and integrate by parts.
- 05
Isolate local variance
Rearrange the resulting forward PDE. A non-positive denominator or noisy derivative makes the inferred local variance unstable.
A surface is simultaneously market data, an interpolation object and an input to dynamics. Those roles should never be silently conflated.
Fit, compute, then challenge the assumptions.
Normalize option quotes, infer implied volatilities, choose a stable coordinate system, fit each slice, connect maturities and validate reconstructed premiums and static-arbitrage diagnostics.
The educational workbench exposes level, skew, curvature and term slope directly. Production calibration minimizes weighted premium or volatility errors subject to stability, liquidity and no-arbitrage constraints.
Sparse wings force extrapolation choices.
A perfect static fit does not guarantee realistic forward dynamics.
Volatility-space interpolation can hide option-price arbitrage.
Static fit is not dynamics.
| Question | Black–Scholes | Local volatility | Heston |
|---|---|---|---|
| Volatility state | One constant σ | σ(S,t) deterministic | vₜ stochastic |
| Fits today’s surface | No | Exactly, in ideal theory | Approximately by calibration |
| Forward dynamics | Flat smile | Spot-driven | Variance + correlation driven |
| Primary strength | Transparent baseline | Vanilla-consistent diffusion | Richer smile dynamics |
| Primary failure | No smile | Often unrealistic forward skew | Parameter and calibration instability |
| Compute | Low | Medium: PDE/MC | Medium–high: Fourier/PDE/MC |
| Hedge implication | Greeks at one σ | State-localized vol hedge | Variance and vol-of-vol risk |
Implementation with current QuantLib
Current QuantLib 1.42 introduced PiecewiseBlackVarianceSurface for ragged grids and provides Black variance surfaces, smile sections and SABR structures. A library supplies tested representations; the user must still choose conventions, quotes, interpolation and extrapolation deliberately.
API authority: upstream QuantLib reference pinned in the source registry.Theory → implementation → checks.
Vectorized educational surface
Build one deterministic surface grid with explicit parameters, units and sanity checks.
from __future__ import annotations from dataclasses import dataclassimport numpy as npfrom numpy.typing import NDArray FloatArray = NDArray[np.float64] @dataclass(frozen=True)class SurfaceShape: atm: float = 0.20 skew: float = -0.18 curvature: float = 0.55 term_slope: float = 0.025 def educational_surface( log_moneyness: FloatArray, maturity: FloatArray, shape: SurfaceShape,) -> FloatArray: """Return a deterministic teaching surface; never market data.""" if np.any(maturity <= 0.0): raise ValueError("maturity must be positive") vol = ( shape.atm + shape.skew * log_moneyness + shape.curvature * log_moneyness**2 + shape.term_slope * np.log1p(maturity) ) return np.maximum(vol, 0.01) tenors = np.array([7 / 365, 30 / 365, 0.25, 0.5, 1.0, 2.0])moneyness = np.linspace(0.70, 1.30, 25)k = np.log(moneyness)[None, :]t = tenors[:, None]surface = educational_surface(k, t, SurfaceShape()) assert surface.shape == (tenors.size, moneyness.size)assert np.isfinite(surface).all() and np.all(surface > 0.0)print(f"ATM 1Y: {surface[4, 12]:.2%}")One surface, four linked views.
Where the model meets the book.
“The mark is a surface. The hedge is a view about how that surface moves.”
bid/offer vanilla grid
spot and forwards
discount/dividend curves
corporate-action calendar
expiry/settlement conventions
Fit liquid nodes more strongly, preserve bid/offer awareness and inspect residuals in premium as well as volatility space.
RISKvega buckets
vanna and volga
skew/term scenarios
spot-vol correlation
calendar roll
- ingest and timestamp quotes
- normalize strikes/deltas
- clean crossed or stale nodes
- fit
- reprice quotes
- publish surface and risk
- monitor drift
Production failure modes
- stale spot or forward
- calendar-arbitrage from interpolation
- wing extrapolation instability
- quote holes
- parameter jumps across recalibrations
- cache and version mismatch
Map the transmission channel.
A surface is a map of event pricing
Macro regimes affect the level, asymmetry and timing of protection demand rather than moving every option uniformly.
changes policy and earnings distribution
move carry and moneyness coordinates
changes downside protection demand
reprices level, skew and term structure
Most failures begin outside the formula.
Treating a smooth plot as proof of no arbitrage.
Mixing spot and forward moneyness.
Fitting mid quotes without spreads or liquidity weights.
Using a static surface as a claim about future smile dynamics.
Showing synthetic scenarios as market observations.
Attribution with implementation authority.
Lectures 04 and 07 — implied and stochastic volatility
Research path for the volatility progression; all explanations and implementation are original.
- Source
- Computational Finance Course
- Author
- L. A. Grzelak
- Ref
- main
ql/termstructures/volatility and QuantLib 1.42 release notes
Current implementation reference for smile sections, SABR and variance-surface representations.
- Source
- QuantLib upstream
- Author
- QuantLib contributors
- Ref
- v1.42.1