ndx_monthly_ladder
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-02, from when-do-ndx-options-expire.
| expiration_date | expiry_label | last_trade_label | cycle | exchange_status | days_away |
|---|---|---|---|---|---|
| 2026-10-16 | Oct 16, 2026 | Oct 15 | standard | full session | 14 |
| 2026-11-20 | Nov 20, 2026 | Nov 19 | standard | full session | 49 |
| 2026-12-18 | Dec 18, 2026 | Dec 17 | quarterly | full session | 77 |
| 2027-01-15 | Jan 15, 2027 | Jan 14 | standard | full session | 105 |
| 2027-02-19 | Feb 19, 2027 | Feb 18 | standard | full session | 140 |
| 2027-03-19 | Mar 19, 2027 | Mar 18 | quarterly | full session | 168 |
| 2027-04-16 | Apr 16, 2027 | Apr 15 | standard | full session | 196 |
| 2027-05-21 | May 21, 2027 | May 20 | standard | full session | 231 |
| 2027-06-18 | Jun 18, 2027 | Jun 17 | quarterly | closed | 259 |
- Rows × columns
- 9 × 6
- Period covered
- to
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
expiration_date |
date | 2026-10-16 to 2027-06-18 | |
expiry_label |
text | 9 distinct values (Apr 16, 2027, Dec 18, 2026, Feb 19, 2027…) | |
last_trade_label |
text | 9 distinct values (Apr 15, Dec 17, Feb 18…) | |
cycle |
text | 2 distinct values (quarterly, standard) | |
exchange_status |
text | 2 distinct values (closed, full session) | |
days_away |
number | 14 to 259 |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH months AS
(
SELECT addMonths(toDate('2026-01-01'), arrayJoin(range(18))) AS month_start
)
SELECT
toString(e.third_friday) AS expiration_date,
formatDateTime(e.third_friday, '%b %e, %Y') AS expiry_label,
formatDateTime(e.third_friday - 1, '%b %e') AS last_trade_label,
if(toMonth(e.third_friday) IN (3, 6, 9, 12), 'quarterly', 'standard') AS cycle,
if(h.status = '', 'full session', h.status) AS exchange_status,
dateDiff('day', today(), e.third_friday) AS days_away
FROM
(
SELECT month_start + ((12 - toDayOfWeek(month_start)) % 7) + 14 AS third_friday
FROM months
) AS e
LEFT JOIN
(
SELECT
date,
any(status) AS status
FROM global_markets.stocks_market_holidays
GROUP BY date
) AS h ON h.date = e.third_friday
WHERE e.third_friday >= today()
ORDER BY e.third_friday
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.