monthly_2026
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-24, from us-options-expiration-dates-beijing-time.
| expiration_date | expiry_label | weekday | rule | shifted_to_thursday | et_cutoff | us_clock | beijing_cutoff | utc8_clock |
|---|---|---|---|---|---|---|---|---|
| 2026-01-16 | 1 月 16 日 | 周五 | 第三个周五 | 0 | 16:00 | EST 冬令时 | 01-17 周六 05:00 | 5 |
| 2026-02-20 | 2 月 20 日 | 周五 | 第三个周五 | 0 | 16:00 | EST 冬令时 | 02-21 周六 05:00 | 5 |
| 2026-03-20 | 3 月 20 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 03-21 周六 04:00 | 4 |
| 2026-04-17 | 4 月 17 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 04-18 周六 04:00 | 4 |
| 2026-05-15 | 5 月 15 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 05-16 周六 04:00 | 4 |
| 2026-06-18 | 6 月 18 日 | 周四 | 周五休市,提前至周四 | 1 | 16:00 | EDT 夏令时 | 06-19 周五 04:00 | 4 |
| 2026-07-17 | 7 月 17 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 07-18 周六 04:00 | 4 |
| 2026-08-21 | 8 月 21 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 08-22 周六 04:00 | 4 |
| 2026-09-18 | 9 月 18 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 09-19 周六 04:00 | 4 |
| 2026-10-16 | 10 月 16 日 | 周五 | 第三个周五 | 0 | 16:00 | EDT 夏令时 | 10-17 周六 04:00 | 4 |
| 2026-11-20 | 11 月 20 日 | 周五 | 第三个周五 | 0 | 16:00 | EST 冬令时 | 11-21 周六 05:00 | 5 |
| 2026-12-18 | 12 月 18 日 | 周五 | 第三个周五 | 0 | 16:00 | EST 冬令时 | 12-19 周六 05:00 | 5 |
- Rows × columns
- 12 × 9
- 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-01-16 to 2026-12-18 | |
expiry_label |
text | 12 distinct values (1 月 16 日, 10 月 16 日, 11 月 20 日…) | |
weekday |
text | 2 distinct values (周五, 周四) | |
rule |
text | 2 distinct values (周五休市,提前至周四, 第三个周五) | |
shifted_to_thursday |
number | 0 to 1 | |
et_cutoff |
text | 1 distinct value (16:00) | |
us_clock |
text | 2 distinct values (EDT 夏令时, EST 冬令时) | |
beijing_cutoff |
text | 12 distinct values | |
utc8_clock |
number | 4 to 5 |
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.
SELECT
toString(expiry) AS expiration_date,
concat(toString(toMonth(expiry)), ' 月 ', toString(toDayOfMonth(expiry)), ' 日') AS expiry_label,
transform(toDayOfWeek(expiry), [4, 5], ['周四', '周五'], '其他') AS weekday,
if(expiry = third_friday, '第三个周五', '周五休市,提前至周四') AS rule,
if(expiry = third_friday, 0, 1) AS shifted_to_thursday,
formatDateTime(cutoff_et, '%H:%i', 'America/New_York') AS et_cutoff,
if(timeZoneOffset(cutoff_et) = -14400, 'EDT 夏令时', 'EST 冬令时') AS us_clock,
concat(formatDateTime(cutoff_et, '%m-%d', 'Asia/Shanghai'), ' ',
transform(toDayOfWeek(toTimeZone(cutoff_et, 'Asia/Shanghai')), [5, 6], ['周五', '周六'], '其他'), ' ',
formatDateTime(cutoff_et, '%H:%i', 'Asia/Shanghai')) AS beijing_cutoff,
toHour(toTimeZone(cutoff_et, 'Asia/Shanghai')) AS utc8_clock
FROM
(
SELECT
cal.third_friday AS third_friday,
if(cal.third_friday IN (SELECT date FROM global_markets.stocks_market_holidays WHERE status = 'closed')
OR (cal.third_friday < today() - 3 AND ifNull(t.bars, 0) = 0),
cal.third_friday - 1,
cal.third_friday) AS expiry,
toDateTime(concat(toString(expiry), ' 16:00:00'), 'America/New_York') AS cutoff_et
FROM
(
SELECT addDays(month_start, ((5 - toDayOfWeek(month_start) + 7) % 7) + 14) AS third_friday
FROM (SELECT addMonths(toDate('2026-01-01'), arrayJoin(range(12))) AS month_start)
) 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 >= toDate('2026-01-01')
AND window_start < toDate('2027-01-02')
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 t ON t.d = cal.third_friday
)
ORDER BY expiry
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.