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:

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 T0.25y0.5y1y2y
Quoted at-the-money vol22.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:

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.