{"slug":"how-futures-margin-works","qid":"move_buckets","label":"A decade of SPY daily closing moves, sorted into size buckets","post_title":"How Futures Margin Works: SPAN and Calls","post_url":"/blog/how-futures-margin-works#q-move_buckets","columns":["move_bucket","sessions","share_pct"],"rows":[{"move_bucket":"under 0.5%","sessions":1256,"share_pct":50},{"move_bucket":"0.5 to 1%","sessions":656,"share_pct":26.1},{"move_bucket":"1 to 1.5%","sessions":299,"share_pct":11.9},{"move_bucket":"1.5 to 2%","sessions":151,"share_pct":6},{"move_bucket":"2 to 3%","sessions":99,"share_pct":3.9},{"move_bucket":"3% or more","sessions":52,"share_pct":2.1}],"shape":"ranking","sql":"WITH spy AS\n(\n    SELECT\n        date,\n        toFloat64(close) AS close_px,\n        lagInFrame(toFloat64(close)) OVER\n            (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= '2016-08-01'\n      AND date <  '2026-08-01'\n)\nSELECT\n    multiIf(move_pct < 0.5, 'under 0.5%',\n            move_pct < 1.0, '0.5 to 1%',\n            move_pct < 1.5, '1 to 1.5%',\n            move_pct < 2.0, '1.5 to 2%',\n            move_pct < 3.0, '2 to 3%',\n                            '3% or more')                 AS move_bucket,\n    count()                                               AS sessions,\n    round(100 * count() / (SELECT count() FROM spy WHERE prev_close > 0), 1) AS share_pct\nFROM\n(\n    SELECT abs(close_px / prev_close - 1) * 100 AS move_pct\n    FROM spy\n    WHERE prev_close > 0\n)\nGROUP BY move_bucket\nORDER BY min(move_pct)","computed_at":"2026-08-10T15:25:14.209166+00:00","elapsed":0.003116314}