Methodology

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.

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, sparse — 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.

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

SHIP

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)

Every in-gap oracle day scored above is a post-expiry-roll 1st-of-month snapshot. Mid-month accuracy is not measured by this protocol — treat it as an extrapolation from these day-boundary results, not an equivalent guarantee.
open_interest is unavailable for the entire modeled window at any defensible price and is never estimated or 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 — they are a bonus layer on top of the real archive, priced at zero, disclosed everywhere they're served.