{"slug":"how-much-does-it-cost-to-trade-options","qid":"cross_product_spreads","label":"Options bid-ask spreads by product: median basis points, July 2, 2026 regular hours","post_title":"How Much Does It Cost to Trade Options?","post_url":"/blog/how-much-does-it-cost-to-trade-options#q-cross_product_spreads","columns":["root","quote_updates_millions","median_spread_bps","median_width_cents"],"rows":[{"root":"GLD","quote_updates_millions":19.9,"median_spread_bps":786.75,"median_width_cents":30},{"root":"IWM","quote_updates_millions":103.5,"median_spread_bps":130.72,"median_width_cents":8},{"root":"QQQ","quote_updates_millions":359.7,"median_spread_bps":123.71,"median_width_cents":11},{"root":"SPY","quote_updates_millions":462.9,"median_spread_bps":80.97,"median_width_cents":4},{"root":"TSLA","quote_updates_millions":184.9,"median_spread_bps":309.93,"median_width_cents":70}],"shape":"ranking","sql":"SELECT\n    root,\n    round(count() / 1e6, 1) AS quote_updates_millions,\n    round(quantileDeterministic(0.5)(spread_bps, det), 2) AS median_spread_bps,\n    round(quantileDeterministic(0.5)(width_cents, det), 2) AS median_width_cents\nFROM (\n    SELECT 'SPY' AS root, (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps, (toFloat64(ask_price) - toFloat64(bid_price)) * 100 AS width_cents, cityHash64(ticker, sip_timestamp) AS det\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    UNION ALL\n    SELECT 'QQQ' AS root, (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps, (toFloat64(ask_price) - toFloat64(bid_price)) * 100 AS width_cents, cityHash64(ticker, sip_timestamp) AS det\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:QQQ26' AND ticker < 'O:QQQ27'\n      AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n    UNION ALL\n    SELECT 'IWM' AS root, (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps, (toFloat64(ask_price) - toFloat64(bid_price)) * 100 AS width_cents, cityHash64(ticker, sip_timestamp) AS det\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:IWM26' AND ticker < 'O:IWM27'\n      AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n    UNION ALL\n    SELECT 'GLD' AS root, (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps, (toFloat64(ask_price) - toFloat64(bid_price)) * 100 AS width_cents, cityHash64(ticker, sip_timestamp) AS det\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:GLD26' AND ticker < 'O:GLD27'\n      AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n    UNION ALL\n    SELECT 'TSLA' AS root, (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps, (toFloat64(ask_price) - toFloat64(bid_price)) * 100 AS width_cents, cityHash64(ticker, sip_timestamp) AS det\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:TSLA26' AND ticker < 'O:TSLA27'\n      AND bid_price > 0 AND ask_price > 0 AND ask_price > bid_price\n)\nGROUP BY root\nORDER BY root ASC","computed_at":"2026-08-14T14:21:36.927064+00:00","elapsed":0.007012039}