How it works

Everything the interactive page explains in passing, written out in one piece. The surfaces themselves are on the main page; notes and corrections go here.

What this is, and where it fails

The model in one line. σ(K,τ) = σATM(τ)·Φ(k; c₁,c₂,c₃), with k = log(K/F)/(σATM√τ) and log σATM carried by two factors in activity time. Three numbers for the shape, three for the curve. Every one of them is read out of the day's quotes rather than calibrated.

Where it lands. Over eighteen days spanning 2015 to 2023: SPX smiles reprice to 0.25 vol points median, the futures curve to 1.5%, the VIX smile inside its bid-ask on four maturity buckets out of five. On a calm day like 11 February 2016 everything lands at a fraction of its half-spread.

Where it strains. The shortest SPX maturities are quoted extremely tight — a 0.06-point half-spread at 24 days — and three shape numbers cannot follow that: 0.7 vol points is good in absolute terms and twelve times the spread in relative ones. Deep crisis days are the other limit.

The known weakness of this family. Market models of implied volatility carry a no-arbitrage drift condition that is severely constraining and near-impossible to satisfy exactly. This model does not impose it. The shape is read and propagated; nothing guarantees the surface stays arbitrage-free under the dynamics given to it. For pricing against today's quotes that is acceptable — every number here is measured against the market it came from. For propagating over months it is a real limitation.

The futures curve, and the two factors that build it

Four lines: the level alone, then what each factor adds, then the model, against the quoted market. The VIX is the thirty-day log-contract of the SPX, so this curve costs no extra model — it is the scale curve, integrated. It lands within about 1.5% of the quotes.

Why two factors, and why the clock is not the calendar

Short factor · 42-day half-life. One of the two that carry the term structure. A single factor cannot: a 20-day half-life would force vol(180d)/vol(30d) = 0.006 when the market quotes 0.506, ninety-two times more. Measured across 3 462 days and ten maturities, two factors leave a residual of 0.032 against 0.124 for one and 0.051 for a pure power law. This is Bergomi's structure, laid on marginals — no instantaneous volatility appears anywhere.

And it does not revert in calendar days. The market's clock runs on ∫V dt — exponent measured at 1.00 at every maturity, by a ratio of two derivatives with no assumption on the shape of anything, and the same clock shows up under the historical measure. So 42 days of activity is worth 68 calendar days at 10% volatility and 7.5 at 90% — the conversion is the volatility ratio 0.16/V. Crisis curves get their steepness from this and nothing else.

The long factor

Long factor · 453-day half-life. The anchor. It barely moves day to day, which is exactly why the far end of the futures curve does not collapse the way a single short factor would have it. Chart 1 draws its contribution separately.

The level of the forward log-contract

The whole scale curve rides on this. It is the forward variance the two factors decay towards — raise it and every maturity lifts together.

The shape of a smile, in five numbers

Smile shape · slope. The first of up to five numbers describing the whole smile, once reduced: σ(K,τ) = σATM(τ)·Φ(k) with k = log(K/F)/(σATM√τ). Across 76 696 smiles the five account for 99.8% of the variance and reprice to 0.024 vol points. Nothing is optimised — the shape is projected, not fitted.

How many are used depends on what the chain can identify. A maturity only supports the directions its strikes actually span. On 16 March 2020, at 80% vol, the quoted chain covers reduced moneyness from −1.5 to +0.55 only — five directions there extrapolate wildly, and repriced at 3.3 vol points instead of 0.9. So the count follows the span: five when it is wide, down to two when it is not.

And quotes are weighted by their spread. At the money a quote is firm to a few hundredths of a point, in the wings it opens to several tenths. Weighting everyone equally let the wings, more numerous, crush the money — the error there ran 1.9 half-spreads against 0.4 in the put wing. Weighted by the inverse squared spread it falls to 1.1, and to 0.8 past six months.

Why the smile and not the density. An earlier version reduced the density instead. It passed every diagnostic and was quietly wrong: a density puts its asymmetry in tails that lie outside the quoted strikes, so reducing it there destroyed 60 to 78% of the skew — a smile read at −3.4 came back at −0.9. Implied volatility is bounded, smooth, and it is what the market quotes. Same spirit, right variable.

Curvature

Second of the three directions. Moves the wings against the belly.

Wings

