Data inputs and point-in-time guarantees
Every published number traces to six raw feeds: 1-minute option bid/ask quotes, 1-minute stock bars, cash dividend history, stock split history, confirmed earnings timestamps, and the daily Treasury par yield curve. One timestamp convention aligns all of them. Every timestamp labels a right-open one-minute interval [T - 1min, T) in America/New_York, so a value stamped 09:31 is the last known state during [09:30, 09:31). That single rule is what lets a spot bar and an option quote match exactly at the same minute, and it is what keeps a read at any minute anchored to the past and never the future.
The inputs
Six raw feeds enter the pipeline. Each has one job.
bid, ask, and the derived mid = (bid + ask) / 2.S, taken as the unadjusted close.r each option is priced against, interpolated to the contract's days to expiry.The minute timestamp convention
A timestamp labels the right-open interval [T - 1min, T) in America/New_York. Read every timestamp as the state at the end of the minute that precedes it.
- The
09:31quote is the last known bid/ask during[09:30, 09:31), fully available at09:31. - The
09:31stock bar covers[09:30, 09:31), and itscloseis that minute's last trade.
Because both feeds sit on the same minute grid, spot-to-quote matching is exact: the 09:31 quote prices against the 09:31 stock bar, no interpolation between them. The regular session runs 09:31 through 16:00, which is 390 minutes on a full day. Early closes shorten it. A 13:00 close (for example, the day before July 4th) leaves about 210 minutes.
Time to expiry is measured to the actual close
Time to expiry t runs to the real market-close minute on the expiration date, not a fixed 16:00. On a normal expiration day that close is 16:00. On an early-close expiration it is the actual close (13:00 on a half day), and t shrinks to match. This keeps t honest on the days it matters most, when a contract expires into a shortened session and the remaining time is materially different from the calendar assumption.
Why spot is the raw, unadjusted close
Spot S is the raw close, with no split or dividend adjustment applied. This is deliberate, and it is the correct choice for options pricing.
When a stock splits, the OCC adjusts open option strikes by the split ratio. Raw spot S and raw strike K therefore stay in the same contemporaneous unit at every point in history. An adjusted spot would sit in current-share units while the strike stayed raw, and the two would no longer describe the same instrument. That mismatch corrupts the implied forward and the log-moneyness (ln(K/forward)) built on it, and through them every IV and every Greek on the surface.
Adjusted price series do exist, and they matter for other work. See stock price adjustments for the split-adjusted and total-return series. They are never the options spot.
Stale-spot handling
A quote minute occasionally arrives with no matching stock bar (a halt, a thin minute on the underlying). When that happens, the most recent prior same-day bar's close is carried forward onto the quote through a backward as-of match, with no enforced minute cap on the carry. A per-row spot-staleness marker records how many minutes old the carried spot is, so the condition stays observable downstream rather than hiding inside the price. The configured staleness threshold (stale_spot_max_minutes, default 3) drives that marker, not a hard cutoff that drops the quote.
The one genuine drop is a null spot: a quote with no prior bar at all that day (for example, one arriving before the session's first bar) has nothing to carry forward, so it cannot be priced and is dropped.
The point-in-time guarantee
The whole platform reads data with a backward as-of fill: a read at minute t takes the most recent row whose timestamp <= t, never a row from the future. Timestamps that fall before a series' first observation return null, not a guessed value.
This is the same backward as-of fill that aligns mixed-frequency Signals on the union spine, and it is inherited everywhere: a daily value becomes readable only at its session-close label, so today's daily number is not visible intraday. Every accessor, every IV, every Greek, and every backtest read obeys the one rule. A number computed at 11:00 saw only what was knowable at 11:00.
A note on the accessor spine
The bar and option accessor spine is 09:31 through the close, with no auction trim. That is 390 observations on a normal day and about 210 on a half day. The first and last minutes of the session are on the spine like any other.
The 5-minute open and close offsets you may see elsewhere (first fill at 09:35, last trade at 15:55, or 12:55 on an early close) are not a data trim. They are session bounds on the backtest engine, chosen because option quotes are least reliable right at the open and into the close. Those bounds live in the execution model, on the fills and marks page, and across the Backtests section. The data you read through an accessor is not trimmed to them.