How the gap is reconstructed
2024-10-02 → 2026-04-20 is not real Deribit tape. It's a modeled surface, reconstructed from real trade prints and disclosed as such everywhere it's served. This page is the whole method and the whole scorecard — nothing here is hand-written.
What is modeled
Every currency has a real range (genuine Deribit tape, no reconstruction) and, for BTC only, a modeled range covering the historical gap. Modeled months are a bonus layer on top of the real archive, not a substitute for it.
| Currency | Real coverage | Modeled coverage |
|---|---|---|
| BTC | 2021-06-01 → 2024-10-01, 2026-04-21 → ongoing | 2024-10-02 → 2026-04-20 |
| ETH | 2026-04-21 → ongoing | none |
| SOL | 2026-04-27 → ongoing | none |
Per-field provenance within a modeled window:
| Field | Provenance |
|---|---|
| mark_iv anchors | Real Deribit trade prints — the only ground truth used. |
| volume | Computed from the trade tape (not modeled). |
| open_interest | NULL — unavailable for this window at any defensible price. Disclosed, not estimated. |
| bid / ask | Modeled spread (calibrated spread model), not observed quotes. |
| greeks | Deribit-native computation, applied to the modeled surface. |
ETH/SOL historical samples (pre-live, sparse — not continuous coverage):
| Currency | Range | Note |
|---|---|---|
| ETH | 2024-01-01 → 2026-04-01 | first-of-month days, 10-minute aggregated bars |
| SOL | 2024-04-01 → 2026-04-01 | first-of-month days, 10-minute aggregated bars |
Method
The reconstruction runs in five steps: (1) recover trade-print anchors from the tape; (2) recover the forward via put-call parity; (3) invert Black-76 off that forward to get anchor IVs; (4) fit a global eSSVI surface with a calendar penalty, subject to the complete Gatheral–Jacquier no-arbitrage bounds; (5) apply a calibrated spread model to produce bid/ask around the fitted mark.
- Mingone, A. (2022), "No arbitrage global parametrization for the eSSVI volatility surface", arXiv:2204.00312 — eSSVI parameterization and calendar-spread conditions. †
- Gatheral, J. & Jacquier, A. (2014), "Arbitrage-free SVI volatility surfaces", Corollary 4.1 — the butterfly / no-arbitrage bound the fit is constrained to.
- Alexander, C., Chen, D. & Imeraj, A. (2023), "Crypto quanto and inverse options", Mathematical Finance 33(4), 1005–1043 — the put-call duality underlying the forward recovery step. Deribit's index is non-tradable and settlement uses a 30-minute TWAP, so this inversion is approximate, not exact.
† The Hendriks–Martini calendar conditions used here are sufficient (not the full Mingone necessary-and-sufficient set), per Pasquazzi (2023), "eSSVI Surface Calibration", arXiv:2304.02106.
Accuracy
- wing m1t0 median_abs_iv 0.0414 > 0.0400
- wing m1t0 p90_abs_iv 0.1605 > 0.1000
- wing m2t0 median_abs_iv 0.0938 > 0.0400
- wing m2t0 p90_abs_iv 0.3386 > 0.1000
- wing m2t1 median_abs_iv 0.0499 > 0.0400
- wing m2t1 p90_abs_iv 0.2114 > 0.1000
- wing m2t2 p90_abs_iv 0.1424 > 0.1000
Core (Δ 0.25–0.75, 7–90d) — blocks ship
| Metric | Measured | 95% CI | Bar | Status |
|---|---|---|---|---|
| band_containment | 0.4001 | [0.3427, 0.4457] | 0.75 | FAIL |
| median_abs_iv | 0.0108 | [0.0075, 0.0159] | 0.015 | PASS |
| p90_abs_iv | 0.0358 | [0.0248, 0.0505] | 0.04 | PASS |
| spread_width_median_rel_err | 0.3933 | [0.3383, 0.4461] | 0.4 | PASS |
| recall | 1.0000 | [1.0000, 1.0000] | 0.95 | PASS |
Wing (everything outside core) — reported, never blocks ship
| Metric | Measured | 95% CI | Bar | Status |
|---|---|---|---|---|
| band_containment | 0.3412 | [0.3006, 0.3787] | 0.5 | FAIL |
| median_abs_iv | 0.0272 | [0.0220, 0.0341] | 0.04 | PASS |
| p90_abs_iv | 0.1223 | [0.0961, 0.1594] | 0.1 | FAIL |
| spread_width_median_rel_err | 0.4671 | [0.4217, 0.5116] | 0.6 | PASS |
Wing 9-cell grid (mark_iv, moneyness × tenor)
| Cell | median_abs_err | median CI | p90_abs_err | p90 CI | n_days | n_rows |
|---|---|---|---|---|---|---|
| m0t0 | 0.0217 | [0.0193, 0.0242] | 0.0832 | [0.0701, 0.0962] | 9 | 1470279 |
| m0t1 | 0.0090 | [0.0067, 0.0123] | 0.0278 | [0.0191, 0.0415] | 9 | 376244 |
| m0t2 | 0.0270 | [0.0196, 0.0377] | 0.0785 | [0.0573, 0.1012] | 9 | 330811 |
| m1t0 | 0.0414 | [0.0369, 0.0463] | 0.1605 | [0.1305, 0.2035] | 9 | 640562 |
| m1t1 | 0.0163 | [0.0119, 0.0220] | 0.0552 | [0.0356, 0.0842] | 9 | 1421400 |
| m1t2 | 0.0280 | [0.0216, 0.0367] | 0.0782 | [0.0584, 0.0993] | 9 | 584716 |
| m2t0 | 0.0938 | [0.0499, 0.1504] | 0.3386 | [0.1289, 0.6536] | 8 | 59396 |
| m2t1 | 0.0499 | [0.0364, 0.0683] | 0.2114 | [0.1572, 0.2801] | 9 | 1424130 |
| m2t2 | 0.0379 | [0.0309, 0.0456] | 0.1424 | [0.1127, 0.1788] | 9 | 1781720 |
Worst days (by core median |IV error|)
| Day | Core median |IV err| | Wing median |IV err| | Recall |
|---|---|---|---|
| 2024-12-01 | 0.0297 | 0.0505 | 1.00 |
| 2025-02-01 | 0.0126 | 0.0338 | 1.00 |
| 2025-06-01 | 0.0103 | 0.0280 | 1.00 |
| 2026-02-01 | 0.0085 | 0.0213 | 1.00 |
| 2025-08-01 | 0.0079 | 0.0258 | 1.00 |
Engine counters (summed over scored days)
- snapshots_emitted: 12900
- snapshots_rejected: 20
- snapshots_repaired: 18
- anchors_used: 25827
- carried_dropped: 71
null, not zero.
Access
Modeled files are opt-in: pass ?include_modeled=true
to GET /v1/files/{ccy}/bulk — the only
endpoint that accepts this parameter — to include modeled days in
the bulk manifest (each such entry is flagged
modeled: true). By default the manifest
lists real coverage only.
On GET /v1/chains/{ccy}/snapshots and
GET /v1/chains/{ccy}/instrument/{symbol},
?source= filters the response body by the
exact provenance tag carried in each row's
source column — for example
modeled_surface,
live_ws, or
live_rest. An unknown tag returns
400 invalid_source; there is no
real/modeled
shorthand.