Third direction, and the smallest — it earns its place by taking the reprice from 0.10 to 0.05 vol points, which is the difference between sitting outside a typical bid-ask and inside it.

Reading an SPX smile

SPX options. Same reading as the VIX panel.

Hollow points are not read. A strike only enters the reduction if its standardised moneyness falls inside the range where the model's directions were measured — at 24 days a strike 27% below the forward sits at k = −12, far outside. Those are drawn as open circles and are not clickable: quoted, but mute. Including them was tested and makes the fit worse (0.249 → 0.335).

Click a filled point to drop that quote. Forward, smile, curve and vol-of-vol are recomputed without it, and the reading panel reports how far it moved things. The point stays drawn, crossed out; click again to restore. One quote out of 124 shifts the reading by a basis point — which is the correct behaviour, and why a genuinely corrupted block is what shows up.

Reading a VIX smile

VIX options. One maturity at a time. The coloured line is the market mid, bracketed by its bid-ask band; the white line is the model.

It now sits inside the bid-ask on four maturity buckets out of five. It runs wide past six months, and on the shortest maturities — where the half-spread itself is ten vol points and nothing much can be concluded either way.

Vol-of-vol is read, not assumed

Vol-of-vol, short factor. The factors have a volatility and it is not a constant: at equal VIX level the quoted dispersion runs from 0.18 to 0.48. Holding it fixed served the same law every day and put the VIX smile ten times outside its spread. So it is read too — both volatilities and their correlation, fitted on the dispersions the day's VIX smiles imply.

The ×N shown is not a risk premium. It compares today's reading to a fourteen-year average, and the vol-of-vol moves under the historical measure as well — March 2020 priced a huge dispersion and then realised a huge one. Calling that a premium confuses a regime with a reward.

What the risk premium actually is

Vol-of-vol, long factor. See the short one for how it is read. What the two say together is sharp: in crisis they split apart — the short one runs three to five times its long-run average while the long anchor falls below it.

The actual premium is far smaller. Measured properly — implied dispersion at thirty days against what the VIX went on to realise, over 2 577 days — it is 1.00 unconditionally: implied 0.2285 against realised 0.2293, nothing at all. In annual blocks the median is 1.20, positive in ten years out of fourteen (t = 2.5). And it is not uniform: 1.42 in the top quintile of implied dispersion against 0.83 in the bottom. One is paid for selling dispersion only when the market is already pricing a lot of it.

The VIX smile's own shape

VIX smile shape. The VIX has its own quoted options, so its marginal is read and reduced exactly like the index's — three numbers, measured on 22 317 smiles, repricing to 0.28 vol points. What stays with the model is the scale: the dispersion the two factors produce, which is right to the third decimal (0.198 against 0.197 quoted at 20 days, 0.305 against 0.306 at 90). The shape says how that dispersion spreads across strikes; the model says how much of it there is.

The curve of scales

What the model actually carries. One dot per marginal read, against the curve the two factors produce. The teal line is the forward log-contract; the white one is volatility at the money, which follows from it through the shape. The curve carries the log-contract and not the at-the-money vol, because it is the log-contract that adds up through time and that the VIX quotes.

The SPX-VIX basis: two prices for one payoff

The VIX settlement is a formula applied to SPX option prices, so the same payoff can be bought from the VIX strip or from the SPX log-contract that replicates it. Teal is √E[VIX²], white is the same with convexity removed — E[VIX], what a future can cost — and amber is the quoted curve. The model's recoupling factor is deliberately not applied here, since erasing this gap is what it does elsewhere.

Most of the visible gap is convexity, not opportunity. Jensen alone accounts for a median 3.2% at thirty days, 10.5% on 5 February 2018 and 19.3% on 16 March 2020. What remains is the real basis, and it is small: −3.2% at thirty days in median, about half a percent at three and six months, and it changes sign across dates.

What is left does not survive execution. Two back-tests on this exact structure — 45 monthly positions, 2022 to 2026, settled in the Wednesday opening auction on real quotes — die at the same place: crossing the quoted spread on the ~500 option lines the package needs costs several times the gross edge. Nothing about the signal fails; the trade ticket does. Which is why this page is a measuring instrument and not a strategy.

Priced crisis intensity

