{"slug":"how-big-is-the-options-quote-feed","qid":"tape_counts","label":"One session, two tapes: every options NBBO update vs. every stock NBBO update","post_title":"How Big Is the OPRA Options Quote Feed?","post_url":"/blog/how-big-is-the-options-quote-feed#q-tape_counts","columns":["session_date","option_quote_updates_bn","stock_quote_updates_m","stock_symbols_quoted","option_to_stock_ratio","option_trades_m","option_contracts_traded_k","quote_updates_per_trade","avg_updates_per_second_k"],"rows":[{"session_date":"2026-08-17","option_quote_updates_bn":6.07,"stock_quote_updates_m":340,"stock_symbols_quoted":13087,"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}],"shape":"scalar","sql":"WITH (\n    SELECT max(toDate(toTimeZone(window_start, 'America/New_York')))\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= toDateTime(today() - 10)\n      AND window_start < toDateTime(today() - 4)\n) AS session_day,\n(\n    SELECT (count(), uniqExact(ticker))\n    FROM global_markets.cache_stocks_quotes\n    WHERE sip_timestamp >= toDateTime(session_day)\n      AND sip_timestamp < toDateTime(session_day + 1)\n) AS stock_tape,\n(\n    SELECT (count(), uniqExact(ticker))\n    FROM global_markets.options_trades\n    WHERE sip_timestamp >= toDateTime(session_day)\n      AND sip_timestamp < toDateTime(session_day + 1)\n) AS option_trades_t,\n(\n    SELECT toUInt32(max(sip_timestamp)) - toUInt32(min(sip_timestamp))\n    FROM global_markets.cache_options_quotes\n    WHERE ticker >= 'O:SPY26' AND ticker < 'O:SPY27'\n      AND sip_timestamp >= toDateTime(session_day)\n      AND sip_timestamp < toDateTime(session_day + 1)\n) AS spy_span_seconds\nSELECT\n    toString(session_day) AS session_date,\n    round(count() / 1e9, 2) AS option_quote_updates_bn,\n    round(stock_tape.1 / 1e6, 0) AS stock_quote_updates_m,\n    stock_tape.2 AS stock_symbols_quoted,\n    round(count() / stock_tape.1, 1) AS option_to_stock_ratio,\n    round(option_trades_t.1 / 1e6, 1) AS option_trades_m,\n    round(option_trades_t.2 / 1e3, 0) AS option_contracts_traded_k,\n    round(count() / option_trades_t.1, 0) AS quote_updates_per_trade,\n    round(count() / spy_span_seconds / 1e3, 0) AS avg_updates_per_second_k\nFROM global_markets.cache_options_quotes\nWHERE sip_timestamp >= toDateTime(session_day)\n  AND sip_timestamp < toDateTime(session_day + 1)","computed_at":"2026-08-22T04:12:28.219980+00:00","elapsed":244.510602099}