September 7, 2026 · options

The row your options backtest is built on: one Deribit BTC call, field by field

The row your options backtest is built on: one Deribit BTC call, field by field

Somebody on the research side asked me last month why our options agents kept rejecting a perfectly reasonable-looking long-gamma idea. The signal was fine. The vol forecast was fine. The problem was two fields in the market data feed and one number that isn't in the feed at all.

So here is the actual object we were arguing about. Deribit ticker response, BTC-25SEP26-110000-C, pulled at 11:20 UTC on a Monday with eighteen days left on the contract. I've trimmed the deprecated fields and kept everything that matters.

{
  "instrument_name": "BTC-25SEP26-110000-C",
  "index_price": 96412.18,
  "underlying_price": 96980.44,
  "underlying_index": "SYN.BTC-25SEP26",
  "estimated_delivery_price": 96412.18,
  "mark_price": 0.0041,
  "mark_iv": 42.14,
  "best_bid_price": 0.0038,  "best_bid_amount": 4.9,
  "best_ask_price": 0.0045,  "best_ask_amount": 12.1,
  "bid_iv": 40.42,           "ask_iv": 43.94,
  "last_price": 0.0043,
  "interest_rate": 0.0,
  "open_interest": 812.7,
  "greeks": {
    "delta": 0.0962, "gamma": 0.0000189,
    "vega": 36.77,   "theta": -42.91,  "rho": 4.61
  },
  "stats": { "volume": 61.2, "high": 0.0051, "low": 0.0036 }
}

instrument_name: four facts, one string

BTC-25SEP26-110000-C. Underlying BTC, expiry 25 September 2026, strike 110,000, call. What the string doesn't say, and what every new options backtest gets wrong at least once, is the rest of the contract spec: one contract is 1 BTC of underlying, the premium is quoted and paid in BTC, and expiry is 08:00 UTC, not 16:00 local anything.

Quoted in BTC is the sharp edge here. A mark of 0.0041 is 0.0041 BTC, roughly $395 at the index. If you store that column as a price and later join it against a USD-denominated strategy P&L, you have silently built a position whose dollar value moves with spot even when the option doesn't. I have seen a backtest where the long-call leg made money on a day BTC fell, purely because the premium column was interpreted as dollars and the researcher was actually short the coin-denominated premium against a dollar accounting frame. It took two days to find.

index_price vs underlying_price: 568 dollars apart, and only one is right

These are different by $568.26 and that is not an error. index_price is the Deribit BTC index — the spot reference, a blend of major exchanges, and the thing the contract ultimately settles against. underlying_price is the price of the synthetic forward for that specific expiry, SYN.BTC-25SEP26, derived from the futures market for the same date. Eighteen days of carry at roughly 12% annualised gets you those $568.

Every greek in the payload, and the mark IV, is computed off the forward. If you re-derive implied vol yourself using spot because that's the series you happened to have loaded, you will get a different number for every strike, and the error is systematically directional: calls look cheaper in vol terms than they are, puts look richer. On an 18-day contract with a 0.6% basis you'd mis-price mark IV by roughly a point and a half at this strike. That is larger than most of the vol edges people write strategies around.

interest_rate: 0.0 is Deribit telling you it does the discounting through the forward and not through a rate. Don't go looking for a risk-free curve to plug in; you'll double-count.

mark_price and mark_iv: a price with no counterparty

0.0041 BTC. Nobody paid that. Deribit computes mark from a fitted vol surface, anchored to the order book but smoothed across strikes and expiries so that margin and liquidations don't jump around when a single wide quote moves. Mark is what your margin uses, what your unrealised P&L uses, and what shows up in every position endpoint.

Which makes it the most seductive fill price in crypto options research, and the wrongest. A backtest that buys at mark and sells at mark is trading against a smoothing spline. It will produce a Sharpe. That Sharpe is a description of the surface fitter, and holds no information about whether you could have transacted.

The rule we ended up encoding: mark is for margin, risk and mid-to-mid attribution. It is never a fill. If the backtest needs a fill and there's no book snapshot for that timestamp, the run gets flagged as unpriced rather than filled at mark. We would rather lose the row.

best_bid 0.0038 / best_ask 0.0045: the spread in three units

Seven ticks wide in BTC terms. That's $67.50 on a $395 option, or 17% of premium. In vol terms it's 3.5 points, 40.4 bid against 43.9 offered, which is the number an options trader will actually quote you if you ask how wide something is.

The sizes matter as much as the prices: 4.9 contracts bid, 12.1 offered. Size on Deribit options is in contracts, so 4.9 BTC of underlying, about $472k notional — but only 0.47 BTC of delta at this strike. If your strategy wants meaningful gamma it needs tens of contracts, and the visible book at the touch gives you a fraction of that. The second level is usually another two or three ticks away. Any options backtest with a size model needs to walk the book or assume RFQ/block pricing, and those two assumptions give very different answers.

last_price: 0.0043 is a trade that happened at some point in the last 24 hours, possibly nineteen hours ago at a very different spot level. It's stale by construction on an instrument that trades 61 contracts a day. Don't build a return series out of it.

