How it works

Quoted Vol

Everything the interactive page explains in passing, written out in one piece — including what the repair costs, what was tried and thrown away, and which tests this corpus cannot run. The surfaces themselves are on the main page; notes and corrections go here.

What this is

An arbitrage-free volatility surface for quoting SPX, built from quoted option chains on eighteen days between 2015 and 2023.

The object. Every expiry of the day carries a discrete risk-neutral density with positive weights, living on one support shared by the whole day. Positivity, unit mass and the martingale condition are linear constraints, so butterfly arbitrage is structural rather than checked afterwards. The bid-ask bounds are imposed exactly by linear program, and the calendar floor — a longer option is never cheaper than a shorter one at the same forward-normalised strike — is imposed at every point of that common support. Because the support is shared, that finite set of constraints is the continuum condition rather than a sample of it.

The state. The repaired surface is encoded on a permanent grid of nine maturities and fifteen log-moneyness nodes: 135 numbers, against 2 400 probabilities for the transported densities. The maturities never move, so the same coordinates mean the same thing every day, and a difference between two days is a difference in the market rather than in the expiry calendar.

What runs where. The linear programs run offline. The decoding, the exact calendar check, the variance-swap curve and every graph on this page are computed in your browser — the calendar check from the densities that travel with the page, the market smile from the raw bids and asks.

The funding the market is pricing

Every expiry carries a forward F and a discount factor D, both read from the quoted chain by put-call parity. Between two consecutive expiries that is enough to read, with no spot and no rate curve: r = (log D₁ − log D₂)/ΔT for funding, c = log(F₂/F₁)/ΔT for carry, and q = r − c for dividend plus borrow.

Why this is the first thing to look at. A surface that has the wrong forward has the wrong at-the-money skew, mechanically: F sets k = log(K/F), so it moves what "at the money" even means. Twenty basis points of borrow on a one-year expiry moves the forward by twenty basis points — near ten index points with the S&P around 4,800, which is several strikes. Nothing downstream can repair that.

And it is the cheapest data check there is. One expiry whose dividend-plus-borrow sits well off its neighbours is, far more often than a funding event, a chain with stale or crossed quotes. This runs before the linear program rather than after it, so it catches the bad day before the bad day becomes a surface.

The steps are drawn as steps because each value holds over an interval between two expiries, not at a point. A broken line would suggest a continuous quantity that was never measured.

What replaced what. This panel used to show the exact calendar condition. That was a unit test, not a view: a curve that must be flat, for a binary result that passes. Worse, its dominant shape — the hump at a hundred-odd basis points — was not the violation but the value of the calendar spread, so the naive reading of the figure was simply wrong. The test now lives as one line in the panel on the left, with its worst gap, which is all it ever needed.

The density being quoted

This is the object the whole page is built on, and it was nowhere to be seen. One expiry carries a few hundred probability masses on a common support; every price on this page — the smile, the calendar check, the variance-swap curve — is an integral against it.

Why it is a distribution by construction. Positive weights, unit mass and E[eu] = 1 are three linear constraints. A linear program that satisfies them cannot return anything but a risk-neutral probability distribution with the right forward, so butterfly arbitrage is structurally impossible rather than checked afterwards. Nothing here is differentiated twice, which is the usual way a fitted density goes negative.

The shaded band is the part anyone actually quotes. What sits outside it is not measured: it is where the smoothing objective put mass under the mass, martingale and calendar constraints alone. That fraction is printed under the chart, and it is worth watching — it is typically small in probability and large in what it decides. A variance swap, for instance, weights strikes by 1/K², so a tail carrying a fraction of a percent of the mass can carry a fifth of the log-contract.

The dashed line is the forward. The martingale constraint pins the mean of eu there exactly, not approximately — which is why the peak sits above it. That is not an error: an index risk-neutral density carries a heavy left tail, and a left-skewed distribution has its mode above its mean. On 16 March 2020 roughly a quarter of the mass sits below k = −0.3, and the bulk has to sit above the forward to keep the mean there.

The piecewise-linear look is real, and it is a choice. The smoothing objective is the total variation of the second difference of the masses, which is an L1 norm — and L1 objectives return piecewise-linear solutions, with kinks and flat runs rather than a smooth curve. That is what buys the exact bid-ask constraints and the absence of churn when the market does not move; an L2 objective gives a rounder picture and a worse one. The corners you see are the regulariser's signature, not noise in the data.

