{"slug":"the-3-5-7-rule-in-options","qid":"index_down_days","label":"S&P 500 tracker (SPY): down sessions by calendar year, 2016 to mid-2026","post_title":"The 3-5-7 Rule in Options, Examined","post_url":"/blog/the-3-5-7-rule-in-options#q-index_down_days","columns":["year","sessions","days_down_1pct","days_down_3pct","worst_day_pct"],"rows":[{"year":2016,"sessions":252,"days_down_1pct":22,"days_down_3pct":1,"worst_day_pct":-3.61},{"year":2017,"sessions":251,"days_down_1pct":4,"days_down_3pct":0,"worst_day_pct":-1.77},{"year":2018,"sessions":251,"days_down_1pct":32,"days_down_3pct":5,"worst_day_pct":-4.12},{"year":2019,"sessions":252,"days_down_1pct":15,"days_down_3pct":0,"worst_day_pct":-2.98},{"year":2020,"sessions":253,"days_down_1pct":45,"days_down_3pct":16,"worst_day_pct":-11.63},{"year":2021,"sessions":252,"days_down_1pct":21,"days_down_3pct":0,"worst_day_pct":-2.45},{"year":2022,"sessions":251,"days_down_1pct":65,"days_down_3pct":8,"worst_day_pct":-4.34},{"year":2023,"sessions":250,"days_down_1pct":28,"days_down_3pct":0,"worst_day_pct":-1.99},{"year":2024,"sessions":252,"days_down_1pct":19,"days_down_3pct":0,"worst_day_pct":-2.97},{"year":2025,"sessions":250,"days_down_1pct":30,"days_down_3pct":3,"worst_day_pct":-5.98},{"year":2026,"sessions":123,"days_down_1pct":15,"days_down_3pct":0,"worst_day_pct":-2.59}],"shape":"table","sql":"WITH daily AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n           toFloat64(argMax(close, window_start)) AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY d\n),\nmoves AS (\n    SELECT d,\n           100 * (px / any(px) OVER (ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - 1) AS move_pct\n    FROM daily\n)\nSELECT toYear(d) AS year,\n       count() AS sessions,\n       countIf(move_pct <= -1) AS days_down_1pct,\n       countIf(move_pct <= -3) AS days_down_3pct,\n       round(min(move_pct), 2) AS worst_day_pct\nFROM moves\nWHERE isFinite(move_pct) AND toYear(d) >= 2016\nGROUP BY year\nORDER BY year","computed_at":"2026-08-15T14:55:33.738252+00:00","elapsed":0.003082971}