History can never pin down crisis parameters — a couple of arrivals per year means a finite sample is always too small. But the market prices them every day: at long maturities the fast component has Gaussianised away, so the third cumulant there is almost pure regime risk. With one structural constant (jump size μ = 0.35), λ(t) is read off each day's cross-section — no optimiser, no history. Barely elevated at the peak of COVID (the crisis had already arrived), persistently doubled over 2021-2023.

In more depth

Why the VIX is the 30-day log-contract of the SPX

The VIX is not a market price. It is a formula applied to SPX option prices — a weighted sum of out-of-the-money puts and calls, each weighted by ΔK/K². That weighting is not arbitrary: it is exactly the portfolio that replicates −2·E[log(S_T/F)], the log-contract. So the VIX settlement is the forward variance of the SPX over the next thirty days, computed from the SPX chain itself.

Two consequences follow, and this site is built on both. First, the VIX futures curve is not a second model — it falls out of the same reading that produces the SPX smiles, integrated. Second, the same payoff can be bought twice: from the VIX strip, or from the SPX options that replicate it. The gap between those two prices is measurable, and chart 5 shows it.

What that gap mostly contains is convexity, not opportunity. A future quotes E[VIX]; the log-contract gives √E[VIX²], which is larger by Jensen's inequality. Measured here, that alone accounts for a median 3.2% at thirty days — and 19.3% on 16 March 2020. What remains after removing it is small: about −3.2% at thirty days, half a percent at three and six months, and it changes sign across dates.

Reading a risk-neutral density from a real option chain

Breeden and Litzenberger showed in 1978 that the risk-neutral density is the second derivative of the call price with respect to strike. On paper it is one line. On a real chain it is where most of the difficulty lives, and the failures are instructive.

Differentiate the volatility, not the price. Quoted prices carry tick-level noise; differentiating them twice amplifies it into a density that oscillates and goes negative. Smoothing implied volatility in log-moneyness first, then rebuilding prices, gives something usable — at the cost of imposing whatever smoothness the smoother has.

The forward must be extracted, not assumed. Put-call parity gives it, but a handful of corrupted quotes will drag the regression: on one date here, four strikes with a parity residual of +4 moved the implied forward by more than a point. Iterative rejection at several times the median absolute deviation fixes it.

The tails are outside the quoted range, and they carry the skew. This is the trap that cost the most here. Reducing a density to a few numbers destroyed 60 to 78% of the skew — a smile read at −3.4 came back at −0.9 — because the asymmetry lives in tails no strike quotes. Reducing the implied volatility instead, which is bounded and smooth over the quoted range, keeps it.

Implied volatility from bid and ask, not from the mid

Taking the mid quote and computing one implied volatility throws away the half of the information that says how much that number can be trusted. At the money an SPX quote is firm to a few hundredths of a volatility point; in the wings it opens to several tenths. Those two numbers should not carry the same weight, and here they do not.

The effect is measurable and it was the opposite of what one expects. Scored in units of half-spread rather than volatility points, the error was not in the wings — it was at the money: 1.88 half-spreads against 0.40 in the deep put wing. The wings, more numerous and loosely quoted, were dominating the fit by sheer count and crushing the region where precision matters. Weighting each quote by the inverse squared spread brings the money to 1.10, and to 0.79 beyond six months.

The general lesson: a fit that looks good in volatility points can be bad everywhere that matters, because volatility points are not the unit the market trades in.

How many factors does the VIX futures curve need?

One is not enough, and the miss is not marginal. A single mean-reverting factor with a 20-day half-life forces the volatility of the 180-day future to be e^(−160·ln2/20) times that of the 30-day one, which is 0.006. The market quotes 0.506 — ninety-two times more.

Measured across 3 462 dates and ten maturities, on daily changes of the quoted futures:

one factor, residual 0.124 · a pure power law in maturity, 0.051 · two factors, half-lives 42 and 453 days, 0.032.

Two factors also pass a test one factor cannot: the same two time constants, measured on daily changes and then imposed with no per-date adjustment, describe the static shape of the futures curve to 0.128 VIX points — against a bid-ask of about 0.05. Dynamics and shape agree.

The clock is not the calendar: reversion in activity time

The two factors do not revert in calendar days. They revert in days of activity — and this is measured, not assumed.

