{"slug":"options-expiration-calendar-2026","qid":"april_third_friday","label":"Was the April expiration Friday a trading day?","post_title":"Options Expiration Calendar 2026: All 12 Dates","post_url":"/blog/options-expiration-calendar-2026#q-april_third_friday","columns":["year","april_expiry_label","regular_session_bars","session_status"],"rows":[{"year":"2016","april_expiry_label":"Apr 15","regular_session_bars":390,"session_status":"full session"},{"year":"2017","april_expiry_label":"Apr 21","regular_session_bars":390,"session_status":"full session"},{"year":"2018","april_expiry_label":"Apr 20","regular_session_bars":390,"session_status":"full session"},{"year":"2019","april_expiry_label":"Apr 19","regular_session_bars":0,"session_status":"market closed"},{"year":"2020","april_expiry_label":"Apr 17","regular_session_bars":390,"session_status":"full session"},{"year":"2021","april_expiry_label":"Apr 16","regular_session_bars":390,"session_status":"full session"},{"year":"2022","april_expiry_label":"Apr 15","regular_session_bars":0,"session_status":"market closed"},{"year":"2023","april_expiry_label":"Apr 21","regular_session_bars":390,"session_status":"full session"},{"year":"2024","april_expiry_label":"Apr 19","regular_session_bars":390,"session_status":"full session"},{"year":"2025","april_expiry_label":"Apr 18","regular_session_bars":0,"session_status":"market closed"},{"year":"2026","april_expiry_label":"Apr 17","regular_session_bars":390,"session_status":"full session"}],"shape":"ranking","sql":"SELECT\n    toString(toYear(cal.exp_date))                                AS year,\n    concat(formatDateTime(cal.exp_date, '%b '), toString(toDayOfMonth(cal.exp_date))) AS april_expiry_label,\n    toUInt32(ifNull(tape.bars, 0))                                AS regular_session_bars,\n    if(ifNull(tape.bars, 0) = 0, 'market closed', 'full session') AS session_status\nFROM\n(\n    SELECT\n        toDate(concat(toString(2016 + arrayJoin(range(11))), '-04-01')) AS april_first,\n        april_first + ((12 - toDayOfWeek(april_first)) % 7) + 14        AS exp_date\n) AS cal\nLEFT JOIN\n(\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n        count()                                              AS bars\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= toDateTime('2016-01-01 00:00:00')\n      AND toMonth(window_start) = 4\n      AND toDayOfMonth(window_start) BETWEEN 14 AND 22\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960\n    GROUP BY d\n) AS tape ON tape.d = cal.exp_date\nORDER BY cal.exp_date","computed_at":"2026-08-22T04:17:53.170669+00:00","elapsed":0.186672285}