Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-09-20 · data as of September 20, 2026 · refreshed weekly

Options Expiration Calendar 2026: All 12 Dates

The full 2026 options expiration calendar: twelve monthly third Fridays, the four quarterly dates, and the holiday rule that can shift one to a Thursday.

The 2026 options expiration calendar runs on one rule: standard monthly options on US stocks and ETFs stop trading on the third Friday of the month. That gives twelve monthly expiration dates in 2026, running from Jan 16 through Dec 18, and four of them double as quarterly expirations. Every date on this page is computed from the calendar rather than copied off a list, and the second section shows you how to regenerate all twelve yourself in a single command.

The 2026 options expiration calendar, month by month

A standard monthly contract is the default listing on any optionable US stock or ETF. One expiration per month, on the third Friday, at the close. The panel below derives all twelve 2026 dates from plain date arithmetic, then checks each one against the live exchange holiday calendar.

QueryEvery 2026 monthly options expiration date
expiration_dateexpiry_labelweekdayday_of_monthexpiry_classcalendar_check
2026-01-16Jan 16Fri16monthlyalready traded
2026-02-20Feb 20Fri20monthlyalready traded
2026-03-20Mar 20Fri20quarterlyalready traded
2026-04-17Apr 17Fri17monthlyalready traded
2026-05-15May 15Fri15monthlyalready traded
2026-06-19Jun 19Fri19quarterlyalready traded
2026-07-17Jul 17Fri17monthlyalready traded
2026-08-21Aug 21Fri21monthlyalready traded
2026-09-18Sep 18Fri18quarterlyalready traded
2026-10-16Oct 16Fri16monthlyno closure scheduled
2026-11-20Nov 20Fri20monthlyno closure scheduled
2026-12-18Dec 18Fri18quarterlyno closure scheduled
The exact SQL behind every number
SELECT
    toString(cal.exp_date)                                                            AS expiration_date,
    concat(formatDateTime(cal.exp_date, '%b '), toString(toDayOfMonth(cal.exp_date))) AS expiry_label,
    formatDateTime(cal.exp_date, '%a')                                                AS weekday,
    toDayOfMonth(cal.exp_date)                                                        AS day_of_month,
    if(toMonth(cal.exp_date) IN (3, 6, 9, 12), 'quarterly', 'monthly')                AS expiry_class,
    multiIf(cal.exp_date < today(),   'already traded',
            hol.holiday != '',        concat('scheduled closure: ', hol.holiday),
                                      'no closure scheduled')                         AS calendar_check
FROM
(
    SELECT
        toDate('2026-01-01') + toIntervalMonth(arrayJoin(range(12)))  AS month_start,
        month_start + ((12 - toDayOfWeek(month_start)) % 7) + 14      AS exp_date
) AS cal
LEFT JOIN
(
    SELECT
        date         AS d,
        any(name)    AS holiday
    FROM global_markets.stocks_market_holidays
    GROUP BY date
) AS hol ON hol.d = cal.exp_date
ORDER BY cal.exp_date
Run this yourself

The day_of_month column is the part worth studying. A third Friday cannot land before the 15th and cannot land after the 21st: the first Friday of any month sits somewhere in the first seven days, and the third is fourteen days after it. In 2026 the earliest is May, on the 15th, and the latest is August, on the 21th. The other ten fall between those two.

Expiration is also the last day these contracts trade, and for ordinary stock and ETF options those are the same day. Index options are the exception worth knowing: several of them settle Friday morning off the opening prints, which puts their final trading session on Thursday. Our guide to AM and PM settled options sorts out which is which, and when do options expire covers what happens to a position on the day itself.

How to generate every 2026 expiration date yourself

Nothing in this calendar needs a data feed. Python ships a calendar module inside its standard library, so the whole list comes out of one command with nothing to install and no network access:

python3 -c "import calendar; print(*[[d for w in calendar.Calendar().monthdatescalendar(2026, m) for d in w if d.month == m and d.weekday() == 4][2] for m in range(1, 13)], sep='\\n')"

