Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-10-04 · data as of October 4, 2026 · refreshed weekly

How Big Be the OPRA Options Quote Feed?

We count one full day of OPRA NBBO updates, show why every listed option contract makes the feed so big, and compare am with the full stock quote tape.

Options quote feed na the biggest stream of market data for US: every listed option contract get its own best bid and best ask. OPRA, wey be the Options Price Reporting Authority and consolidated tape for US listed options, dey publish every update for each one of dem. For 2026-09-29, one normal trading session, our warehouse record 7.99 billion options quote updates. Na 17 times the size of the entire stock quote tape for that same day. This page dey measure the firehose directly, and exact query wey produce every number dey attached.

Wetin make options quote feed so big?

Stock get one national best bid and offer, plus one bid-ask spread wey need current update.

But option chain multiply the matter. Every listed contract, every combination of expiration date, strike price, and call-or-put, get its own NBBO quote. For 2026-09-29, SPY alone get 7316 different contracts wey dey quote, counting only its 2026 expiries.

The multiplication no stop for number of contracts. Option value dey move with the underlying stock. Once share price tick, market makers dey refresh quotes across the whole chain, for every strike and every expiry, all at once. Dem dey do am whether anybody trade those contracts or not.

Na this arithmetic the figures below measure: quote updates dey reach billions for one session, plus 812 quote updates for every executed options trade.

One day of the options tape, counted

Na how much data this one be for real? The panel below count every options quote update wey our warehouse store for 2026-09-29, the latest completed session wey dey at least five calendar days back. The scarcity section explain this rule. E compare am with the full stock quote tape for that same session. Na the same direct comparison wey the July 7 market recap do for the Monday tape. Both counts cover the full calendar day, based on universal time (UTC), wey cover the whole US options session.

QueryOne session, two tapes: every options NBBO update vs. every stock NBBO update
session dateoption quote updates bnstock quote updates mstock symbols wey dem quoteoption to stock ratiooption trades moption contracts wey dem trade kquote updates per tradeavg updates per second k
2026-09-297.9946913228179.8310812329
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)
Run am yourself

The complete options tape reach 7.99 billion NBBO updates. Only 310 thousand different contracts actually TRADED that day. The quote stream repriced far more contracts than the ones wey people actually trade. For that same day, the stock tape — every consolidated quote update for every listed stock and ETF, including premarket and after-hours — record 469 million updates across 13228 symbols. The main ratio na this: the options quote stream be 17 times the size of the stock quote stream.

Two other readings from the same scan show how the feed dey behave. When we average am across the session’s quoting period, using SPY’s chain because e deep pass for the tape, updates arrive at 329 thousand per second. The options market also record 9.8 million actual trades that day, with 812 quote updates for each one. Na quoting, no be trading, dey fill the pipe.

One root's slice: SPY option chain for one day

E hard to feel the number for the whole tape, and e still expensive to scan the whole tape, so make we cut one slice. The panel below count every quote update for SPY option contracts wey go expire for 2026, during the same session and the same UTC-bounded day: na one underlying chain, carved out from the firehose by ticker range.

