A live implied-volatility surface for bitcoin and ether
The real-data counterpart to One market, three views: a surface fitted every five minutes to the BTC and ETH options on Deribit, two models side by side, with the arbitrage checks and every expiry’s error published alongside them.
What it shows
An option’s price says how much movement the market is paying for. Turned into a volatility and laid out by strike and expiry, the prices of every option on one underlying make a surface: the standard way to read an options market in one picture. The live page draws that surface for bitcoin and ether from the options listed on Deribit, refitted every five minutes, with the quotes it was fitted to and the quotes that break static arbitrage marked on it.
In the snapshot this page quotes, 01:54 UTC on 20 October 2026, thirty-day at-the-money vol was 36.51% for bitcoin and 49.59% for ether, and bitcoin’s 25-delta puts traded 4.06 vol points over its calls. 328 of 884 bitcoin quotes passed the cleaning rules, across 9 expiries.
Two models
SSVI (Gatheral and Jacquier, 2014) writes total implied variance w = σ²T at log-moneyness k = ln(K/F) as w(k, θ) = θ/2 · [1 + ρφk + √((φk + ρ)2 + 1 − ρ2)]. Each expiry has its own at-the-money total variance θ, and the skew ρ and the curvature function φ(θ) are shared by every expiry. Extended SSVI (Hendriks and Martini, 2019) keeps the same slice and gives every expiry its own ρ and slope ψ = θφ.
The extended model contains the plain one, so on the quotes it is fitted to it can only match or improve on it. The fair test is quotes neither fit saw. Every snapshot is fitted twice more with every fifth quote held out. Across the 65 bitcoin snapshots archived on 19 October, extended SSVI’s median error on the held-out quotes was 1.2 vol points against SSVI’s 1.51, lower in every snapshot. For ether it was 1.42 against 1.82.
The extended fit also lay inside the bid-ask spread for a median 68% of bitcoin quotes, against 40%. Not every measure moves the same way: ether’s median in-sample error by expiry was 1.53 vol points for the extended model and 1.39 for the plain one, because both fits weight tight at-the-money quotes over the wide wings that dominate an unweighted error. The live page shows whichever model has the lower held-out error over the last hour and lets the reader switch.
Arbitrage
A surface has static arbitrage if some fixed portfolio of options costs less than nothing. Both fits rule it out by construction. Total variance at the money never falls with expiry. In the extended fit ψ never falls either, and |Δ(ρψ)| ≤ Δψ between neighboring expiries, so neither wing’s slope falls with maturity and expiries do not cross. Each expiry meets ψ(1 + |ρ|) < 4 and ψ2(1 + |ρ|) ≤ 4θ, which keep Durrleman’s g(k), and so the implied density, positive. Every fit is then checked on a grid that includes the slices between expiries: over all 129 snapshots of 19 October the lowest g(k) was 0.2556, and total variance never fell with maturity.
Raw quotes get no such guarantee, and they are checked separately: vertical spreads, butterflies and calendar spreads, each at mid prices and again at the prices someone could trade, buying at the ask and selling at the bid. In the snapshot above, 9 bitcoin butterflies failed at mid and 0 were tradeable. A failure at mid is an inconsistency in the quotes, not free money.
Implied against realized
Implied volatility is what options charge for movement; realized volatility is how much the price then moved. The page sets DVOL, Deribit’s 30-day implied volatility index, against the realized volatility of Deribit’s index, computed from its price every six hours as the annualized root mean square of log returns over 30 days. At 00:00 UTC on 20 October 2026 bitcoin’s DVOL was 37.3 and the index had moved at 24.4 over the previous 30 days.
The fair comparison is with what came next. On 89% of the 335 days from 21 October 2025 to 20 September 2026, bitcoin’s DVOL was above the realized volatility of the following 30 days, by a median of 11.9 points; for ether it was 90% of days, by a median of 17.7. That gap is the volatility risk premium: what option sellers were paid, on average, for carrying the risk. DVOL prices the wings as well as the money, so it runs a little above the at-the-money vol the surface itself reports.
Bitcoin against ether
Read from the same fits, ether’s options are dearer than bitcoin’s at every maturity: thirty-day at-the-money vol was 49.59% against 36.51%. Both markets paid up for puts, with 25-delta risk reversals of −3.46 for ether and −4.06 for bitcoin, and ether’s wings sat higher above the money, with a 25-delta butterfly of 1.81 against 1.05. The live page draws the three term structures for both on shared axes and redraws them every five minutes.
Local volatility
Dupire’s formula turns the implied surface into the volatility the price would need at each level and date for one model to reprice every option at once: σ2loc = ∂w/∂T ÷ g(k). It needs smooth first and second derivatives, which a fitted, arbitrage-free surface supplies and raw quotes do not. On a grid of 33 strikes, from 45% to 223% of the forward, by 24 maturities between the first and last expiry, bitcoin’s local volatility ran from 30.3% to 79.1%. 434 of the 792 cells are left blank because they lie more than three at-the-money standard deviations from the money, where the surface is extrapolation.
How it is computed and tested
A Python worker on Fly.io in London calls Deribit’s public API every five minutes, with no account: one book summary per currency, the instrument list, and ten tickers as a cross-check. Implied vols are solved from bid and ask with Black-76 on Deribit’s forward at zero rates, Deribit’s own convention, and agree with its published vols to a median 0.0017 vol points. The fit takes out-of-the-money options only; quotes with no bid, crossed markets, spreads over 15 vol points or half the mid, and expiries under two days are dropped, each with its reason logged. Raw quotes go to Parquet on a volume; at 00:00 UTC the worker writes a JSON report of the day and publishes it, with the end-of-day surface, to a public archive. The page, on Vercel, reads the worker through a five-minute cache, so visitors never reach it.
The tests hold Black-76 prices and Greeks to QuantLib within 10−10; recover known SSVI parameters to 10−4 and known per-expiry skews to 10−3; check every constraint after fitting random surfaces; catch a deliberately crossing pair of expiries; and feed the raw-quote checks broken prices. The page’s TypeScript port matches the Python to twelve places, and when the surface morphs between snapshots or models it mixes the per-expiry parameters, which keeps every in-between frame free of calendar arbitrage. The worst expiry in the snapshot above still missed by 2.7 vol points; the page publishes every expiry’s error for both models.
- Deribit public API, no authentication
- Python on Fly.io (London); Next.js, three.js and Vercel Blob