Run that on any machine with Python 3 and it prints twelve ISO dates, one per line. monthdatescalendar hands back a month as a list of whole weeks, padded at both ends with days borrowed from the neighbouring months. The d.month == m test throws the borrowed days away, d.weekday() == 4 keeps the Fridays (Monday is 0), and [2] takes the third one. Change the year and the list regenerates. That is the entire calculation, and it is why an expiration calendar is something you derive rather than look up.

Which 2026 expirations are quarterly

Four of the twelve fall in March, June, September, and December: Mar 20, Jun 19, Sep 18, and Dec 18. On those dates, stock options, stock index options, and stock index futures all reach expiration together, which is where the nickname triple witching comes from. The mechanics are in what is triple witching, and the quarter-by-quarter detail lives in 2026 triple witching dates. One of the four carries an asterisk in 2026, and the next section works out which one off the tape.

What happens when a market holiday lands on expiration Friday

The third-Friday rule has one exception, and it is a real one. When the third Friday is an exchange holiday, the market never opens that day, and the last trading day for the monthly contracts moves back to the Thursday before. Whether that happens in a given year is a question you can settle off the tape instead of trusting a list. A full US session is 390 one-minute bars, six and a half hours from the 9:30 a.m. open to the 4:00 p.m. close. A day the market sits closed prints none at all.

QueryEvery Friday of 2026 through July, shortest session first
31 rows (showing 20)
session_datesession_labelfriday_typeregular_session_bars
2026-04-03Apr 3other Friday0
2026-06-19Jun 19third Friday0
2026-07-03Jul 3other Friday0
2026-01-02Jan 2other Friday390
2026-01-09Jan 9other Friday390
2026-01-16Jan 16third Friday390
2026-01-23Jan 23other Friday390
2026-01-30Jan 30other Friday390
2026-02-06Feb 6other Friday390
2026-02-13Feb 13other Friday390
2026-02-20Feb 20third Friday390
2026-02-27Feb 27other Friday390
2026-03-06Mar 6other Friday390
2026-03-13Mar 13other Friday390
2026-03-20Mar 20third Friday390
2026-03-27Mar 27other Friday390
2026-04-10Apr 10other Friday390
2026-04-17Apr 17third Friday390
2026-04-24Apr 24other Friday390
2026-05-01May 1other Friday390
The exact SQL behind every number
SELECT
    toString(cal.day)                                                         AS session_date,
    concat(formatDateTime(cal.day, '%b '), toString(toDayOfMonth(cal.day)))   AS session_label,
    if(toDayOfMonth(cal.day) BETWEEN 15 AND 21, 'third Friday', 'other Friday') AS friday_type,
    toUInt32(ifNull(tape.bars, 0))                                            AS regular_session_bars
