{"slug":"why-spreads-widen-at-the-open","qid":"session_stability","label":"Session by session: how often, and by how much, the open ran wider than midday","post_title":"Why Are Spreads Wider at the Open? Real Data","post_url":"/blog/why-spreads-widen-at-the-open#q-session_stability","columns":["ticker","sessions","median_session_x","calmest_session_x","worst_session_x","pct_sessions_open_wider"],"rows":[{"ticker":"SPY","sessions":7,"median_session_x":1.49,"calmest_session_x":0.66,"worst_session_x":2.01,"pct_sessions_open_wider":86},{"ticker":"AAPL","sessions":7,"median_session_x":2.3,"calmest_session_x":1.74,"worst_session_x":6.91,"pct_sessions_open_wider":100},{"ticker":"ETSY","sessions":7,"median_session_x":3.32,"calmest_session_x":2.24,"worst_session_x":4.13,"pct_sessions_open_wider":100}],"shape":"table","sql":"SELECT ticker,\n       count() AS sessions,\n       round(quantileExact(0.5)(ratio), 2) AS median_session_x,\n       round(min(ratio), 2) AS calmest_session_x,\n       round(max(ratio), 2) AS worst_session_x,\n       round(100 * countIf(ratio > 1) / count(), 0) AS pct_sessions_open_wider\nFROM (\n    SELECT ticker,\n           toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session_date,\n           quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)\n             / quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079) AS ratio\n    FROM (\n        SELECT ticker,\n               sip_timestamp,\n               toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_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 (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199\n          AND bid_price > 0\n          AND ask_price > bid_price\n    )\n    GROUP BY ticker, session_date\n    HAVING countIf(clock_min BETWEEN 810 AND 839) > 0\n       AND countIf(clock_min BETWEEN 960 AND 1079) > 0\n)\nGROUP BY ticker\nORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)","computed_at":"2026-08-08T04:51:06.425805+00:00","elapsed":26.172468541}