Methodology
How CryptoVol constructs volatility indices, surfaces, constant-maturity history, and Greeks from live crypto options market data.
1. Data Sources and Snapshots
Option chain snapshots are collected from Deribit and OKX — the leading venues for listed options on the assets we cover. For each snapshot we capture the full option chain: bid/ask prices, strikes, maturities, plus underlying spot and futures prices across all listed expiries.
Asset Coverage
Coverage spans BTCETHSOLXRPAVAXTRX
To follow the major liquidity flows in the market, we use coin-collateralized (inverse) options for BTC and ETH — where the contract is denominated and settled in the underlying coin — and USDC/USDT-collateralized (linear) options for SOL, XRP, AVAX, and TRX, where settlement is in stablecoin. This matches where the deepest order books and tightest bid-ask spreads sit for each asset.
Historical depth varies by asset:
- BTCETH from June 2024
- SOLXRP from May 2025
- AVAXTRX from January 2026
Sessions
We capture three snapshots per day, timed to the close of each major global trading session. This gives users a consistent intra-day view of vol levels and term structure across geographies:
- Asia session — 05:00 EST (10:00 UTC)
- London session — 12:00 EST (17:00 UTC)
- US session — 16:00 EST (21:00 UTC)
2. Vol Surface Calibration
For each snapshot, we construct an arbitrage-free implied volatility surface in four stages: cleaning the raw option chain, implying the forward and yield curves, inverting Black-Scholes to recover implied vols from option premia, and calibrating the SABR model per expiry against those vols.
Data Cleansing
Raw option chains contain stale, one-sided, and arbitrageable quotes that would distort calibration. We apply a series of filters before any fitting:
- Two-sided quotes only. Strikes without both a bid and ask are excluded. We use the bid-ask midpoint as the reference price.
- Bid-ask sanity check. Quotes where
3 × bid < askare dropped — too wide a spread signals stale or unreliable pricing. - Out-of-the-money only. For each expiry, we keep calls at strikes ≥ ATM and puts at strikes < ATM. OTM options carry the cleanest information about implied vol; ITM options are dominated by intrinsic value and are derivable from the OTM side via put-call parity.
- Premium sanity bound. Calls with mid price ≥ 50% of forward, or puts with mid price ≥ 50% of strike, are excluded as economically implausible.
- Monotonicity filter. We sort puts from high to low strike and calls from low to high strike. As we move further out-of-the-money, option premia should strictly decrease; any quote that violates this monotonicity is treated as stale and dropped.
- Minimum quote count. Expiries with fewer than 5 valid strikes after filtering are excluded from calibration — too few points to fit SABR's parameters reliably.
Forward and Yield Curves
For each option expiry, we find the closest-to-ATM strike with both call and put two-sided quotes and solve for the yield from put-call parity.
F(T) = S × er(T) · T = K + (C − P) × er(T) · T
We prefer the option-implied forward over the listed futures price. The implied forward is, by construction, internally consistent with the option market: using it ensures that subsequent implied vols are arbitrage-free across calls and puts at the same strike. Using a listed futures price instead can introduce a small mismatch between the two markets, producing put-call parity violations and contaminating the calibration.
The implied forward and yield curves are also exposed in the API as additional analytic fields.
Implied Volatility Calculation
Each cleaned option premium is converted to an implied volatility by inverting the Black-Scholes formula. For each strike K and expiry T, we solve numerically for the σ that reproduces the observed market price under the calibrated forward and yield:
Put: P = e−rT × [K · N(−d₂) − F · N(−d₁)]
where d₁ = [ln(F/K) + σ²T/2] / (σ√T), d₂ = d₁ − σ√T
The resulting (strike, vol) pairs form the input to SABR calibration.
SABR Calibration
For each (asset, expiry, snapshot) combination with sufficient cleaned quotes, we calibrate a SABR model (Hagan et al. 2002) to the implied volatilities. SABR fits the volatility smile with four parameters and provides a smooth, arbitrage-free surface for interpolation between quoted strikes.
SABR Parameters
- α (alpha) — Level of implied vol (ATM vol proxy)
- β (beta) — Fixed at 1 (lognormal backbone, appropriate for crypto)
- ρ (rho) — Correlation between spot and vol; controls smile skew
- ν (nu) — Vol-of-vol; controls smile curvature
SABR Lognormal Formula (β=1)
where:
A = α / [(FK)(1−β)/2 × (1 + (1−β)²/24 · ln²(F/K) + (1−β)⁴/1920 · ln⁴(F/K))]
B = 1 + [((1−β)²α²)/(24(FK)1−β) + (ρβνα)/(4(FK)(1−β)/2) + ((2−3ρ²)ν²)/24] × T
z = (ν/α) × (FK)(1−β)/2 × ln(F/K)
χ(z) = ln[(√(1 − 2ρz + z²) + z − ρ) / (1 − ρ)]
Calibration is performed independently per expiry using least-squares minimization on the difference between SABR-implied and market vols.
3. Vol Interpolation
To answer a query for vol at an arbitrary (strike, maturity) pair, we interpolate along both axes of the calibrated surface:
- Strike axis (per expiry). For each calibrated expiry, we evaluate the SABR formula at the target strike using that expiry's fitted parameters. This produces one implied vol per expiry — a slice of the surface at the requested strike.
- Time axis. The per-expiry vols (evaluated at the same target strike on both bracketing expiries T₁ and T₂) are interpolated to the target maturity T* in total-variance space:
σ²(K, T*) · T* = w · σ²(K, T₁) · T₁ + (1 − w) · σ²(K, T₂) · T₂This "linear-in-total-variance" interpolation preserves no-arbitrage between adjacent maturities at a fixed strike.
where w = (T₂ − T*) / (T₂ − T₁)
If the queried maturity is beyond the longest calibrated expiry, we extrapolate using the last expiry's SABR parameters evaluated at the queried maturity (flat-parameter extrapolation). If a particular expiry's calibration failed (e.g. insufficient strikes after cleansing), we use the nearest neighboring expiry's SABR parameters as a substitute.
4. Strike Conventions
We adopt a spot-based convention for both moneyness and delta queries:
Moneyness
where K is the strike and S is the spot price at the snapshot time. moneyness = 1.0 is at-the-money relative to spot. moneyness = 0.95 is a strike 5% below spot (typical OTM put), moneyness = 1.05 is 5% above (typical OTM call).
Delta
Delta queries also use the spot-based convention. The delta is the standard Black-Scholes lognormal delta computed at the SABR-fitted vol with spot as the underlying:
where d₁ = [ln(S/K) + (r + σ²/2)·T] / (σ·√T)
A 0.25 delta call is the strike where the option's spot delta equals 0.25 (typical OTM call), and a 0.25 delta put is the strike where the put's delta equals -0.25 (typical OTM put). When you query by delta, the API solves for the strike that produces the requested delta under the calibrated SABR vol surface.
5. Constant-Maturity Convention
Listed option expiries are discrete and roll forward periodically. For consistent time series suitable for backtesting and regression analysis, we expose data at fixed constant tenors rather than at calendar expiry dates.
Available constant maturities:
- 1D1W2W3W Short-dated
- 1M2M3M Medium-dated
- 6M9M1Y Long-dated
For each constant tenor, we publish vol at a grid of fixed strikes — addressable either by moneyness or by delta:
Moneyness grid (K / S)
- Deep OTM puts: 0.30, 0.40, 0.60
- OTM puts: 0.80, 0.85, 0.90, 0.95, 0.975
- ATM: 1.00
- OTM calls: 1.025, 1.05, 1.10, 1.20
- Deep OTM calls: 1.30, 1.50, 1.75, 2.00, 2.50, 3.00
Delta grid (spot delta magnitude)
- Puts: 5Δ, 10Δ, 15Δ, 25Δ, 35Δ
- ATM: 50Δ (call only)
- Calls: 5Δ, 10Δ, 15Δ, 25Δ, 35Δ
Constant-maturity vols are produced by the same vol-interpolation procedure described in Section 3: SABR is evaluated at the requested strike on each bracketing expiry, and the resulting vols are interpolated to the target tenor in total-variance space.
The result: a clean daily time series at, say, 30-day constant maturity 25-delta call, suitable for regression and backtesting without expiry-rolloff artifacts. Available via /v1/vol-history.
6. Volatility Index
The CryptoVol Index is a model-free implied volatility measure following the variance-swap methodology popularized by the CBOE VIX, adapted for crypto options:
where Q(Kᵢ) is the mid-price of the out-of-the-money option at strike Kᵢ.
Constant-maturity indices (7D, 30D) are produced by interpolating the variance swap rate to the target tenor in total-variance space:
where w = (T₂ − T*) / (T₂ − T₁)
Index(T*) = √[ VarSwap(T*) ] × 100
Available via /v1/vol-index.
7. Greeks and Analytics
For Pro and Ultra tiers, the /v1/vol-surface and /v1/vol-surface/bulk endpoints support include_analytics=true, which returns advanced analytics such as spot, forward, yield rate, Black-Scholes option price, and Greeks (delta, gamma, vega, theta) for each queried point.
8. Limitations and Caveats
- Liquidity varies by asset and tenor. Short-dated options on illiquid alts (XRP, AVAX, TRX) may have wide bid-ask spreads or sparse quotes; SABR fits in these regions are best treated as indicative.
- Snapshot, not streaming. Data is captured 3× daily, not in real time. We are evaluating live data as a future feature.
- Not financial advice. The data is provided for research, modeling, and informational purposes only.
API Access
All data described above is available via our REST API:
GET /v1/vol-index— daily implied volatility index time seriesGET /v1/vol-surface— single-point vol query by strike, moneyness, or deltaPOST /v1/vol-surface/bulk— multiple points in one requestGET /v1/vol-history— historical constant-maturity / constant-strike series
See pricing and full coverage details on the main page, or get an API key at cryptovol.io/api. Questions? Email support@cryptovol.io.