The variance-swap curve, spot and forward-starting

Two lines. The white one is what a variance swap struck today and expiring at T pays, written W(T) = −2 E[log XT]. The dashed one is the same swap starting at T and running for the tenor you pick: (W(T+τ) − W(T)) / τ.

Where the number comes from matters — and what it still owes to the tail. W is read off the risk-neutral density as a finite sum over its support, so there is no truncation and no numerical integration. That is not the same as owing nothing to the tails: the part of the density that lies beyond any quoted strike contributes a median of 1.2% of W and as much as 20.5% on the worst date. The sum is finite; the tail it sums over was put there by the smoothing objective, not by a price. Panel 2 shows how much mass that is, and it is always much less than 1.2% — which is the whole point of the 1/K² weighting. It is also not read off the decoded lattice: that decoder interpolates the call price affinely down to a strike of zero, which implies an atom of probability at zero, which makes E[log X] infinite. The density has no tail to invent, so this curve has nothing hidden in it.

It cannot go negative, and that is the point. Every expiry of the day is calibrated on one common support with the calendar floor imposed at every point of it. W is therefore non-decreasing by construction, and every forward variance readable off this surface is positive — for any start date, any tenor, including between quoted expiries. A surface fitted expiry by expiry gives no such guarantee, and the failure shows up exactly where you would want to trade a forward-starting swap.

Between quoted expiries W is interpolated linearly in maturity. That is a convention, and the only one that keeps a non-decreasing series non-decreasing — which is to say the only one that cannot manufacture a negative forward variance between two honest points. It was checked rather than assumed: 2.6 million (start date, tenor) pairs across the eighteen days, every tenor in the selector, none negative, the smallest forward variance 6.9·10⁻³.

Below the first quoted expiry the same convention makes W proportional to maturity, so the spot curve is flat there — the first few days of the white line are a straight extension of the shortest quoted expiry, not a reading. Nothing on this page quotes an option below the first listed maturity, so nothing depends on it; it is drawn because cutting the line off would suggest the surface stops.

One surface, any maturity

The white curve is decoded from 135 numbers: nine permanent maturities, fifteen log-moneyness nodes, one normalised call price each. The orange is the nearest quoted expiry with its actual bid-ask band.

No solver runs in this page. The decoder is a linear interpolation in strike — not in log-moneyness, and that detail is the whole construction. Between two nodes the call price is affine in strike, so positivity, decreasingness, convexity and calendar ordering are implied by finitely many inequalities on the nodes and hold on the entire continuum between them. An interpolation in log-moneyness would give none of that, and in fact interpolating total variance across maturities creates a butterfly arbitrage on 144 of 144 hidden expiries we tested.

The decoder, not the node count, is what limits accuracy here — and the obvious fix is a trap. Interpolating call price affinely in strike is the largest convex interpolant through those nodes: a chord over a convex function lies above it everywhere, so the surface systematically overprices, by +0.75 volatility points when implied volatility is inverted exactly — the figure is +0.91 if you linearise it through vega, which flatters nothing and diverges in the wings this page elsewhere calls meaningless. Interpolating total variance instead halves the error, and we nearly did it.

It is unusable. Piecewise-linear total variance has a kink at every node, and a concave kink is a negative Dirac in the density. Measured over 306 slices: every single one carries negative probability mass, up to 11.5 percentage points, and 98% of the worst points fall inside the quoted strike range — concentrated on the nodes themselves, including k = −0.08 and −0.04, at the money. A butterfly centred there would sell for a negative price. The affine decoder, by contrast, is exact to floating-point noise: 2 slices out of 306 at 10⁻⁹.

So the bias is the price of the guarantee, and it is being paid knowingly. The way out is neither interpolant: a one-step implicit Dupire solve between pillars (Andreasen–Huge) gets exact butterflies and exact calendar from the discretisation itself, halves the bias, and decodes as nine tridiagonal sweeps. It is also a dynamic assumption in maturity, which this page has so far refused to make. That decision is open, and it will be stated here when it is taken rather than slipped in.

What this decoder actually achieves, measured on a held-out block of dates, repricing every quote from the 135 numbers alone: median 0.510 volatility points, price RMSE 3.00 index points, 17.5% of quotes land strictly inside their own spread.

Those are worse than the figures this page used to show — 0.192, 1.99 and 35.1% — and the old ones were not wrong, they were somebody else's. They belong to an offline linear program that reconstructs a smooth density from the same lattice, and that program does not run in your browser. Quoting it beside the sentence "no solver runs in this page" credited this decoder with another one's accuracy. The gap between the two, roughly a factor of two on all three axes, is the price of decoding without a solver.

The wings are where it is worst, and we report price error there rather than implied volatility, because a wing with near-zero vega has no meaningful implied volatility to be wrong about.

The grid starts at 30 days, and it used to start at 7. That node was removed after measurement, not out of caution. The shortest quoted SPX expiry on these eighteen dates is always between 22 and 26 days, so a 7-day node falls systematically below the market, and the encoder there blends intrinsic value into the first quoted smile. The result stays arbitrage-free — it is a convex-order interpolation towards the degenerate law at expiry — and it is not a price: the decoded smile dipped at the money on all eighteen dates, reading 45% where its own wings read 67 to 91% on 16 March 2020. A node no quote constrains, and that the decoder gets wrong, has no business in a state whose purpose is to quote.

Removing it changes nothing else. The rows are computed independently of one another, so the other nine are bit-for-bit what they were. The state goes from 150 numbers to 135.

What remains is the market's own shape, not an artefact. On quiet dates the SPX smile really is V-shaped near the money — on 3 November 2017 the quoted 24-day expiry reads 6.1% at the money against 18.1% ten percent down and 10.5% ten percent up — and the decoded 30-day curve reproduces it. The long end is a different matter. Measured on the states in the database, the longest expiry this pipeline retains runs from 241 to 400 days, 359 on average: 540 days is past it every time, and 365 days about half the time. Read that as a fact about the extraction, not about SPX — the chains quote out to two and five years on the dates sampled, and the 400-day cap is ours. Those nodes are shaded, and unlike the 7-day node they carry no visible pathology in the smile. But they do misbehave, in the one place it counts: the forward volatility from 365 to 540 days comes out at exactly zero on 7 of the 18 dates — precisely those where the 365-day node is itself past the last quote — and to 3.5 to 11.5% on the others, because the lattice extends flat past the last quote and the calendar floor is then the only thing setting that row. The curves on this site now stop at the longest expiry this pipeline retains, for that reason.

The three core coordinates

Of the fifteen numbers each maturity carries, three describe the liquid core: at-the-money total variance, central skew, central curvature, read at k = −0.08, 0, +0.08. The other twelve are wing prices, kept as normalised prices rather than implied volatilities.

That split is not cosmetic; it was forced by a stress test. An all-variance basis looked elegant and was badly conditioned: removing 20% of the strikes moved the call lattice by 3.5·10⁻⁶ and the state by 0.666. The state was reporting an upheaval that the prices did not contain. With the hybrid basis the same perturbation moves the state by 0.00031, two thousand times less. Same solver, same perturbations, published side by side.

Orange dots are the at-the-money volatility of the quoted expiries. They sit at different maturities from the white nodes, and they always will — that is what the permanent grid exists to absorb.

Why the maturity is continuous

Maturity, in days — and it is continuous. Drag it anywhere between 30 and 540 days. There is no listed expiry at 137 days, and the surface prices 137 days anyway.

That is the whole point of the permanent grid. A smile calibrated to listed expiries lives on maturities that expire: the object you calibrated on Monday does not exist on Tuesday, and comparing the two means comparing different coordinates. Here the nine maturities never move, so the state is the same object every day and a difference between two days is a difference in the market, not in the expiry calendar.

The slider runs on the logarithm of days. On a linear scale three quarters of its travel would sit beyond a year, where almost nothing changes.

What the repair cost

Imposing the exact conditions is not free, and the cost is shown rather than absorbed.

All 18 problems solve. 241 quotes across the eighteen days end up outside their own bid-ask, the worst by 2.25 spreads. The panel on the left gives the same two numbers for the date you are looking at, plus the subset that carries real strip vega — the quotes anyone trades — because a deep-wing put leaving a wide spread and an at-the-money quote leaving a tight one are not the same event.

The cost is wildly uneven. Several dates cost nothing at all. 3 January 2019 costs 168 quotes and an L1 probability movement of 1.06; it is also the date where the quoted market is least self-consistent. The honest reading is not that the model failed: part of the quoted market is incompatible with the exact conditions, and we would rather say which part.

There is an upstream cost too, and it is not on that panel. Putting every expiry of the day on one common support at a constant step takes the density from 240 points per expiry to between 360 and 850. The payload grew 18% and the offline calibration got about 40% slower. That buys the exact calendar condition; it is paid once, offline, and the browser never sees it.

