{"slug":"how-big-is-the-options-quote-feed","qid":"spy_slice","label":"SPY's 2026-expiry option chain: one root's share of the quote firehose","post_title":"How Big Is the OPRA Options Quote Feed?","post_url":"/blog/how-big-is-the-options-quote-feed#q-spy_slice","columns":["session_date","spy_quote_updates_m","spy_contracts_quoted","avg_updates_per_contract_k","same_day_expiry_contracts","same_day_expiry_pct_of_updates","same_day_median_width_cents","all_spy_median_width_cents","dropped_invalid_quotes_k","spy_first_quote_et","spy_last_quote_et","spy_first_quote_et_minute","spy_last_quote_et_minute"],"rows":[{"session_date":"2026-08-17","spy_quote_updates_m":164,"spy_contracts_quoted":9594,"avg_updates_per_contract_k":17.1,"same_day_expiry_contracts":422,"same_day_expiry_pct_of_updates":3.7,"same_day_median_width_cents":16,"all_spy_median_width_cents":3,"dropped_invalid_quotes_k":197,"spy_first_quote_et":"09:30","spy_last_quote_et":"16:15","spy_first_quote_et_minute":570,"spy_last_quote_et_minute":975}],"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\nSELECT\n    toString(session_day) AS session_date,\n    round(count() / 1e6, 1) AS spy_quote_updates_m,\n    uniqExact(ticker) AS spy_contracts_quoted,\n    round(count() / uniqExact(ticker) / 1e3, 1) AS avg_updates_per_contract_k,\n    uniqExactIf(ticker, substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d')) AS same_day_expiry_contracts,\n    round(100.0 * countIf(substring(ticker, 6, 6) = formatDateTime(session_day, '%y%m%d')) / count(), 1) AS same_day_expiry_pct_of_updates,\n    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,\n    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,\n    round(countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) / 1e3, 0) AS dropped_invalid_quotes_k,\n    formatDateTime(toTimeZone(min(sip_timestamp), 'America/New_York'), '%H:%i') AS spy_first_quote_et,\n    formatDateTime(toTimeZone(max(sip_timestamp), 'America/New_York'), '%H:%i') AS spy_last_quote_et,\n    toHour(toTimeZone(min(sip_timestamp), 'America/New_York')) * 60 + toMinute(toTimeZone(min(sip_timestamp), 'America/New_York')) AS spy_first_quote_et_minute,\n    toHour(toTimeZone(max(sip_timestamp), 'America/New_York')) * 60 + toMinute(toTimeZone(max(sip_timestamp), 'America/New_York')) AS spy_last_quote_et_minute\nFROM global_markets.cache_options_quotes\nWHERE ticker >= 'O:SPY26' AND ticker < 'O:SPY27'\n  AND sip_timestamp >= toDateTime(session_day)\n  AND sip_timestamp < toDateTime(session_day + 1)","computed_at":"2026-08-22T04:13:24.474325+00:00","elapsed":56.141727957}