The test is a ratio of two derivatives, which needs no assumption about the shape of anything. If dispersion is a function of T·V^a alone, then (∂log sd/∂log V) / (∂log sd/∂log T) = a. Measured on 161 quoted VIX densities spanning 18 dates, that ratio comes out at 1.00 at 30, 60, 90 and 120 days, with no prefactor. The clock runs on ∫V dt. The same exponent shows up independently under the historical measure, where the dispersion of the log-VIX scales as V^0.45 across 3 030 fitted kernels — the ½ that a clock ticking at the rate of market activity predicts.

What it changes in practice: a 42-day half-life in activity time is worth 68 calendar days at 10% volatility and 7.5 at 90% — the conversion is the volatility ratio 0.16/V and nothing else. Crisis curves get their steepness from this and from no extra parameter. Ignoring it left the March 2020 futures curve at 7.9% error; applying it brought it to 2.6%.

Why joint SPX–VIX calibration is hard, and what is done here instead

The standard difficulty is well known: a model that fits the SPX smile usually misses the VIX smile, and forcing both tends to break one of them. The literature on it is real and largely paywalled.

The approach here sidesteps the usual formulation rather than solving it. Nothing is calibrated to both markets at once, because nothing is calibrated at all: each smile is read and projected, and the consistency comes from the structure — the VIX being the SPX log-contract by construction, so its curve cannot drift away from the SPX reading without the residual showing.

What is left is honest to report. The residual basis after convexity is a few percent and changes sign. The VIX smile needs its own shape numbers, read from VIX options, because the shape read on the index cannot carry the VIX's positive skew — it tops out near 1.1 where VIX options want 1.3 to 2.2. And the vol-of-vol must be read daily rather than held fixed: at equal VIX level the quoted dispersion runs from 0.18 to 0.48, and holding it constant put the VIX smile ten times outside its spread.

Extrapolating implied volatility beyond the quoted strikes

Every reduction eventually needs a value where nothing is quoted, and the naive choice — continue the slope of the last quoted strike — is wrong in a way that is easy to miss and expensive to keep.

Lee's moment formula bounds it: implied variance can grow at most linearly in log-moneyness at extreme strikes, so implied volatility can grow at most like the square root of it. Continuing the edge slope in a straight line violates that bound in the limit — and it does damage well before the limit, because the log-contract lives in exactly that wing.

Measured here: with a straight-line left wing, the SPX forward variance came out 22% above the VIX future at one year and 87% above it at the peak of March 2020. Switching the extrapolation to square root brought those to 11% and 39% — the order of magnitude of convexity, which is what should remain.

Model-free cumulants from an option chain

Bakshi, Kapadia and Madan showed that the risk-neutral variance, skewness and kurtosis of the log-return can be recovered from option prices alone, with no model, as weighted integrals over the strike range. It is one of the few places in derivatives where a distributional quantity is genuinely observable.

Used here for something specific. At long maturities the fast component of volatility has Gaussianised away, so the third cumulant there is almost pure regime risk. Holding one structural constant — a jump size of 0.35 — the arrival intensity λ(t) can be read off each day's cross-section with no optimiser and no history at all. The series runs daily from 2010 to 2023 and sits on chart 6.

Two readings from it. At the peak of COVID λ is barely elevated: the crisis had already arrived, so the market was pricing few additional arrivals. And over 2021-2023 it sits at roughly double its 2010-2019 level while the VIX itself came back down — a repricing of tail risk that the level alone does not show. Its correlation with the VIX is about 0.12, which is to say it is a separate state.

What the volatility risk premium actually is, measured against the realised

It is easy to overstate it, and this site did before correcting itself. Comparing today's implied vol-of-vol to a fourteen-year average produces multiples of three to five in crisis — but that compares a regime to a mean, and the vol-of-vol moves under the historical measure too. March 2020 priced an enormous dispersion and then realised an enormous one.

Measured properly — implied dispersion at thirty days against the dispersion the VIX went on to realise, over 2 577 days — the premium is 1.00 unconditionally: implied 0.2285 against realised 0.2293, nothing at all. In annual blocks the median is 1.20, positive in ten years out of fourteen.

And it is not uniform, which is the useful part: 1.42 in the top quintile of implied dispersion against 0.83 in the bottom. One is paid for selling dispersion only when the market is already pricing a lot of it, and overpays for it when it is pricing little.