{"slug":"when-do-ndx-options-expire","qid":"ndx_monthly_ladder","label":"ndx_monthly_ladder","post_title":"when-do-ndx-options-expire","post_url":"/blog/when-do-ndx-options-expire#q-ndx_monthly_ladder","columns":["expiration_date","expiry_label","last_trade_label","cycle","exchange_status","days_away"],"rows":[{"expiration_date":"2026-10-16","expiry_label":"Oct 16, 2026","last_trade_label":"Oct 15","cycle":"standard","exchange_status":"full session","days_away":14},{"expiration_date":"2026-11-20","expiry_label":"Nov 20, 2026","last_trade_label":"Nov 19","cycle":"standard","exchange_status":"full session","days_away":49},{"expiration_date":"2026-12-18","expiry_label":"Dec 18, 2026","last_trade_label":"Dec 17","cycle":"quarterly","exchange_status":"full session","days_away":77},{"expiration_date":"2027-01-15","expiry_label":"Jan 15, 2027","last_trade_label":"Jan 14","cycle":"standard","exchange_status":"full session","days_away":105},{"expiration_date":"2027-02-19","expiry_label":"Feb 19, 2027","last_trade_label":"Feb 18","cycle":"standard","exchange_status":"full session","days_away":140},{"expiration_date":"2027-03-19","expiry_label":"Mar 19, 2027","last_trade_label":"Mar 18","cycle":"quarterly","exchange_status":"full session","days_away":168},{"expiration_date":"2027-04-16","expiry_label":"Apr 16, 2027","last_trade_label":"Apr 15","cycle":"standard","exchange_status":"full session","days_away":196},{"expiration_date":"2027-05-21","expiry_label":"May 21, 2027","last_trade_label":"May 20","cycle":"standard","exchange_status":"full session","days_away":231},{"expiration_date":"2027-06-18","expiry_label":"Jun 18, 2027","last_trade_label":"Jun 17","cycle":"quarterly","exchange_status":"closed","days_away":259}],"shape":"series","sql":"WITH months AS\n(\n    SELECT addMonths(toDate('2026-01-01'), arrayJoin(range(18))) AS month_start\n)\nSELECT\n    toString(e.third_friday)                     AS expiration_date,\n    formatDateTime(e.third_friday, '%b %e, %Y')  AS expiry_label,\n    formatDateTime(e.third_friday - 1, '%b %e')  AS last_trade_label,\n    if(toMonth(e.third_friday) IN (3, 6, 9, 12), 'quarterly', 'standard') AS cycle,\n    if(h.status = '', 'full session', h.status)  AS exchange_status,\n    dateDiff('day', today(), e.third_friday)     AS days_away\nFROM\n(\n    SELECT month_start + ((12 - toDayOfWeek(month_start)) % 7) + 14 AS third_friday\n    FROM months\n) AS e\nLEFT JOIN\n(\n    SELECT\n        date,\n        any(status) AS status\n    FROM global_markets.stocks_market_holidays\n    GROUP BY date\n) AS h ON h.date = e.third_friday\nWHERE e.third_friday >= today()\nORDER BY e.third_friday","computed_at":"2026-10-02T14:54:58.763511+00:00","elapsed":0.05101741}