What was tried and rejected

Three alternatives were implemented properly, measured out of sample, and thrown away. They are documented because a method that only reports its winners is not reporting anything.

PCA on the lattice. Learned on the first twelve dates, reprojected into the arbitrage-free polytope, tested on the last block. PCA-2 explains 96.1% of the variance and prices at an RMSE of 14.21 index points. PCA-8 reaches 99.99% and 2.71 points, against 1.99 for the full lattice. Explained variance is a badly misleading criterion for pricing: the directions that carry no variance are the ones that carry the wings.

Global power-law SSVI. Ten thetas plus rho, eta, gamma, respecting the sufficient butterfly bounds and the power-law calendar conditions. It is arbitrage-free and it does not fit: price RMSE 42.08, median implied volatility error 7.12 points. Rejected at this granularity — which is market-making granularity, not risk-reporting granularity.

Interpolating total variance across maturities. The best-centred distribution of all (median 0.168 volatility points) and unusable: it creates a butterfly arbitrage on 144 of 144 hidden expiries. Affine interpolation of call prices is worse in the middle (0.243) and is the only one that is admissible, because a convex combination of convex decreasing functions is still convex and decreasing.

Where this fails, and what is missing

The data, and which page runs on which. This page — the day surface — still runs on the original corpus: eighteen days chosen around events, ten expiries each, no intraday snapshots. That is enough to establish a static defect (162 pairs is a real sample, and the calendar result is not marginal) and nowhere near enough for anything dynamic. The intraday and history pages run on a different and much larger corpus: 3,494 sessions at the close and 306 of them at thirty-minute resolution, twenty a year from 2010 to 2023, 7,162 states in all. So half-hourly frequency is no longer a test this site cannot run — it is run, and shown. What is still missing is the event-conditional work: open versus close, CPI, FOMC, payrolls, none of which is cut here.

The dynamics are not published. A strictly causal engine exists: one code path for replay and live, strictly increasing timestamps, no revision of a published state, 18 of 18 arbitrage-free. On the available replay a random walk beats every alternative predictor, and the VAR(1) gate refuses to fire — 17 observations against the 755 its own dimension requires. Its anomaly and regime numbers are smoke-test outputs and are deliberately absent from this page.

One quantity is not solved. The minimum energy to reach an admissible surface is computed along a convex path, not over the whole polytope. It is exact within that family and it is not the global QCQP. It is named minimum_path_alpha in the code for that reason, and claiming the global minimum had been solved would be false.

The permanent grid still reaches past the quotes at the long end. 540 days is beyond the longest expiry this pipeline retains every single time, and 365 days about half the time; 270 days, by contrast, survives on 99.9% of them. The ceiling is a dte ≤ 400 filter in the extraction, not a property of the market, and raising it is the real fix. Those nodes are extensions rather than readings. An earlier version of this page said they did not visibly misbehave. That was wrong, and the measurement that shows it is the forward volatility between them: flat call extrapolation is the assumption-free convex-order extension, so W(540) = W(365) bit for bit on 7 of the 18 dates and the forward reads zero — a bound presented in the same units as a price. Nothing quoted constrains them, and no measurement here says how good they are.

A convention, not a measurement. Forward and discount are known only at quoted expiries; between them this page interpolates their logarithms linearly in maturity. Nothing the page asserts depends on it — every claim here is in forward-normalised units or implied volatility — but a price in index points at a non-listed maturity inherits that choice.

In more depth

Why the exact calendar condition is a finite test

The condition itself is old. If the forward-normalised price process is a martingale under the forward measure, then the laws of X_T = S_T/F_T are increasing in convex order as T grows, and the call price at a fixed normalised strike cannot decrease. That is Föllmer and Schied's statement of Kellerer's theorem, and it is where the inequality c(x,T₂) ≥ c(x,T₁) comes from.

What is not old is that on a real chain the test costs nothing. Each maturity carries a discrete risk-neutral law with a few hundred support points. The call price of a discrete law, c(x) = Σ q_j max(e^{u_j} − x, 0), is piecewise affine in x, with kinks only at the support points e^{u_j}. The difference of two such calls is therefore affine on every interval between consecutive points of the union of the two supports. An affine function attains its minimum at an endpoint. So the global minimum of the difference over all x > 0 is attained at one of those finitely many breakpoints.

