SVI and the No-Arbitrage Volatility Surface
The raw SVI parametrization is five numbers per slice. Keeping a fitted surface free of butterfly and calendar arbitrage is where the real work — and the real math — lives.
By MorphIQ Labs Research Notes
An implied-volatility surface is a deceptively small object: a function from log-moneyness and maturity to a single number. The trouble is that not every such function corresponds to a market. A surface that prices a butterfly spread at a negative cost, or lets a longer-dated option be worth less than a shorter one, is not merely inaccurate — it is arbitrageable, and any model built on it will happily trade into the hole.
This post walks through how ferro-risk fits the SVI parametrization and,
more importantly, how it keeps the fit honest.
The raw SVI slice
Work in total implied variance rather than volatility. For a single maturity slice, with the log-moneyness, Gatheral's raw SVI is
Five parameters carry a clear reading:
- shifts the overall variance level,
- sets the angle between the two asymptotic wings,
- is the skew — the counter-clockwise rotation,
- translates the smile along the moneyness axis,
- controls how rounded the vertex is.
Total variance scales with maturity, so working in rather than keeps the slices on a comparable footing and makes the calendar condition below clean to state.
Butterfly arbitrage: the density must be a density
A slice is free of butterfly arbitrage exactly when the risk-neutral density it implies is non-negative everywhere. Following Gatheral and Jacquier, define the auxiliary function
The implied density is then
Every factor except is manifestly positive, so the slice is butterfly-free iff for all . That reduces a statement about option prices to a single scalar inequality on the fitted curve.
Calendar arbitrage: slices must not cross
The second condition is across maturities. Total variance must be non-decreasing in time at every fixed log-moneyness:
Geometrically: in space the slices must never cross. If a longer-dated slice dips below a shorter-dated one at some , a calendar spread struck there has negative time value.
How ferro-risk fits a slice
Calibration minimizes a weighted squared error in total variance:
with weights taken from quoted size and bid-ask width — a tight, liquid quote pulls harder than a stale one. The five-parameter problem is too small to need anything exotic, but it is not convex, so the recipe matters:
- Reduce the dimension. For fixed the model is linear in . The inner problem is an ordinary constrained least squares; only the outer search is genuinely nonlinear. This is the quasi-explicit calibration of Zeliade's note, and it makes the fit fast and repeatable.
- Project onto the no-arbitrage set. After each candidate fit, evaluate on a dense grid spanning the wings. If , add a penalty proportional to the violation and re-solve. The accepted fit satisfies by construction.
- Enforce calendars globally. Slices are not fitted in isolation. After all maturities are fit, a sweep checks the crossing condition and nudges offending slices until holds on the grid.
Diagnostics that ship with the fit
A number without an error bar is a liability, so every calibrated slice carries:
| Diagnostic | Definition | Reading |
|---|---|---|
| RMSE (vol points) | Raw fit quality | |
| Butterfly margin on the grid | required; near 0 is fragile | |
| Calendar gap | required | |
| Wing extrapolation | Slope of as | Should match Lee's moment bounds |
The last row is a reminder that SVI's wings are linear in , which is exactly the Roger Lee moment-formula regime — a fitted slice that extrapolates sanely is not a coincidence, it is the parametrization doing its job.
Where this connects
A clean surface is an input, not an end. The local-volatility extraction (Dupire) that feeds the scenario engine differentiates twice — so any arbitrage left in the fit is amplified downstream into a negative local variance. Getting here is what makes the chain-risk and scenario-PnL work in the rest of the Ferro suite trustworthy. We will take up the Dupire step, and the SSVI surface-level parametrization that ties the slices together, in a follow-up.
More from Ferro Suite
July 6, 2026 · 1 min
Wavelet Feature Extraction for Time-Series ML Pipelines
Time-series ML fails quietly when the feature layer ignores scale. A price series, volatility series, or sensor stream may look like one signal, but its behavior is usually a mixture of fast noise, medium-horizon stru…
July 6, 2026 · 2 min
What a Rust Options Pricing Engine Has to Prove
A Rust options pricing engine usually gets judged by surface area first: how many models, how many Greeks, how fast the implied-volatility solver runs. That is necessary, but it is not enough. The harder question is w…
July 6, 2026 · 1 min
Rust Market Data Normalization Starts at the Boundary
Market-data infrastructure becomes fragile when every downstream component learns a different venue dialect. One feed calls it a trade condition, another calls it a flag. One stream uses exchange timestamps, another c…