How Big Is the OPRA Options Quote Feed?
One session, two tapes: every options NBBO update vs. every stock NBBO updatescalar ·
2026-08-22 · 1×96.07
SPY's 2026-expiry option chain: one root's share of the quote firehosescalar ·
2026-08-22 · 1×13164
The five busiest SPY option contracts of the session, symbol unpackedseries ·
2026-08-22 · 5×7
One session, two tapes: every options NBBO update vs. every stock NBBO update
One session, two tapes: every options NBBO update vs. every stock NBBO update
session date
2026-08-17
option quote updates bn
6.07
stock quote updates m
340
stock symbols quoted
13,087
option to stock ratio
17.8
option trades m
10.5
option contracts traded k
350
quote updates per trade
580
avg updates per second k
250
the exact SQL behind every number
WITH (
SELECT max(toDate(toTimeZone(window_start, 'America/New_York')))
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 4)
) AS session_day,
(
SELECT (count(), uniqExact(ticker))
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= toDateTime(session_day)
AND sip_timestamp < toDateTime(session_day + 1)
) AS stock_tape,
(
SELECT (count(), uniqExact(ticker))
FROM global_markets.options_trades
WHERE sip_timestamp >= toDateTime(session_day)
AND sip_timestamp < toDateTime(session_day + 1)
) AS option_trades_t,
(
SELECT toUInt32(max(sip_timestamp)) - toUInt32(min(sip_timestamp))
FROM global_markets.cache_options_quotes
WHERE ticker >= 'O:SPY26' AND ticker < 'O:SPY27'
AND sip_timestamp >= toDateTime(session_day)
AND sip_timestamp < toDateTime(session_day + 1)
) AS spy_span_seconds
SELECT
toString(session_day) AS session_date,
round(count() / 1e9, 2) AS option_quote_updates_bn,
round(stock_tape.1 / 1e6, 0) AS stock_quote_updates_m,
stock_tape.2 AS stock_symbols_quoted,
round(count() / stock_tape.1, 1) AS option_to_stock_ratio,
round(option_trades_t.1 / 1e6, 1) AS option_trades_m,
round(option_trades_t.2 / 1e3, 0) AS option_contracts_traded_k,
round(count() / option_trades_t.1, 0) AS quote_updates_per_trade,
round(count() / spy_span_seconds / 1e3, 0) AS avg_updates_per_second_k
FROM global_markets.cache_options_quotes
WHERE sip_timestamp >= toDateTime(session_day)
AND sip_timestamp < toDateTime(session_day + 1)
More from this analysisHow Big Is the OPRA Options Quote Feed?
SPY's 2026-expiry option chain: one root's share of the quote firehose
scalar 1×13
→
The five busiest SPY option contracts of the session, symbol unpacked
series 5×7
→
SPY, the same measurement: the market's calm benchmark
scalar 1×3
→
ATM implied volatility across every actively traded underlying, latest session
scalar 1×5
→
See all 2,170 queries →