SABR¶
Overview¶
The SABR stochastic volatility model (Hagan, Kumar, Lesniewski & Woodward 2002) — the market standard for interest-rate (swaptions, caps/floors) and FX volatility smiles. Unlike the SVI family, SABR is a dynamic model: it specifies stochastic differential equations for the forward and its volatility, rather than a static smile shape.
Model¶
Forward dynamics:
Implied volatilities come from the Hagan et al. asymptotic expansion (the “HKLW formula”):
with log-moneyness ratio and wing-correction series
and the vol-of-vol transform
At the money the singular factor tends to one and is handled via Taylor expansion:
Total variance is then
Parameters¶
Parameter |
Meaning |
Constraint |
|---|---|---|
\(\alpha\) |
initial volatility level |
\(\alpha > 0\) |
\(\beta\) |
CEV exponent (fixed, not fitted) |
\(0 \leq \beta \leq 1\) |
\(\rho\) |
spot/vol correlation |
\(|\rho| < 1\) |
\(\nu\) |
vol-of-vol |
\(\nu \geq 0\) |
Following market practice, \(\beta\) is fixed by convention rather than calibrated:
\(\beta = 1\) (lognormal) for FX and equity
\(\beta \approx 0.5\) for interest rates
\(\beta = 0\) (normal) for spread-like underlyings
Usage¶
Calibration fits \((\alpha, \rho, \nu)\) per slice given \(\beta\), \(F\), \(T\):
from pysvi import get_model, calibrate_slice
model = get_model("sabr")
T = float(df_slice["maturity"].iloc[0])
F = float(df_slice["implied_forward"].iloc[0])
params = calibrate_slice(df_slice, model, T=T, F=F, beta=0.5)
# params: {'alpha', 'beta', 'rho', 'nu', 'F', 'T', 'forward'}
Arbitrage behaviour¶
The HKLW expansion is accurate near the money and for moderate maturities, but is known to lose accuracy (and can even imply negative densities) for deep wings or very long maturities. NO_BUTTERFLY performs a numerical density check via finite differences — it is a guard, not a structural guarantee. NO_CALENDAR is supported via w_prev — see Arbitrage freeness.
References¶
Hagan, P., Kumar, D., Lesniewski, A., Woodward, D. (2002). “Managing Smile Risk”, Wilmott Magazine.
Obloj, J. (2008). “Fine-tune your smile: Correction to Hagan et al.” — improved accuracy for \(\beta < 1\).