{"slug":"why-spreads-widen-at-the-open","qid":"session_phases","label":"Median quoted spread by phase of the trading day, in basis points (ET clock)","post_title":"Why Are Spreads Wider at the Open? Real Data","post_url":"/blog/why-spreads-widen-at-the-open#q-session_phases","columns":["phase","spy_bps","aapl_bps","etsy_bps"],"rows":[{"phase":"Premarket 04:00-07:00","spy_bps":0.81,"aapl_bps":9.1,"etsy_bps":508.12},{"phase":"Premarket 07:00-09:30","spy_bps":0.68,"aapl_bps":4.87,"etsy_bps":475},{"phase":"Open 09:30-10:00","spy_bps":0.27,"aapl_bps":2.09,"etsy_bps":23.8},{"phase":"Midday 12:00-14:00","spy_bps":0.27,"aapl_bps":1.17,"etsy_bps":7.23},{"phase":"After-hours 16:00-20:00","spy_bps":0.81,"aapl_bps":5.83,"etsy_bps":205.58}],"shape":"ranking","sql":"SELECT phase,\n       round(quantileExact(0.5)(spy_b), 2) AS spy_bps,\n       round(quantileExact(0.5)(aapl_b), 2) AS aapl_bps,\n       round(quantileExact(0.5)(etsy_b), 2) AS etsy_bps\nFROM (\n    SELECT multiIf(et_min >= 240 AND et_min < 420, 'Premarket 04:00-07:00',\n                   et_min >= 420 AND et_min < 570, 'Premarket 07:00-09:30',\n                   et_min >= 570 AND et_min < 600, 'Open 09:30-10:00',\n                   et_min >= 720 AND et_min < 840, 'Midday 12:00-14:00',\n                   et_min >= 960 AND et_min < 1200, 'After-hours 16:00-20:00', 'other') AS phase,\n           if(ticker = 'SPY', spread_bps, NULL) AS spy_b,\n           if(ticker = 'AAPL', spread_bps, NULL) AS aapl_b,\n           if(ticker = 'ETSY', spread_bps, NULL) AS etsy_b\n    FROM (\n        SELECT ticker,\n               toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60\n                 + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,\n               toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps\n        FROM global_markets.cache_stocks_quotes\n        WHERE ticker IN ('SPY', 'AAPL', 'ETSY')\n          AND sip_timestamp >= toDateTime(today() - 14)\n          AND sip_timestamp < toDateTime(today() - 3)\n          AND bid_price > 0\n          AND ask_price > bid_price\n    )\n    WHERE phase != 'other'\n)\nGROUP BY phase\nORDER BY indexOf(['Premarket 04:00-07:00', 'Premarket 07:00-09:30', 'Open 09:30-10:00', 'Midday 12:00-14:00', 'After-hours 16:00-20:00'], phase)","computed_at":"2026-08-08T04:50:00.921112+00:00","elapsed":22.366931437}