DocsData & MethodologyHow every number is produced
Data & MethodologyGuide

How every number is produced

Every number on the platform traces back to six raw inputs and one pipeline. Per contract, per minute, a bid/ask quote and its reference data go through a Black-Scholes-Merton inversion that yields implied volatility and the five Greeks. Three side channels reuse the same inputs to produce an implied forward, dealer gamma and vanna exposure, and an ex-earnings IV. Three guarantees hold across all of it. Every read is point-in-time: minute t sees only rows stamped at or before t. Each strike is marked independently rather than fitted to an arbitrage-free surface. And every option.* read is interpolated across the surface, returning null instead of extrapolating where the data is sparse.

Updated Jul 20264 min read

The chain is fully built. What differs is reach: a large share of what the pipeline computes has no accessor in the Signal language. Mid IV and the five Greeks come straight off the surface; the implied forward, dealer exposure, the earnings metrics, and several others are computed upstream but have no accessor. The full split lives in one table on this page.

The six raw inputs

Six inputs feed everything downstream. Each has one job.

  • 1-minute option bid/ask quotes are the price implied volatility inverts from. The inversion runs against the bid, mid, and ask, producing a bid IV, a mid IV, and an ask IV.
  • 1-minute unadjusted stock bars supply the raw spot S. Raw is the correct choice: when a stock splits, open strikes adjust by the same ratio, so raw spot and raw strike stay contemporaneous in one unit.
  • Cash dividends (regular cash only) enter as a discrete schedule escrowed into the spot for pricing.
  • Splits drive the adjusted stock series, not the options dividend basis, which stays on the same raw basis as spot and strikes.
  • Confirmed earnings timestamps drive the ex-earnings decomposition. Only symbols with an earnings calendar get it; broad ETFs and indices do not.
  • The Treasury par yield curve becomes the risk-free rate r each option is priced with, converted to continuously-compounded zero rates and interpolated by days to expiration.

For the meaning and timestamp conventions of each input, see data inputs and point-in-time guarantees. For which symbols carry which inputs, see data coverage.

From quote to IV to Greeks

The spine of the pipeline is a per-contract, per-minute inversion. The pipeline inverts the pricing model against the contract's own bid, mid, and ask to produce three implied volatilities. Dividends are escrowed into the spot before the solve, so the inversion runs with q=0 and the discrete dividend schedule carries the dividend effect instead of a continuous yield. The five Greeks come from the same inputs evaluated at the solved IV, so price, IV, and Greeks stay mutually consistent for that contract at that minute.

The other channels

Three channels branch off the same inputs.

  • Implied forward, carry, and borrow. Put-call parity on clean call/put pairs at each expiry yields one implied forward per expiry, and from it the implied carry and borrow.
  • Dealer exposure. Gamma and vanna times open interest produce GEX and VEX, additive across strikes and expiries.
  • Ex-earnings IV. A variance decomposition across the expiries straddling an event strips the earnings component out, producing an ex-earnings IV and the companion earnings metrics.

Three guarantees that hold everywhere

These hold for every accessor read, on every topic page.

Point-in-time, no-lookahead. A read at minute t takes the most recent row with timestamp <= t, never a future row. This is the same no-lookahead guarantee the Signal language enforces on market data throughout.

Per-contract marks, not an arbitrage-free surface. Each strike is inverted independently from its own quote. There is no surface fitting at this layer, so smiles can lose convexity and term structure can invert. The numbers are honest per-strike marks, not a smoothed, arbitrage-repaired surface.

Interpolated, and null at the edges. Every option.* read is bilinearly interpolated across two dimensions, days to expiration and either delta or log-moneyness. The read fetches the four bracketing contracts and interpolates at each minute. When the surface is sparse or the inversion fails to converge, the result is null rather than an extrapolated value. An IV or Greek read through an accessor is therefore a surface-interpolated value, not a raw per-strike grid value.

What you can read vs. what we compute

The pipeline computes far more than the Signal language exposes. This is the one place the full split lives; each topic page carries only its own rows.

Readable via an accessor
Computed upstream, no accessor
Bid / mid / ask IV via option.iv(dte, ..., iv_type="bid"|"mid"|"ask"), mid by default; the ex-earnings variant via use_ex_earn_iv=True
The IV quality and provenance labels (status, model used, wide / one-sided / parity flags, the spot-staleness marker), and is_floored_t
The five Greeks: option.delta, option.gamma, option.theta, option.vega, option.rho
vanna
The option.contract(...) and leg columns, the full selected-contract surface: strike, dte, delta, gamma, theta, vega, rho, iv, mid, bid, ask, underlying_price, moneyness, multiplier, size, and the direction-scaled scaled_delta, scaled_gamma, scaled_theta, scaled_vega, scaled_rho (each Greek × size)
The dividend-escrow spot, the informational dividend yield q, and the next ex-dividend date
bar.open, bar.high, bar.low, bar.close, bar.volume (split- and dividend-adjusted by default; raw via their adjustment switches)
The risk-free rate r
The full time.* calendar surface
The implied forward, implied_carry, implied_borrow, and the forward method
Open interest, GEX, and VEX
The earnings metrics: event vol, ambient vol, implied move, next earnings date, event timing
The total-return stock series
The arbitrage-free IV surface, which is not computed at all

Everything in the right column is computed in the pipeline but has no Signal-language accessor, with the exception of the arbitrage-free surface, which is not computed at all. These quantities exist in the pipeline but cannot be read.

One precise note on the readable set: only the five Greeks (delta, gamma, theta, vega, rho) and iv have a standalone option.* accessor. The rest of the surface, strike, dte, mid, bid, ask, underlying_price, moneyness, multiplier, size, and the scaled_* exposures, is readable only as an option.contract() or leg column, with moneyness additionally usable as the moneyness= selection argument on option.* calls. None of those is a standalone option.* series you can read on its own.

The accessor spine

The bar, option, and time accessors run 09:31 through the market close: 390 trading minutes on a full session, 210 on an early-close day (for example a 13:00 close). Every accessor shares this one clock, so a bar read and an option read align minute for minute. There is no opening-auction or closing-auction trim on the data itself.

If you have seen a 5-minute open or close offset, that is the backtest engine's session bounds, not the data spine: first fill at 09:35, last trade at 15:55 (12:55 on an early close). Those bounds live in fills, marks, and slippage and across the Backtests section, not here. For how sampling and interpolation shape what a single read returns on this spine, see the execution model.

Was this page helpful?