FROM
(
    SELECT toDate('2026-01-01') + arrayJoin(range(212)) AS day
) AS cal
LEFT JOIN
(
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        count()                                              AS bars
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-01-01 00:00:00')
      AND window_start <  toDateTime('2026-08-02 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY d
) AS tape ON tape.d = cal.day
WHERE toDayOfWeek(cal.day) = 5
ORDER BY regular_session_bars ASC, cal.day ASC
Run this yourself

Between January and the end of July 2026, 31 Fridays came and went. Three of them printed 0 regular-session minute bars, which is what a closed market looks like on the tape: Apr 3, Jun 19, and Jul 3. The first is Good Friday. The third is Independence Day observed, since July 4 lands on a Saturday in 2026 and the exchanges take the Friday before. Every other Friday in the window printed 390 bars, a full session.

The middle one is the exception this page owes you. Jun 19 is Juneteenth National Independence Day, which the US equity exchanges have observed since 2022, and in 2026 it falls on the 19th of June: the third Friday, the June monthly expiration, and one of the four quarterly dates. The market never opens that day, and the June monthly contracts have their last trading day on the Thursday before it. It is the only third Friday of 2026 that lands on a scheduled market closure, and the 2026 triple witching dates page carries the quarterly detail.

Good Friday is the other holiday that can reach a third Friday, and unlike Juneteenth it has no fixed date: it tracks Easter, which moves between late March and late April. The panel below derives the April third Friday for each of the last eleven years and counts what the SPY tape recorded on it.

QueryWas the April expiration Friday a trading day?
yearapril_expiry_labelregular_session_barssession_status
2016Apr 15390full session
2017Apr 21390full session
2018Apr 20390full session
2019Apr 190market closed
2020Apr 17390full session
2021Apr 16390full session
2022Apr 150market closed
2023Apr 21390full session
2024Apr 19390full session
2025Apr 180market closed
2026Apr 17390full session
The exact SQL behind every number
SELECT
    toString(toYear(cal.exp_date))                                AS year,
    concat(formatDateTime(cal.exp_date, '%b '), toString(toDayOfMonth(cal.exp_date))) AS april_expiry_label,
    toUInt32(ifNull(tape.bars, 0))                                AS regular_session_bars,
    if(ifNull(tape.bars, 0) = 0, 'market closed', 'full session') AS session_status
FROM
(
    SELECT
        toDate(concat(toString(2016 + arrayJoin(range(11))), '-04-01')) AS april_first,
        april_first + ((12 - toDayOfWeek(april_first)) % 7) + 14        AS exp_date
) AS cal
LEFT JOIN
(
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        count()                                              AS bars
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2016-01-01 00:00:00')
      AND toMonth(window_start) = 4
      AND toDayOfMonth(window_start) BETWEEN 14 AND 22
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY d
) AS tape ON tape.d = cal.exp_date
ORDER BY cal.exp_date
Run this yourself

Across the 11 Aprils from 2016 through 2026, the April expiration Friday met a closed market in 2019, in 2022, and again in 2025. In each of those years the monthly contracts stopped trading on the Thursday instead. In 2026 the April date printed a full 390 bars, which puts the 2026 Thursday shift in June rather than April.

Where weeklys, end of month, and Monday expirations fit

The third Friday is the one date every optionable name shares. Around it sit several other series that ignore the third-Friday rule entirely. Weeklys list on most other Fridays, usually a few weeks out at a time. End-of-month options expire on the last business day of the month rather than on a Friday. On heavily traded names there are Monday and Wednesday expirations as well, and on a short roster of index products and single stocks, an expiration every trading day. The current roster is in stocks with daily options.

The size gap between a monthly and everything around it shows up straight away in contract counts. This panel takes every 2026 expiration date that AAPL options traded into during the first half of the year and counts the distinct contracts on each.

QueryAAPL contracts traded into each 2026 expiration date, H1
68 rows (showing 20)
expiration_dateexpiry_labelexpiry_classcontracts_traded
2026-06-18Jun 18Thursday before a third Friday200
2026-01-16Jan 16monthly third Friday184
2026-05-15May 15monthly third Friday177
2026-03-20Mar 20monthly third Friday147
2026-02-20Feb 20monthly third Friday143
2026-05-22May 22weekly Friday137
2026-04-17Apr 17monthly third Friday136
2026-06-26Jun 26weekly Friday133
2026-06-05Jun 5weekly Friday127
2026-06-12Jun 12weekly Friday127
2026-01-09Jan 9weekly Friday123
2026-05-29May 29weekly Friday123
2026-05-01May 1weekly Friday122
2026-01-02Jan 2weekly Friday119
2026-05-08May 8weekly Friday119
2026-01-30Jan 30weekly Friday117
2026-01-23Jan 23weekly Friday116
2026-02-06Feb 6weekly Friday116
2026-02-27Feb 27weekly Friday116
2026-02-13Feb 13weekly Friday111
The exact SQL behind every number
SELECT
    toString(agg.exp_date)                                                            AS expiration_date,
    concat(formatDateTime(agg.exp_date, '%b '), toString(toDayOfMonth(agg.exp_date))) AS expiry_label,
    multiIf(toDayOfWeek(agg.exp_date) = 5 AND toDayOfMonth(agg.exp_date) BETWEEN 15 AND 21, 'monthly third Friday',
            toDayOfWeek(agg.exp_date) = 5,                                                 'weekly Friday',
            toDayOfWeek(agg.exp_date) = 4 AND toDayOfMonth(agg.exp_date) BETWEEN 14 AND 20, 'Thursday before a third Friday',
                                                                                           'other weekday') AS expiry_class,
    agg.n_contracts                                                                   AS contracts_traded
FROM
(
    SELECT
        toDate(expiration_date) AS exp_date,
        countDistinct(ticker)   AS n_contracts
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'AAPL'
      AND toDate(expiration_date) >= toDate('2026-01-01')
      AND toDate(expiration_date) <  toDate('2026-07-01')
      AND volume > 0
      AND iv_converged = 1
    GROUP BY exp_date
) AS agg
ORDER BY contracts_traded DESC, agg.exp_date ASC
Run this yourself

The heaviest 2026 expiration date for AAPL in that window, Jun 18, carried 200 distinct contracts, and the panel classes it as Thursday before a third Friday. The thinnest date over the same six months carried 50. Monthly expirations list strikes further above and below the money and further into the future, and long-dated positions accumulate on them for years ahead of the date. That pile-up of open interest on a single date is what gives the max pain strike whatever meaning it has, since the calculation is only as sturdy as the open interest sitting behind it. Trading in nearly all of these contracts runs to the 4:00 p.m. close; what time options stop trading has the cutoffs that differ.

How these panels were built

The session-length panels count one-minute bars on the SPY tape between the 9:30 a.m. and 4:00 p.m. ET clock times, converted from stored UTC timestamps. No holiday date is hardcoded in either query: a closed day is simply a weekday that printed zero regular-session bars, recovered from what did and did not trade. The AAPL panel counts only contracts that traded at least once and carried a converged implied-volatility mark, which keeps unpriced listings out of the count, and it covers January through June 2026. The twelve expiration dates come from date arithmetic on the first of each month, the same calculation as the Python command above.

FAQ

When do options expire in 2026?

Standard monthly options on US stocks and ETFs expire on the third Friday of each month, twelve dates running from Jan 16 through Dec 18. The June date is a scheduled market closure, which pulls those contracts back to the Thursday before it. Weekly, end-of-month, and daily series expire on their own schedules around those twelve dates.

What are the 2026 triple witching dates?

The four quarterly expirations fall on Mar 20, Jun 19, Sep 18, and Dec 18. Stock options, index options, and index futures all reach expiration together on those dates. The June one lands on an exchange holiday in 2026, which moves the last trading day back to the Thursday.

Can an options expiration date move off Friday?

Yes. When the third Friday is an exchange holiday, the market is shut and the monthly contracts stop trading on the Thursday before. Over the last eleven Aprils that happened in 2019, 2022, and 2025, always on Good Friday. It happens once in 2026 as well, in June, where the third Friday is Juneteenth.

Do weekly options expire on the third Friday too?

The third Friday of a month is served by the standard monthly contract, so the weekly series simply skips it. Weeklys cover the other Fridays, and on the largest names there are also Monday and Wednesday expirations.

Is the US expiration date the same as Japan's SQ date?

No. Japanese index futures and options settle on a special quotation, written SQ, calculated from the second Friday's opening prices, and the quarterly one in March, June, September, and December is called the mega SQ. US monthly options expire on the third Friday. Anyone following both calendars is working with two different dates each month.


Every panel on this page ships with the exact SQL underneath it. To rebuild the same calendar for another year, or to count contracts on a different ticker, ask the question in plain English on the Strasmore terminal.