{"slug":"how-much-does-it-cost-to-trade-options","qid":"spy_stock_vs_options","label":"SPY options vs. SPY stock on one session: quote count, trade count, and median quoted spread","post_title":"How Much Does It Cost to Trade Options?","post_url":"/blog/how-much-does-it-cost-to-trade-options#q-spy_stock_vs_options","columns":["session_date","spy_opt_updates","spy_stock_updates","opt_to_stock_update_ratio","spy_opt_trades","quotes_per_trade","spy_opt_median_spread_bps","spy_stock_median_spread_bps","ratio_opt_to_stock_spread","spy_underlying_close"],"rows":[{"session_date":"2026-07-02","spy_opt_updates":462934241,"spy_stock_updates":4956892,"opt_to_stock_update_ratio":93.4,"spy_opt_trades":1804557,"quotes_per_trade":256.5,"spy_opt_median_spread_bps":80.97,"spy_stock_median_spread_bps":0.27,"ratio_opt_to_stock_spread":299.9,"spy_underlying_close":744.8}],"shape":"scalar","sql":"WITH\n    opt_q AS (\n        SELECT\n            count() AS opt_updates,\n            quantileDeterministic(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2), cityHash64(ticker, sip_timestamp)) AS opt_median_spread_ratio\n        FROM global_markets.cache_options_quotes\n        WHERE sip_timestamp >= '2026-07-02 13:30:00' AND sip_timestamp < '2026-07-02 20:00:00'\n          AND ticker >= 'O:SPY26' AND ticker < 'O:SPY27'\n          AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n    ),\n    stock_q AS (\n        SELECT\n            count() AS stock_updates,\n            quantileDeterministic(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2), cityHash64(ticker, sip_timestamp)) AS stock_median_spread_ratio\n        FROM global_markets.cache_stocks_quotes\n        WHERE sip_timestamp >= '2026-07-02 13:30:00' AND sip_timestamp < '2026-07-02 20:00:00'\n          AND ticker = 'SPY'\n          AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n    ),\n    opt_t AS (\n        SELECT count() AS opt_trades FROM global_markets.options_trades\n        WHERE sip_timestamp >= '2026-07-02 13:30:00' AND sip_timestamp < '2026-07-02 20:00:00'\n          AND ticker >= 'O:SPY26' AND ticker < 'O:SPY27'\n    ),\n    stock_close AS (\n        SELECT round(argMax(toFloat64(close), window_start), 2) AS spy_close\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY' AND window_start >= '2026-07-02 13:30:00' AND window_start < '2026-07-02 20:00:00'\n    )\nSELECT\n    '2026-07-02' AS session_date,\n    opt_q.opt_updates AS spy_opt_updates,\n    stock_q.stock_updates AS spy_stock_updates,\n    round(opt_q.opt_updates / stock_q.stock_updates, 1) AS opt_to_stock_update_ratio,\n    opt_t.opt_trades AS spy_opt_trades,\n    round(opt_q.opt_updates / opt_t.opt_trades, 1) AS quotes_per_trade,\n    round(opt_q.opt_median_spread_ratio * 10000, 2) AS spy_opt_median_spread_bps,\n    round(stock_q.stock_median_spread_ratio * 10000, 2) AS spy_stock_median_spread_bps,\n    round(opt_q.opt_median_spread_ratio / stock_q.stock_median_spread_ratio, 1) AS ratio_opt_to_stock_spread,\n    stock_close.spy_close AS spy_underlying_close\nFROM opt_q CROSS JOIN stock_q CROSS JOIN opt_t CROSS JOIN stock_close","computed_at":"2026-08-14T14:21:36.741780+00:00","elapsed":0.004857973}