{"slug":"the-rule-of-16-in-options","qid":"horizon_scaling","label":"How far SPY travels over one session, and over sixty three","post_title":"The Rule of 16 in Options, and When It Breaks","post_url":"/blog/the-rule-of-16-in-options#q-horizon_scaling","columns":["horizon","move_pct","daily_equivalent_pct","sample_count"],"rows":[{"horizon":"1 session","move_pct":0.97,"daily_equivalent_pct":0.97,"sample_count":753},{"horizon":"2 sessions","move_pct":1.31,"daily_equivalent_pct":0.93,"sample_count":752},{"horizon":"5 sessions","move_pct":2.01,"daily_equivalent_pct":0.9,"sample_count":749},{"horizon":"10 sessions","move_pct":2.72,"daily_equivalent_pct":0.86,"sample_count":744},{"horizon":"21 sessions","move_pct":3.8,"daily_equivalent_pct":0.83,"sample_count":733},{"horizon":"42 sessions","move_pct":5.28,"daily_equivalent_pct":0.81,"sample_count":712},{"horizon":"63 sessions","move_pct":5.89,"daily_equivalent_pct":0.74,"sample_count":691}],"shape":"ranking","sql":"SELECT\n    horizon,\n    round(sqrt(arrayReduce('varPop', returns)) * 100, 2)           AS move_pct,\n    round(sqrt(arrayReduce('varPop', returns)) * 100 / sqrt(h), 2) AS daily_equivalent_pct,\n    length(returns)                                                AS sample_count\nFROM\n(\n    SELECT\n        hz.h                                                          AS h,\n        concat(toString(hz.h), if(hz.h = 1, ' session', ' sessions')) AS horizon,\n        arrayMap((later, earlier) -> (later / earlier) - 1,\n                 arraySlice(spy.closes, hz.h + 1),\n                 arraySlice(spy.closes, 1, length(spy.closes) - hz.h)) AS returns\n    FROM\n    (\n        SELECT arrayJoin([1, 2, 5, 10, 21, 42, 63]) AS h\n    ) AS hz\n    CROSS JOIN\n    (\n        SELECT arrayMap(t -> t.2, arraySort(t -> t.1, groupArray((session_date, close_px)))) AS closes\n        FROM\n        (\n            SELECT\n                date                   AS session_date,\n                toFloat64(max(close))  AS close_px\n            FROM global_markets.stocks_daily_aggs\n            WHERE ticker = 'SPY'\n              AND date >= today() - 1100\n              AND date <  today() - 1\n            GROUP BY session_date\n        )\n    ) AS spy\n)\nWHERE length(returns) > 100\nORDER BY h","computed_at":"2026-08-22T04:23:06.499884+00:00","elapsed":0.029879779}