Methodology

How the gap is reconstructed

2024-10-02 → 2026-04-20 is not real Deribit tape. It is a modeled surface, reconstructed from real trade prints and disclosed as such everywhere it is served. This page is the whole method and the whole scorecard — including the parts that fail. Nothing on it 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.

CurrencyReal coverageModeled 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

FieldProvenance
mark_iv anchorsReal Deribit trade prints — the only ground truth used.
volumeComputed from the trade tape (not modeled).
open_interestNULL — unavailable for this window at any defensible price. Disclosed, not estimated.
bid / askModeled spread (calibrated spread model), not observed quotes.
greeksDeribit-native computation, applied to the modeled surface.

ETH / SOL historical samples

Pre-live and sparse — these are samples, not continuous coverage.

CurrencyRangeNote
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
ETH/SOL historical samples cover first-of-month days only: 10-minute mean-aggregated bars derived from licensed third-party historical data, within the vendor's derived-data terms (≥10-minute aggregation). Field means are independent time-averages, so instantaneous ordering invariants (bid_iv < mark_iv < ask_iv) need not hold within a bar — disclosed, never clamped.

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.

Temporal interpolation between anchors carries no theorem claim. eSSVI's guarantees are static, per-snapshot. Every emitted snapshot is numerically re-verified against the no-arbitrage bounds after fitting, and the rejection / repair / carried-dropped counters below are the published record of what that re-verification found.

Accuracy

Measured against a protocol and a set of bars fixed before the run — the hash at the foot of this page is that protocol. Core metrics block release; wing metrics are reported and never block.

SHIP Every core metric is inside its bar.

Recorded misses (7), none blocking. These are wing metrics — outside the Δ 0.25–0.75, 7–90d core — which the protocol reports and never gates release on. They are not cosmetic: a wing cell that misses its bar has its quotes nulled rather than served, so the effect shows up as absent data, never as a number we did not stand behind.

  • 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

MetricMeasured95% CIBarStatus
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

MetricMeasured95% CIBarStatus
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)

Cellmedian_abs_errmedian CIp90_abs_errp90 CIn_daysn_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|)

DayCore 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_emitted12900
  • snapshots_rejected20
  • snapshots_repaired18
  • anchors_used25827
  • carried_dropped71
Mid-month accuracy is not measured. Every in-gap oracle day scored above is a post-expiry-roll 1st-of-month snapshot. Treat mid-month as an extrapolation from these day-boundary results, not an equivalent guarantee.
open_interest is never estimated. It is unavailable for the entire modeled window at any defensible price and is never backfilled. It is returned as 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.

Modeled months are not counted in coverage claims and carry no charge — a bonus layer on top of the real archive, priced at zero, disclosed everywhere it is served. What the archive itself covers is on the coverage report.