Testing them is not a dense scan that might miss something between samples — it is the continuum condition, evaluated exactly, in a few hundred evaluations per pair on these chains. This is why the page can run the test itself instead of quoting a number computed elsewhere.

Why forward variance is necessary and never sufficient

The habitual calendar certificate is monotonicity of the forward variance, or equivalently of the log-contract W(T) = −2 E[log X_T]. It is attractive because it is one number per maturity, it is what a variance swap pays, and it is what the VIX squares.

It is a consequence of the calendar condition, not a substitute for it. Because −log x is convex, convex order gives W(T₂) ≥ W(T₁) immediately. The converse fails for the obvious reason: W is a single integral of the smile against e^{−k}, and one number cannot certify a family of inequalities indexed by strike. A surface can raise its wings and drop its belly, keeping the integral increasing while the belly call price falls.

What was not obvious is the size of the gap on real data. Calibrating each expiry on its own grid, with the calendar floor imposed only where both expiries carry quotes, the scalar log-contract decreased once over eighteen days and 162 adjacent pairs while the exact test rejected 92. Ninety-one violations were invisible to the certificate in ordinary use — and almost all of them sat outside the strikes anyone quotes, in the tails each expiry had extrapolated on its own.

That is why every expiry of a given day is now calibrated on one common support, with the floor imposed at every point of it. The union of two supports is then the grid itself, so the finite constraint set is the continuum condition rather than a sample of it, and the exact test finds nothing left to find. What the test still measures is worth keeping: it verifies that the float32 densities reaching your browser reproduce what the double-precision program solved, and it is the only place on this page where the surface is checked rather than constructed.

Interpolating in strike, not in log-moneyness

Between the fifteen strike nodes, the decoder is affine in x = K/F. This is not an aesthetic choice; nothing else preserves the guarantees.

Positivity, decreasingness in strike, convexity in strike and calendar ordering are all linear in the call values. Impose them at the nodes, interpolate affinely between nodes, and they hold everywhere in between — because a convex combination of two convex decreasing functions is convex and decreasing, and because affine functions cannot dip between their endpoints. A finite list of inequalities buys a continuum of guarantees.

Interpolating anything else forfeits that. We tested the natural competitor — interpolating total variance across maturities, which is what most surface implementations do — by hiding whole expiries and rebuilding them. Its central accuracy is the best of the lot, a median error of 0.168 volatility points. It also creates a butterfly arbitrage on 144 of the 144 hidden expiries. Affine interpolation of calls is worse in the middle, 0.243 points, and is the only admissible one. We publish both numbers rather than the one that flatters.

Choosing the grid without looking at the answer

Nine maturities and fifteen strike nodes are not round numbers picked for comfort. They come from a greedy search that hides an expiry before building the reference it is scored against, so that the grid is never selected using the data it will be judged on. The first twelve dates select; the last six are never touched during selection.

The stopping rule is the one-standard-error rule: take the smallest grid whose error is within one standard error of the best. It returns (7, 45, 60, 90, 180, 270, 540) days as the compact solution to the pure interpolation test. Three more maturities — 30, 120 and 365 — are added for the production decoder because they measurably reduce edge artefacts in full reconstruction, and saying so is more useful than pretending seven was enough.

One node was then taken back out, and the reason is worth stating because it is not a selection criterion. The 7-day node scores well on the interpolation test and looked indefensible anyway: on the eighteen-day corpus the shortest quoted expiry was always between 22 and 26 days, so nothing constrained it, and the decoder filled the gap by blending intrinsic value into the first quoted smile — the resulting smile dipped at the money on all eighteen dates. The production grid became the nine maturities from 30 to 540 days, and the state 135 numbers.

Correction, and it is the third time this claim has been revised. That premise was false. "The shortest quoted expiry is 22 to 26 days" was an artefact of how the corpus had been extracted — the query filtered dte between 12 and 400 and kept ten expiries per date. The raw chains carry far more: on four sampled dates they hold 19, 36, 39 and 55 distinct expiries, the shortest at 0 to 4 days and the longest at 900, 871, 973 and 1901 days.

Fourth revision, and this one cuts the other way. The replacement extraction filters dte between 7 and 400 and keeps at most 22 expiries. So the numbers above describe the market, not the states this site serves. Measured over the 7,162 states in the database, the batch now complete: 8 to 22 expiries retained, 18.2 on average; the shortest retained expiry averages 8.9 days and is never below 7; the longest runs from 241 to 400 days, 364 on average. Which base you count on matters, and an earlier version of this paragraph mixed three of them, so here are all three:

basestatesexpiries shortestlongest7-day node
below the quotes
365-day node
past them
every state7,16218.28.9 d364 d 73.6%52.0%
the 16:00 close only3,49418.19.4 d359 d 54.3%49.6%
intraday snapshots3,66818.38.5 d368 d 92.0%54.3%

The last two rows are not the same days: off-close states exist only for the 306 sessions computed at thirty-minute resolution, so the gap between them mixes time of day with date selection and should not be read as either alone. Three consequences follow, and each one had been stated here as if it were a fact about the market:

  • The 7-day node sits below the shortest expiry this pipeline retains on 73.6% of states — and on 92.0% of the intraday snapshots, which are exactly the ones that page draws. Nothing is quoted between them, so the node interpolates against intrinsic value. It was reinstated because the market quotes there — the market does, this pipeline does not read it.
  • The 540-day node is past the longest retained expiry on 100% of states, and the 365-day node on 52.0% of them — 49.6% counting close-only sessions, the row history runs on. Neither fact is about SPX, which quotes LEAPS out to two and five years on the dates sampled above. Both are about the 400-day cap.
  • The remedy applied so far — cutting the curves at the longest retained expiry — is therefore honest about what is served and silent about why the ceiling is where it is. Raising the cap is the real fix, and it is not done: at 1,100 days one snapshot costs 30 s against 18 s, so the whole corpus would have to be recomputed. Until then this paragraph stands.

So this site currently serves two grids, and it is better to say so than to hide it. The day surface runs on the eighteen-date corpus with nine maturities and 135 numbers. The intraday and history pages run on the chains between 7 and 400 days, twelve maturities from 7 days and 180 numbers. Two states, not comparable coordinate by coordinate. Reconciling them means rebuilding the day surface on the same window, which is the next piece of work — and until it is done, this paragraph stands.

Why the core keeps variance and the wings keep price

The first coordinate system was uniform: every node stored as total variance, level, skew and curvature plus variance residuals. It is the natural choice and it is badly conditioned.

The stress test that killed it: remove 20% of the strikes. The call lattice moves by 3.5·10⁻⁶ — the surface is essentially unchanged, as it should be, since the removed quotes were not holding it. The state moved by 0.666. The coordinates were reporting an upheaval that the prices did not contain, which makes every downstream distance meaningless.

The cause is that implied volatility is a singular function of price where vega vanishes. In the deep wings a price change far below the tick moves the implied volatility by a lot, and any all-variance basis inherits that. So the production basis is hybrid: the liquid core at k = −0.08, 0, +0.08 keeps its economic meaning as at-the-money variance, skew and curvature; every other node stores a normalised OTM price. The change of basis is exactly invertible, so nothing is lost.

Same solver, same perturbations, measured side by side: noise of ±0.25 spread moves the old basis by 0.962 and the hybrid by 0.0089; one quote pushed ten spreads, 1.393 against 0.0224; spreads multiplied by five, 1.038 against 0.0079. All 36 perturbed surfaces stay arbitrage-free.

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.

Measured on an earlier fit of these same chains, the effect 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 brought the money to 1.10.

The general lesson survived the model that produced it, and shapes this one: 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. It is also why the wing accuracy on this page is reported in index points and in spreads, not in volatility.

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.

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. This is the reason the densities upstream of this page are obtained as the solution of a linear program with positive weights rather than by differentiating anything: positivity, mass and the martingale condition are linear constraints, so butterfly arbitrage is structural rather than checked afterwards.

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 forward that built the state travels with it, and this page never re-estimates it — a tenth of a percent of disagreement would shift the whole smile against the surface drawn under it, and would read as a model error rather than the convention mismatch it is.

What a state that does not expire buys you

A smile calibrated to listed expiries lives on maturities that expire. The object calibrated on Monday does not exist on Tuesday; the front expiry rolls, the grid shifts, and a difference between two days mixes a change in the market with a change in the calendar. Every dynamic statement built on such coordinates inherits that confusion.

Nine permanent maturities remove it by construction. The cost is one interpolation, and the interpolation is the affine-in-strike one above, so it costs no guarantees. What it enables — covariance across maturities, an innovation with a stable meaning, a distance between two days — is the part this page does not yet publish, because eighteen event-selected days without intraday data cannot calibrate a threshold, and saying otherwise would be the easiest and least defensible thing on the site.