{"slug":"when-a-spread-expires-between-the-strikes","qid":"strike_zone_spy","label":"SPY Friday closes against the whole dollar strike grid, by year","post_title":"When a Spread Expires Between the Strikes","post_url":"/blog/when-a-spread-expires-between-the-strikes#q-strike_zone_spy","columns":["year","expiration_count","between_strikes_pct","crossed_strike_pct","within_10_cents_pct"],"rows":[{"year":"2022","expiration_count":50,"between_strikes_pct":100,"crossed_strike_pct":86,"within_10_cents_pct":20},{"year":"2023","expiration_count":50,"between_strikes_pct":100,"crossed_strike_pct":66,"within_10_cents_pct":18},{"year":"2024","expiration_count":50,"between_strikes_pct":100,"crossed_strike_pct":52,"within_10_cents_pct":24},{"year":"2025","expiration_count":49,"between_strikes_pct":98,"crossed_strike_pct":57.1,"within_10_cents_pct":24.5},{"year":"2026","expiration_count":32,"between_strikes_pct":100,"crossed_strike_pct":68.8,"within_10_cents_pct":18.8}],"shape":"table","sql":"WITH bars AS (\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York'))        AS session_date,\n        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n          + toMinute(toTimeZone(window_start, 'America/New_York'))  AS et_minute,\n        toFloat64(close)                                            AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= '2022-01-01 00:00:00'\n      AND window_start <  '2026-09-01 00:00:00'\n),\nday_marks AS (\n    SELECT\n        session_date,\n        anyIf(px, et_minute = 900) AS px_3pm,\n        argMax(px, et_minute)      AS px_close\n    FROM bars\n    WHERE et_minute >= 570\n      AND et_minute <= 959\n    GROUP BY session_date\n    HAVING px_3pm > 0\n       AND px_close > 0\n       AND max(et_minute) >= 955\n)\nSELECT\n    toString(toYear(session_date)) AS year,\n    count()                        AS expiration_count,\n    round(100 * countIf(px_close != floor(px_close)) / count(), 1)      AS between_strikes_pct,\n    round(100 * countIf(floor(px_close) != floor(px_3pm)) / count(), 1) AS crossed_strike_pct,\n    round(100 * countIf(least(px_close - floor(px_close), floor(px_close) + 1 - px_close) <= 0.10) / count(), 1) AS within_10_cents_pct\nFROM day_marks\nWHERE toDayOfWeek(session_date) = 5\nGROUP BY year\nORDER BY year","computed_at":"2026-09-27T15:36:10.669458+00:00","elapsed":0.002199333}