greeks: five numbers, four unit conventions

This block causes more silent damage than the rest of the payload combined, because every value is dimensionally correct and none of them are in the units you'd guess.

FieldValueUnitsCommon misread
delta0.0962BTC of underlying per contractTreated as dollar delta
gamma0.0000189Δdelta per $1 of underlyingAssumed per 1% move
vega36.77USD per 1 vol pointAssumed per 100% vol, or in BTC
theta-42.91USD per calendar dayAssumed per trading day
rho4.61USD per 1% rateIgnored, correctly

Delta is in coins, vega and theta are in dollars, gamma is per dollar of spot move. Mixing a coin-denominated delta into a dollar-denominated risk aggregate is how a book that looks flat turns out to be long 40 BTC. And theta being per calendar day is the one that bites weekend strategies: a Friday close to Monday open carries three days of decay, about $129 per contract here, against zero trading sessions. If your backtest steps by bars and applies theta per step, weekends vanish and every short-premium strategy gets quietly worse than it really was.

open_interest 812.7, volume 61.2: where the chain actually is

Eight hundred contracts of open interest on a strike that traded sixty-one yesterday. That's a real, live strike — 110,000 is a round number three weeks out, exactly where flow concentrates. Walk two strikes further out to 120,000 and open interest falls by an order of magnitude; walk to a non-round strike on a non-monthly expiry and you find instruments with a bid, an ask forty percent apart, and no trades in a week.

A chain-wide backtest that iterates over every listed instrument will happily fill you in all of them. We ended up gating on a joint condition: quoted spread under 20% of mark, at least 1 contract on both sides, and non-zero volume in the prior 24 hours. Roughly a third of the listed BTC chain survives that on a typical day. The other two-thirds are where the fake alpha lives.

The field that isn't in the payload

Nothing in this object tells you what a trade costs. Deribit charges 0.0003 BTC per option contract, maker and taker alike — 0.03% of the underlying, not of the premium — capped at 12.5% of the option's price. On this contract that's $28.92 a side, uncapped, because 12.5% of 0.0041 is 0.000513 and the flat fee is smaller.

Fee on notional and premium on vol means cost as a fraction of what you paid explodes as you go out of the money.

$67.50quoted spread (17% of mark)
$28.92fee per contract per side
31%round trip as % of premium
3.5 ptsbid/ask width in vol

Buy the offer at 0.0045 ($434), sell the bid at 0.0038 ($366), pay the fee twice: $125.80 to go around on a contract marked at $395. Your view has to be worth 31% of the premium before you're level. That's the whole reason the long-gamma idea got rejected, and it had nothing to do with the signal.

It gets more interesting if you ask what a delta costs, since fees scale with contracts and contracts scale inversely with delta. Holding mark IV flat at 42.1% across strikes for the arithmetic (a real chain has skew, and in crypto the call wing usually trades above the ATM, which makes this table optimistic):

InstrumentMark (BTC)DeltaContracts per 1 BTC deltaFee/sideCost per BTC of delta
97000-C (ATM)0.03730.5181.93$28.92$55.80
110000-C0.00410.09610.4$28.92$301
120000-C0.00040.01379.4$4.82 (capped)$383
BTC perp1.01.0$48.21$48.21

The 12.5% cap is doing real work in that bottom row; without it the deep wing would cost $2,300 per BTC of delta and lottery-ticket strategies would be arithmetically impossible rather than merely bad. Even with the cap, buying exposure through the 120,000 strike costs about eight times what the perpetual charges. Options aren't a cheap way to express direction, and any backtest that says otherwise has left this table out.

08:00 UTC, 25 September

The last thing the ticker doesn't tell you is how the position ends. Deribit settles options against a 30-minute average of the index leading into 08:00 UTC on expiry day, and charges a delivery fee of 0.00015 BTC on in-the-money contracts, also capped at 12.5% of settlement value.

Two consequences for a backtest. First, that averaging window is a real thing you can be wrong about: an option that's $300 in the money at 07:59 can settle worthless if the last half hour was ugly, and a backtest that settles against the 08:00 print will disagree with your paper account by a few basis points on most expiries and by a lot on a few. Second, the delivery fee applies whether or not you wanted the settlement, so a strategy that holds to expiry pays three fees a cycle and a strategy that closes at 07:30 pays two plus a spread. Which is cheaper depends on the strike, and it flips somewhere around 0.0012 BTC of premium. We compute it per position rather than picking a house rule.

The version of this post I wanted to write was about vol forecasting. Instead I spent a week on units and fee caps, which is roughly the correct ratio of glamour to reality in options research.

Twenty fields. Two prices that disagree by design, one price that never traded, greeks in four unit systems, and the cost model living entirely outside the payload in a docs page. If you're standing up an options backtest, spend your first day writing a single function that turns one of these objects into a fully-costed, correctly-denominated position — spread, fee, cap, delivery, coin-vs-dollar. Every strategy you write afterwards inherits whatever that function believes.

crypto optionsderibitimplied volatilityfeesbacktesting
← All posts