The Volatility Surface and Term Structure
The smile
and skew page fixed one expiry and let strike vary. Now let the expiry vary too.
Pull implied vols for the one-month, three-month, six-month and one-year options on the same
underlying, and the skew you saw for one-month options is not the skew you see for
one-year options — it is usually far gentler. Implied volatility, it turns out, is not really a
curve at all. It is a full surface,
\sigma_{\text{imp}} = \sigma_{\text{imp}}(K, T),
a two-dimensional function of both strike and time to expiry. The strike direction is
the smile/skew you already know; the maturity direction is called the
volatility term structure. A trading desk's real quoting problem is this whole
surface at once, not a single slice of it.
Why the skew flattens with maturity
The empirical pattern is remarkably consistent across markets: the skew is steep for
short-dated options and flattens out as maturity lengthens. A one-week put can trade at
an eye-watering implied vol relative to the at-the-money level; a two-year put on the same stock
shows only a mild tilt.
There's a genuine mathematical reason. Think of the stock's return over a long horizon
T as built from many smaller, roughly independent return increments
compounding together — day by day, or even tick by tick. Whatever "extra crash risk" (excess
kurtosis, beyond what a Gaussian allows) sits in each small increment, a classical fact about
sums of independent random variables is that the excess kurtosis of the sum shrinks like
1/T as more increments pile in — the same mechanism behind
the Central Limit Theorem pulling any sum-of-many-pieces distribution toward Gaussian. Short
horizons barely average anything away, so their non-normality — and the skew that prices it — is
large. Long horizons average a great deal of it away, and the skew relaxes toward
Black–Scholes's flat line, though it rarely reaches it exactly.
Watch the skew flatten, live
Drag the maturity slider from a few weeks out to two years and watch the same mechanism play
out on screen: the curve's wings pull in toward the flat line as T
grows, exactly as the kurtosis argument predicts.
Pricing the option nobody quoted: interpolating the surface
A client calls asking for a nine-month, 105-strike option. The exchange only lists standard
strikes and standard maturities (one month, three months, six months, one year, …), and this
combination isn't one of them. The desk cannot refuse to quote — so it interpolates
across the surface it already has.
Two dimensions, two different rules of thumb:
-
Across strike, interpolate the smile/skew shape itself — typically as a
smooth function of moneyness (a spline, or a simple parametric skew like the one on the
previous page) fitted to the quoted strikes at each available maturity.
-
Across maturity, the right quantity to interpolate is not volatility itself
but total variance, \sigma^2 T. Variance is
(approximately) additive over time — the variance accumulated from today to one year
out is roughly the variance from today to six months, plus the variance from six months to one
year — so linear interpolation behaves far better in variance space than in volatility space,
where that additivity simply doesn't hold.
Worked example. Suppose the desk's grid shows a six-month at-the-money vol of
20.5\% and a one-year at-the-money vol of
19.0\% (a mildly downward-sloping term structure). What
forward volatility is being priced in between six months and one year?
Convert both to total variance, subtract, and annualise:
\sigma_{6m,1y}^2 = \frac{\sigma_{1y}^2\,T_{1y} - \sigma_{6m}^2\,T_{6m}}{T_{1y} - T_{6m}} = \frac{0.19^2(1) - 0.205^2(0.5)}{1 - 0.5} = \frac{0.0361 - 0.02101}{0.5} \approx 0.03018.
\sigma_{6m,1y} = \sqrt{0.03018} \approx 17.4\%.
The forward vol between six months and a year, 17.4\%, sits
below both quoted spot vols — a direct, quantitative echo of the flattening term
structure: the market expects the calmest volatility regime to arrive later, not sooner.
| Maturity T | 0.25y | 0.5y | 1y | 2y |
| Quoted at-the-money vol | 22.0% | 20.5% | 19.0% | 18.5% |
Here is that same grid, coded up: a function that interpolates total variance across the quoted
maturities to get an at-the-money vol at any in-between date, then layers a
maturity-dependent skew on top to price an arbitrary strike:
// A small term-structure grid of quoted at-the-money implied vols.
const gridT: number[] = [0.25, 0.5, 1.0, 2.0];
const gridVol: number[] = [0.22, 0.205, 0.19, 0.185];
// Interpolate TOTAL VARIANCE (σ²T), not volatility — variance is roughly additive over time, vol is not.
function totalVariance(T: number): number {
for (let i = 0; i < gridT.length - 1; i++) {
const T0 = gridT[i], T1 = gridT[i + 1];
if (T >= T0 && T <= T1) {
const var0 = gridVol[i] * gridVol[i] * T0;
const var1 = gridVol[i + 1] * gridVol[i + 1] * T1;
const w = (T - T0) / (T1 - T0);
return var0 + w * (var1 - var0); // linear interpolation in variance space
}
}
const edge = T < gridT[0] ? 0 : gridT.length - 1; // outside the grid: hold the nearest vol flat
return gridVol[edge] * gridVol[edge] * T;
}
function atmVolAt(T: number): number {
return Math.sqrt(totalVariance(T) / T);
}
// Layer a strike skew on top (steeper for short T, per the flattening argument above).
function skewSlope(T: number): number {
return 0.5 / Math.sqrt(T);
}
function surfaceIV(S0: number, K: number, T: number): number {
const m = Math.log(K / S0);
return atmVolAt(T) - skewSlope(T) * m;
}
const S0 = 100;
console.log(`interpolated ATM vol at T=0.75: ${(atmVolAt(0.75) * 100).toFixed(3)}%`);
console.log(`surface IV at K=105, T=0.75 (client): ${(surfaceIV(S0, 105, 0.75) * 100).toFixed(3)}%`);
console.log(`surface IV at K=90, T=0.75: ${(surfaceIV(S0, 90, 0.75) * 100).toFixed(3)}%`);
Nine months was never quoted directly — but by respecting how variance and skew each actually
behave, the desk turns four quoted maturities into a price for any strike and expiry a
client asks for.
Yes — interpolation is a stopgap, and serious pricing desks go further. A
local volatility model (Dupire, 1994) constructs a single function
\sigma_{\text{loc}}(S, t) that reproduces every quoted price on the
surface exactly, by treating volatility as a deterministic function of the
current stock price and time. Stochastic volatility models (Heston and
its relatives) go further still, letting volatility itself be a second random process — closer
to how markets actually seem to behave, at the cost of a much harder calibration problem. Both
exist for the same reason as this page's simple interpolation: Black–Scholes gives you one
number, and the market is quoting an entire surface.
This is one of the most consistently confused ideas in the whole subject, so it is worth being
precise. Two entirely different questions get conflated:
-
"What will volatility actually turn out to be?" is answered by looking
backward at a time series of past returns and estimating — this is
realized (or historical) volatility, and the standard toolkit for modelling
and forecasting it is
GARCH
models, which fit clustering and mean-reversion patterns directly to the returns
themselves. No option prices are involved anywhere in a GARCH estimate.
-
"What does the option market currently charge for volatility exposure?" is
answered by the implied vol surface — a snapshot of current option prices,
translated into Black–Scholes's units. It says what the market is willing to pay, not
what will happen.
The two are related — traders explicitly bet on the gap between them using
variance swaps, contracts that pay out the difference between realized variance
over some period and a variance rate agreed today (closely tied to the implied surface). But
related is not identical: empirically, implied volatility has historically tended to sit
above the realized volatility that subsequently materializes, on average — the
so-called variance risk premium, the compensation option sellers earn for
bearing the risk of the rare, ugly tail events that occasionally blow straight through it.
Quoting a GARCH forecast when someone asks for an implied vol (or vice versa) is answering the
wrong question with the wrong number.