MORPHIQLABS
Ferro Suite5 min read

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 k=log(K/F)k = \log(K/F) the log-moneyness, Gatheral's raw SVI is

w(k)  =  a  +  b(ρ(km)  +  (km)2+σ2)w(k) \;=\; a \;+\; b\left(\rho\,(k - m) \;+\; \sqrt{(k - m)^2 + \sigma^2}\,\right)

Five parameters carry a clear reading:

  • aa shifts the overall variance level,
  • b0b \ge 0 sets the angle between the two asymptotic wings,
  • ρ(1,1)\rho \in (-1, 1) is the skew — the counter-clockwise rotation,
  • mm translates the smile along the moneyness axis,
  • σ>0\sigma > 0 controls how rounded the vertex is.

Total variance scales with maturity, so working in w=σBS2tw = \sigma_{\text{BS}}^2\,t rather than σBS\sigma_{\text{BS}} 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

g(k)  =  (1kw(k)2w(k))2    w(k)24(1w(k)+14)  +  w(k)2g(k) \;=\; \left(1 - \frac{k\,w'(k)}{2\,w(k)}\right)^{2} \;-\; \frac{w'(k)^2}{4}\left(\frac{1}{w(k)} + \frac{1}{4}\right) \;+\; \frac{w''(k)}{2}

The implied density is then

p(k)  =  g(k)2πw(k)  exp ⁣(d(k)22),d(k)  =  kw(k)    w(k)2p(k) \;=\; \frac{g(k)}{\sqrt{2\pi\,w(k)}}\; \exp\!\left(-\frac{d_-(k)^2}{2}\right), \qquad d_-(k) \;=\; -\frac{k}{\sqrt{w(k)}} \;-\; \frac{\sqrt{w(k)}}{2}

Every factor except g(k)g(k) is manifestly positive, so the slice is butterfly-free iff g(k)0g(k) \ge 0 for all kk. 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:

w(k,t)t    0for all k\frac{\partial w(k, t)}{\partial t} \;\ge\; 0 \qquad \text{for all } k

Geometrically: in (k,w)(k, w) space the slices must never cross. If a longer-dated slice dips below a shorter-dated one at some kk, a calendar spread struck there has negative time value.

How ferro-risk fits a slice

Calibration minimizes a weighted squared error in total variance:

mina,b,ρ,m,σ  iωi(w(ki)wimkt)2\min_{a,\,b,\,\rho,\,m,\,\sigma}\; \sum_{i} \omega_i \,\bigl(w(k_i) - w_i^{\text{mkt}}\bigr)^2

with weights ωi\omega_i 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:

  1. Reduce the dimension. For fixed (m,σ)(m, \sigma) the model is linear in (a,b,bρ)(a, b, b\rho). The inner problem is an ordinary constrained least squares; only the outer (m,σ)(m, \sigma) search is genuinely nonlinear. This is the quasi-explicit calibration of Zeliade's note, and it makes the fit fast and repeatable.
  2. Project onto the no-arbitrage set. After each candidate fit, evaluate g(k)g(k) on a dense grid spanning the wings. If minkg(k)<0\min_k g(k) < 0, add a penalty proportional to the violation and re-solve. The accepted fit satisfies g(k)0g(k) \ge 0 by construction.
  3. 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 tw0\partial_t w \ge 0 holds on the grid.

Diagnostics that ship with the fit

A number without an error bar is a liability, so every calibrated slice carries:

DiagnosticDefinitionReading
RMSE (vol points)1n(σiσimkt)2\sqrt{\frac1n \sum (\sigma_i - \sigma_i^{\text{mkt}})^2}Raw fit quality
minkg(k)\min_k g(k)Butterfly margin on the grid0\ge 0 required; near 0 is fragile
Calendar gapminktw\min_k \partial_t w0\ge 0 required
Wing extrapolationSlope of ww as k±k \to \pm\inftyShould match Lee's moment bounds

The last row is a reminder that SVI's wings are linear in kk, 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 ww twice — so any arbitrage left in the fit is amplified downstream into a negative local variance. Getting g(k)0g(k) \ge 0 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…