{"slug":"why-do-stocks-gap-overnight","qid":"gap_stats","label":"SPY, H1 2026: average absolute overnight gap vs average absolute intraday move","post_title":"Why Do Stocks Gap Up or Down Overnight?","post_url":"/blog/why-do-stocks-gap-overnight#q-gap_stats","columns":["sessions","avg_abs_overnight_gap_pct","avg_abs_intraday_move_pct","gaps_of_half_pct_or_more"],"rows":[{"sessions":123,"avg_abs_overnight_gap_pct":0.45,"avg_abs_intraday_move_pct":0.53,"gaps_of_half_pct_or_more":41}],"shape":"scalar","sql":"SELECT count() AS sessions,\n       round(avg(abs(100 * (rth_open - prior_close) / prior_close)), 2) AS avg_abs_overnight_gap_pct,\n       round(avg(abs(100 * (rth_close - rth_open) / rth_open)), 2) AS avg_abs_intraday_move_pct,\n       countIf(abs(100 * (rth_open - prior_close) / prior_close) >= 0.5) AS gaps_of_half_pct_or_more\nFROM (SELECT day, rth_open, rth_close, lagInFrame(rth_close) OVER (ORDER BY day) AS prior_close\n    FROM (\n        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,\n               argMinIf(toFloat64(open), window_start, rth) AS rth_open,\n               argMaxIf(toFloat64(close), window_start, rth) AS rth_close\n        FROM (\n            SELECT window_start, open, close,\n                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')\n                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth\n            FROM global_markets.delayed_stocks_minute_aggs\n            WHERE ticker = 'SPY'\n              AND window_start >= '2025-12-29 04:00:00'\n              AND window_start < '2026-07-01 08:00:00'\n        )\n        GROUP BY day\n    ))\nWHERE day >= '2026-01-01' AND prior_close > 0 AND isFinite(prior_close)","computed_at":"2026-07-26T06:36:45.702783+00:00","elapsed":0.19642289}