{"slug":"do-stock-gaps-get-filled","qid":"gap_fill_by_size","label":"Same-session gap fill rate by gap size, eight large caps, 2021 to 2026","post_title":"Do Stock Gaps Always Get Filled? The Data","post_url":"/blog/do-stock-gaps-get-filled#q-gap_fill_by_size","columns":["gap_bucket","gap_days","same_session_fill_pct"],"rows":[{"gap_bucket":"0.25 to 0.5%","gap_days":2381,"same_session_fill_pct":74.6},{"gap_bucket":"0.5 to 1%","gap_days":2340,"same_session_fill_pct":57.8},{"gap_bucket":"1 to 2%","gap_days":1530,"same_session_fill_pct":38.8},{"gap_bucket":"2 to 4%","gap_days":526,"same_session_fill_pct":25.1},{"gap_bucket":"4% or more","gap_days":135,"same_session_fill_pct":14.8}],"shape":"ranking","sql":"WITH sessions AS\n(\n    SELECT\n        ticker,\n        toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n        argMin(toFloat64(open), window_start)                AS session_open,\n        argMax(toFloat64(close), window_start)               AS session_close,\n        toFloat64(max(high))                                 AS session_high,\n        toFloat64(min(low))                                  AS session_low\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')\n      AND window_start >= '2021-01-01'\n      AND window_start <  '2026-07-01'\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960\n    GROUP BY ticker, d\n),\ngapped AS\n(\n    SELECT\n        d,\n        session_open,\n        session_high,\n        session_low,\n        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC\n            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close\n    FROM sessions\n),\nmeasured AS\n(\n    SELECT\n        abs(100 * (session_open / prior_close - 1)) AS gap_pct,\n        toUInt8(if(session_open > prior_close,\n                   session_low  <= prior_close,\n                   session_high >= prior_close))    AS filled_same_session\n    FROM gapped\n    WHERE prior_close > 0\n      AND d <= toDate('2026-02-28')\n      AND abs(100 * (session_open / prior_close - 1)) >= 0.25\n)\nSELECT\n    multiIf(gap_pct < 0.5, '0.25 to 0.5%',\n            gap_pct < 1,   '0.5 to 1%',\n            gap_pct < 2,   '1 to 2%',\n            gap_pct < 4,   '2 to 4%',\n                           '4% or more')         AS gap_bucket,\n    count()                                      AS gap_days,\n    round(100 * avg(filled_same_session), 1)     AS same_session_fill_pct\nFROM measured\nGROUP BY gap_bucket\nORDER BY min(gap_pct) ASC","computed_at":"2026-08-06T05:37:44.150808+00:00","elapsed":0.004921863}