QuerySPY's 2026-expiry option chain: one root's share of the quote firehose
session datespy quote updates mSPY contracts wey dem quoteavg updates per contract ksame day expiry contractssame day expiry pct of updatessame day median width centsall SPY median width centsinvalid quotes wey dem drop kSPY first quote ETSPY last quote ETSPY first quote ET minuteSPY last quote ET minute
2026-09-29352.9731648.231011.2126109:3016:15570975
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
    toString(session_day) AS session_date,
    round(count() / 1e6, 1) AS spy_quote_updates_m,
    uniqExact(ticker) AS spy_contracts_quoted,
    round(count() / uniqExact(ticker) / 1e3, 1) AS avg_updates_per_contract_k,
    uniqExactIf(ticker, substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d')) AS same_day_expiry_contracts,
    round(100.0 * countIf(substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d')) / count(), 1) AS same_day_expiry_pct_of_updates,
    quantileExactWeightedIf(0.5)(toInt32(round(toFloat64(ask_price - bid_price) * 100)), 1, bid_price > 0 AND ask_price >= bid_price AND substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d')) AS same_day_median_width_cents,
    quantileExactWeightedIf(0.5)(toInt32(round(toFloat64(ask_price - bid_price) * 100)), 1, bid_price > 0 AND ask_price >= bid_price) AS all_spy_median_width_cents,
    round(countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) / 1e3, 0) AS dropped_invalid_quotes_k,
    formatDateTime(toTimeZone(min(sip_timestamp), 'America/New_York'), '%H:%i') AS spy_first_quote_et,
    formatDateTime(toTimeZone(max(sip_timestamp), 'America/New_York'), '%H:%i') AS spy_last_quote_et,
    toHour(toTimeZone(min(sip_timestamp), 'America/New_York')) * 60 + toMinute(toTimeZone(min(sip_timestamp), 'America/New_York')) AS spy_first_quote_et_minute,
    toHour(toTimeZone(max(sip_timestamp), 'America/New_York')) * 60 + toMinute(toTimeZone(max(sip_timestamp), 'America/New_York')) AS spy_last_quote_et_minute
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)
Run am yourself

One underlying produce 352.9 million options quote updates for one day: 7316 contracts dey quote, with average of 48.2 thousand updates per contract. To put the scale clear, the whole stock tape for the panel above, wey include every listed share and ETF together, record 469 million updates for that session.

Same-day expiries show the sharper picture. 0DTE options, wey be contracts wey dey trade on their own expiration day, dominate options trading. The parsed table further down show say all the five busiest SPY contracts for the session expire that same day. But for the quote stream, dem na small part: the 310 same-day contracts account for 11.2% of SPY quote updates. Market makers keep the whole chain priced. December strikes dey update throughout the session, whether anybody trade dem or not. Na this whole-chain view analysis dey use for every strike, including max pain, wey weigh open interest for every strike to find the price wey go leave option holders collecting the least at expiry.

Width na the other measurement wey worth checking here. Among those same-day SPY contracts, the median quoted width, ask minus bid, calculated across every valid NBBO update, measure 1¢. Across the full 2026-expiry chain, the same median measure 2¢. (61 thousand one-sided or crossed updates no enter the width medians, but dem still count for the panel.)

How to read an option ticker (OCC symbology)

Every contract for these panels get OCC option symbol, wey be the standard format Options Clearing Corporation dey manage. Our warehouse dey add O: for front. Make we use O:SPY261218C00700000 as example:

  • Root, SPY: na the option root, e fit reach six characters, and most times na the underlying own ticker.
  • Expiration, 261218: na expiry date for YYMMDD format, December 18, 2026.
  • Type, C for call, P for put.
  • Strike, 00700000: na strike price multiplied by 1,000 and padded with zero to reach eight digits, $700.00.

Na this fixed format dey make plain ticker range fit isolate one root chain: every SPY contract wey expire for 2026 dey sort between O:SPY26 and O:SPY27, exactly the filter wey dey for the panel above. See the five busiest SPY contracts for the session, with the symbol broken down:

QueryThe five busiest SPY option contracts of the session, symbol unpacked
OCC tickerrootexpiry parsedcall or putstrike USDcontracts wey dem trade kexpires same day
O:SPY260929C00765000SPY2026-09-29call7658071
O:SPY260929P00763000SPY2026-09-29put763715.51
O:SPY260929C00766000SPY2026-09-29call766691.91
O:SPY260929P00764000SPY2026-09-29put764658.61
O:SPY260929C00764000SPY2026-09-29call764613.51
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 ticker AS occ_ticker,
       any(underlying_symbol) AS root,
       concat('20', substring(ticker, 6, 2), '-', substring(ticker, 8, 2), '-', substring(ticker, 10, 2)) AS expiry_parsed,
       if(any(option_type) = 'C', 'call', 'put') AS call_or_put,
       any(toFloat64(strike_price)) AS strike_usd,
       round(sum(size) / 1e3, 1) AS contracts_traded_k,
       if(substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d'), 1, 0) AS expires_same_day
FROM global_markets.options_trades
WHERE sip_timestamp >= toDateTime(session_day)
  AND sip_timestamp < toDateTime(session_day + 1)
  AND ticker >= 'O:SPY26' AND ticker < 'O:SPY27'
GROUP BY ticker
ORDER BY contracts_traded_k DESC, ticker
LIMIT 5
Run am yourself

The top of the volume table na pure same-day traffic: all five contracts expire for 2026-09-29, the session own date. The busiest among dem, O:SPY260929C00765000, na $765-strike call contract, and e trade 807 thousand contracts. Compare am with the quote panel before this one: trading dey concentrate for the front of the chain, while quotes dey spread across the whole chain.

Why options quote data dey scarce

To store this feed mean say we need add one more day like the one we measure above, every session, forever. Na the economics for one line. Most market-data products, whether retail or professional, get stock prices and sometimes options trades. But full options quote history rare for anywhere, no matter the price. Our own warehouse get equity quote history from 2003 and options trade history from 2014. But the options quote table start for 2022. Na the youngest tick history we keep, and by far the biggest table we dey operate.

One disclosure need dey clear: options quotes na also the dataset wey dey arrive slowest for our system. New sessions normally land one or two days after the calendar date, and sometimes e fit take longer. Equity quotes usually settle within one day. Every panel for this page dey use the latest completed session wey dey at least five calendar days old (2026-09-29 for the current run). The weekly refresh dey run every query again with that same rule. This one make sure say each number come from a fully ingested day, no be from a half-loaded front edge.

FAQ

How big be the OPRA options feed for each day?

For our warehouse measurement: 7.99 billion options quote updates on 2026-09-29. That mean average of 329 thousand updates every second throughout the session quote period. The raw OPRA feed still carry trade and administrative messages on top quotes, and the official message count dey higher.

Options quote feed big pass stock quote feed?

Yes, by multiples, no be by percent. For the session we measure above, options quote updates reach 17 times the number of stock quote updates: 7.99 billion compared with 469 million. Each stock get one current NBBO, but the option chain for am fit get hundreds or thousands.

Why options market data dey cost so much?

The scale na the part wey people fit see first. Feed wey get billions of updates for one session need serious infrastructure to receive, store and query am. You still dey pay the bill every trading day. Exchange licensing fees dey add on top the engineering cost. The panels above show exactly wetin full options quote dataset need carry.

How many option contracts dey quote on normal day?

E pass the number wey trade, by far. On 2026-09-29, 310 thousand different contracts record at least one trade. At the same time, SPY 2026-expiry chain alone keep 7316 contracts quoting. The full quoted universe cover every root, just as SPY chain cover its strikes. (To count every different contract for one day quote stream na scan wey big too much, so we no include am for weekly-refreshed page. Na the only number here we deliberately no publish.)

Options quote after hours?

Listed US equity options dey trade during exchange hours. For the session we measure above, SPY first option quote show at 09:30 ET and the last one at 16:15 ET. No overnight session dey. The stock tape, for comparison, dey quote through premarket and after-hours.


Every panel above come with the exact SQL wey produce am. Open one, change the root or day, and measure the part of the feed wey you actually trade on the Strasmore terminal.