{"slug":"the-3-5-7-rule-in-options","qid":"single_name_moves","label":"One-day move profile, seven household names, July 2025 to June 2026","post_title":"The 3-5-7 Rule in Options, Examined","post_url":"/blog/the-3-5-7-rule-in-options#q-single_name_moves","columns":["ticker","sessions","median_abs_move_pct","p95_abs_move_pct","pct_days_beyond_3","worst_day_pct"],"rows":[{"ticker":"SPY","sessions":250,"median_abs_move_pct":0.46,"p95_abs_move_pct":1.62,"pct_days_beyond_3":0,"worst_day_pct":-2.69},{"ticker":"KO","sessions":250,"median_abs_move_pct":0.65,"p95_abs_move_pct":2.11,"pct_days_beyond_3":1.2,"worst_day_pct":-2.56},{"ticker":"JNJ","sessions":250,"median_abs_move_pct":0.63,"p95_abs_move_pct":2.21,"pct_days_beyond_3":1.6,"worst_day_pct":-2.42},{"ticker":"AAPL","sessions":250,"median_abs_move_pct":0.68,"p95_abs_move_pct":3.23,"pct_days_beyond_3":7.2,"worst_day_pct":-6.15},{"ticker":"MSFT","sessions":250,"median_abs_move_pct":0.76,"p95_abs_move_pct":3.37,"pct_days_beyond_3":8.4,"worst_day_pct":-10.02},{"ticker":"NVDA","sessions":250,"median_abs_move_pct":1.37,"p95_abs_move_pct":4.35,"pct_days_beyond_3":16.4,"worst_day_pct":-6.22},{"ticker":"TSLA","sessions":250,"median_abs_move_pct":1.83,"p95_abs_move_pct":5.45,"pct_days_beyond_3":30.4,"worst_day_pct":-8.39}],"shape":"table","sql":"WITH daily AS (\n    SELECT ticker,\n           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 IN ('SPY', 'KO', 'JNJ', 'AAPL', 'MSFT', 'NVDA', 'TSLA')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-07-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 ticker, d\n),\nmoves AS (\n    SELECT ticker, d,\n           100 * (px / any(px) OVER (PARTITION BY ticker ORDER BY d\n                                     ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) - 1) AS move_pct\n    FROM daily\n)\nSELECT ticker,\n       count() AS sessions,\n       round(quantileDeterministic(0.5)(abs(move_pct), cityHash64(ticker, d)), 2) AS median_abs_move_pct,\n       round(quantileDeterministic(0.95)(abs(move_pct), cityHash64(ticker, d)), 2) AS p95_abs_move_pct,\n       round(100 * countIf(abs(move_pct) >= 3) / count(), 1) AS pct_days_beyond_3,\n       round(min(move_pct), 2) AS worst_day_pct\nFROM moves\nWHERE isFinite(move_pct)\nGROUP BY ticker\nORDER BY p95_abs_move_pct","computed_at":"2026-08-15T14:55:33.552159+00:00","elapsed":0.004376875}