{"slug":"futures-price-limits-and-price-banding","qid":"gap_frequency","label":"Share of S&P 500 ETF sessions opening 1% or 2% from the prior close, by year","post_title":"Futures Price Limits and Price Banding","post_url":"/blog/futures-price-limits-and-price-banding#q-gap_frequency","columns":["year","sample_size","pct_sessions_over_1pct","pct_sessions_over_2pct","largest_gap_pct"],"rows":[{"year":2015,"sample_size":251,"pct_sessions_over_1pct":7.6,"pct_sessions_over_2pct":2,"largest_gap_pct":5.23},{"year":2016,"sample_size":252,"pct_sessions_over_1pct":6,"pct_sessions_over_2pct":0.8,"largest_gap_pct":3.41},{"year":2017,"sample_size":251,"pct_sessions_over_1pct":0.4,"pct_sessions_over_2pct":0,"largest_gap_pct":1.1},{"year":2018,"sample_size":251,"pct_sessions_over_1pct":6.4,"pct_sessions_over_2pct":0,"largest_gap_pct":1.69},{"year":2019,"sample_size":252,"pct_sessions_over_1pct":4.8,"pct_sessions_over_2pct":0,"largest_gap_pct":1.97},{"year":2020,"sample_size":253,"pct_sessions_over_1pct":25.7,"pct_sessions_over_2pct":10.7,"largest_gap_pct":10.45},{"year":2021,"sample_size":252,"pct_sessions_over_1pct":5.6,"pct_sessions_over_2pct":0,"largest_gap_pct":1.51},{"year":2022,"sample_size":251,"pct_sessions_over_1pct":22.3,"pct_sessions_over_2pct":3.6,"largest_gap_pct":3.72},{"year":2023,"sample_size":250,"pct_sessions_over_1pct":4,"pct_sessions_over_2pct":0,"largest_gap_pct":1.49},{"year":2024,"sample_size":252,"pct_sessions_over_1pct":6,"pct_sessions_over_2pct":0.8,"largest_gap_pct":3.99},{"year":2025,"sample_size":250,"pct_sessions_over_1pct":12.4,"pct_sessions_over_2pct":3.2,"largest_gap_pct":3.47},{"year":2026,"sample_size":187,"pct_sessions_over_1pct":7.5,"pct_sessions_over_2pct":0.5,"largest_gap_pct":2.6}],"shape":"table","sql":"WITH\n    daily AS\n    (\n        SELECT\n            date,\n            any(open)  AS session_open,\n            any(close) AS session_close\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n          AND date >= '2015-01-01'\n          AND date <  '2026-10-01'\n        GROUP BY date\n    ),\n    gaps AS\n    (\n        SELECT\n            date,\n            abs(toFloat64(session_open)\n                / any(toFloat64(session_close)) OVER (ORDER BY date ASC\n                                                      ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)\n                - 1) AS gap\n        FROM daily\n    )\nSELECT\n    toYear(date)                                   AS year,\n    count()                                        AS sample_size,\n    round(100 * countIf(gap >= 0.01) / count(), 1) AS pct_sessions_over_1pct,\n    round(100 * countIf(gap >= 0.02) / count(), 1) AS pct_sessions_over_2pct,\n    round(100 * max(gap), 2)                       AS largest_gap_pct\nFROM gaps\nWHERE isFinite(gap)\nGROUP BY year\nORDER BY year ASC","computed_at":"2026-10-09T16:48:18.381754+00:00","elapsed":0.003710939}