Skip to content

Derive inverse-contract variance replication for DVOL-aligned BVOL #39

Description

@obchain

Context

PR #38 / issue #37 diagnosed the +7.1 % BVOL vs DVOL bias surfaced in PR #36.

  • Cheap implementation tweaks (quote source, near-expiry rule, intrinsic filter, DVOL lookahead) close none of it.
  • Fitted-IV smoothing closes ~1.3 pp (→ +5.77 %), removing the Riemann-discretisation artefact on BTC's coarse strike grid.
  • The residual ~5 % is structural: Deribit BTC + ETH options are inverse-quoted — payoff (K - S) / S in BTC, not (K - S) in USD. Their published mark_iv is calibrated under the inverse spec. Multiplying BTC quotes by spot and feeding them into the standard 1/K²-weighted Carr-Madan integral overstates variance by precisely the inverse-pricing offset (~3-7 % per option, ~5-7 % in vol terms after the integral).

See research/bvol-dvol-gap-diagnostics.ipynb §5 for the per-strike comparison showing quote-to-vanilla-BS ratio of 1.03-1.07 across the full 50 %-200 %-of-spot strike range.

Goal

Re-derive the Carr-Madan variance replication portfolio for the inverse-options contract spec Deribit uses, then implement, validate against DVOL on the existing 144-point dataset, and publish a "DVOL-aligned" BVOL variant.

Why this is a separate issue

The work is mathematically substantive (a fresh derivation, not a parameter tweak) and unrelated to M1 milestone close. M1 ships our CBOE-style BVOL as the public index with the documented +5-6 % DVOL gap; nothing in M1 depends on this issue resolving.

What needs doing

  1. Read Deribit's DVOL whitepaper and any public-domain references on inverse-options variance replication (e.g. Bergomi, "Stochastic Volatility Modeling," or Carr-Madan extensions to inverse contracts).
  2. Derive the replicating portfolio for a contract that pays Var(log S) settled in BTC. Expected outcome: kernel likely changes from 1/K² to 1/K and an extra forward-related term appears.
  3. Implement as compute_dvol_inverse() in a new notebook (or extend bvol-dvol-gap-diagnostics.ipynb §4).
  4. Validate against DVOL on the 144-point dataset (research/data/tardis/{ccy}/{date}/snapshot.parquet). Target: ≥95 % within ±5 %.
  5. Document the resulting formula in docs/vix-notes.md alongside the CBOE-style spec (which stays as our public BVOL index).

Acceptance

  • ≥95 % of 144 hourly comparisons within ±5 % vs DVOL using the inverse-contract derivation.
  • Derivation written up in docs/vix-notes.md with the BTC-numeraire change-of-measure argument made explicit.
  • Reference Python impl in research/.

Out of scope

  • Replacing our public BVOL index with the inverse-aligned variant. BVOL = CBOE-style is the M1 deliverable; the inverse-aligned variant would be a separate "BVOL-DVOL-aligned" or "DVOL-clone" index if we choose to publish it.
  • Rust port. Reference Python first, port later when public-facing.

Priority

priority:p1 — research depth without an M1 deadline. Pick up after M1 ships if there is no faster customer-facing demand.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions