When Do SPX Options Stop Trading?
SPX options stop trading on two clocks: the AM settled monthly ends its session on Thursday, while SPXW weeklies run into Friday. Both cutoffs, with data.
SPX options stop trading on two different clocks, and the one that applies to a position depends on the root symbol on the contract rather than on the expiration date printed next to it. The monthly AM-settled contract, root SPX, holds its last regular session on the business day before the third Friday, normally the Thursday. An SPXW weekly carrying that same third-Friday date trades into Friday afternoon and settles against the 4:00 p.m. ET close. Ordinary single-stock timing is covered in when do options expire and what time options stop trading. This page stays on the index contract.
SPX and SPXW: one expiration date, two last trading days
Every third Friday carries both roots at once. SPX is the AM-settled monthly: its payoff comes from SET, the Special Opening Quotation built from the Friday opening prints of the S&P 500 members. SPXW is the weekly root, PM-settled, with a payoff taken from the index level at Friday's 4:00 p.m. ET close. Same underlying index, same strike ladder, same expiration date on the screen, same cash settlement into the account. The last trading day is where the two part.
The tape shows it plainly. The panel below takes the May 15, 2026 expiration, a third Friday, and counts contracts traded in each session of its final week, split by root.
| session_date | day_label | am_settled_spx_contracts | weekly_spxw_contracts |
|---|---|---|---|
| 2026-05-11 | Mon May 11 | 65766 | 98800 |
| 2026-05-12 | Tue May 12 | 77897 | 121974 |
| 2026-05-13 | Wed May 13 | 104268 | 180476 |
| 2026-05-14 | Thu May 14 | 238633 | 547265 |
| 2026-05-15 | Fri May 15 | 0 | 3003170 |
The exact SQL behind every number
SELECT
toString(toDate(toTimeZone(window_start, 'America/New_York'))) AS session_date,
formatDateTime(toDate(toTimeZone(window_start, 'America/New_York')), '%a %b %e') AS day_label,
sum(if(startsWith(ticker, 'O:SPXW'), 0, volume)) AS am_settled_spx_contracts,
sum(if(startsWith(ticker, 'O:SPXW'), volume, 0)) AS weekly_spxw_contracts
FROM global_markets.options_minute_aggs
WHERE (startsWith(ticker, 'O:SPX260515') OR startsWith(ticker, 'O:SPXW260515'))
AND window_start >= toDateTime('2026-05-11 08:00:00', 'UTC')
AND window_start < toDateTime('2026-05-16 04:00:00', 'UTC')
GROUP BY session_date, day_label
ORDER BY session_dateThe AM-settled root's last full session is Thu May 14, with 238633 contracts changing hands. On the expiration date itself, Fri May 15, that root records 0 contracts, while the weekly carrying the identical date trades 3003170. Expiration-day activity in the index lives in the weekly.
When does the AM-settled SPX contract stop trading?
Cboe's SPX product specification sets regular trading at 9:30 a.m. to 4:15 p.m. ET, with a curb session running to 5:00 p.m. ET, and states that trading in an expiring SPX series ordinarily ceases on the business day preceding the day on which the settlement value is calculated. As of September 2026 that is the rule for the third-Friday monthly: its regular life ends on Thursday. The 4:15 p.m. finish is itself a standing index-option difference, fifteen minutes past the 4:00 p.m. close of the stock market.
The panel below slices that Thursday into ten-minute buckets from 3:00 p.m. ET onward and keeps the buckets in which the AM-settled root actually traded.
| et_time | am_settled_spx_contracts | weekly_spxw_contracts |
|---|---|---|
| 15:00 | 6629 | 8405 |
| 15:10 | 4331 | 7972 |
| 15:20 | 5183 | 33713 |
| 15:30 | 6703 | 10491 |
| 15:40 | 10264 | 23697 |
| 15:50 | 11443 | 33810 |
| 16:00 | 6947 | 40752 |
| 16:10 | 1735 | 13366 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 10 MINUTE), '%H:%i') AS et_time,
sum(if(startsWith(ticker, 'O:SPXW'), 0, volume)) AS am_settled_spx_contracts,
sum(if(startsWith(ticker, 'O:SPXW'), volume, 0)) AS weekly_spxw_contracts
FROM global_markets.options_minute_aggs
WHERE (startsWith(ticker, 'O:SPX260515') OR startsWith(ticker, 'O:SPXW260515'))
AND window_start >= toDateTime('2026-05-14 19:00:00', 'UTC')
AND window_start < toDateTime('2026-05-14 21:30:00', 'UTC')
GROUP BY et_time
HAVING am_settled_spx_contracts > 0
ORDER BY et_timeThe last ten-minute bucket carrying AM-settled volume opens at 16:10 ET with 1735 contracts. Once that bucket closes, a holder of the monthly has no regular-session market left in it.
Is anything open on expiration Friday morning?
One window exists on paper. During 2025 Cboe filed and received approval for expiring AM-settled index options to trade in the overnight Global Trading Hours session, ceasing at 9:25 a.m. ET on the expiration date, shortly ahead of the opening prints that build SET. Access to that session varies by broker, and many retail platforms do not route to it. The panel below counts the 8:00 a.m. to 10:00 a.m. ET window on the expiration Friday.
| et_time | am_settled_spx_contracts | weekly_spxw_contracts | am_settled_premarket_total | weekly_premarket_total |
|---|---|---|---|---|
| 09:30 | 0 | 208022 | 0 | 376724 |
| 09:45 | 0 | 168702 | 0 | 376724 |
The exact SQL behind every number
SELECT
et_time,
am_settled_spx_contracts,
weekly_spxw_contracts,
sum(am_settled_spx_contracts) OVER () AS am_settled_premarket_total,
sum(weekly_spxw_contracts) OVER () AS weekly_premarket_total
FROM
(
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
sum(if(startsWith(ticker, 'O:SPXW'), 0, volume)) AS am_settled_spx_contracts,
sum(if(startsWith(ticker, 'O:SPXW'), volume, 0)) AS weekly_spxw_contracts
FROM global_markets.options_minute_aggs
WHERE (startsWith(ticker, 'O:SPX260515') OR startsWith(ticker, 'O:SPXW260515'))
AND window_start >= toDateTime('2026-05-15 12:00:00', 'UTC')
AND window_start < toDateTime('2026-05-15 14:00:00', 'UTC')
GROUP BY et_time
)
ORDER BY et_timeAcross that two-hour window the AM-settled root records 0 contracts, against 376724 in the weekly. For a trader on a standard retail platform, Thursday's close is the practical exit for the monthly, and a position carried past it goes to settlement at SET.
When does an expiring SPXW weekly stop trading?
An SPXW with days left on it trades to 4:15 p.m. ET like the rest of the index complex. On its own expiration day it stops at 4:00 p.m. ET, in line with the closing index level it settles against, and at 1:00 p.m. ET on a scheduled half day. Those extra fifteen minutes belong to contracts with life remaining, and the expiring weekly gives them up.
| et_time | weekly_spxw_contracts | am_settled_spx_contracts | am_settled_afternoon_total |
|---|---|---|---|
| 15:00 | 70497 | 0 | 0 |
| 15:10 | 82968 | 0 | 0 |
| 15:20 | 63060 | 0 | 0 |
| 15:30 | 64355 | 0 | 0 |
| 15:40 | 85554 | 0 | 0 |
| 15:50 | 161462 | 0 | 0 |
| 16:00 | 409 | 0 | 0 |
The exact SQL behind every number
SELECT
et_time,
weekly_spxw_contracts,
am_settled_spx_contracts,
sum(am_settled_spx_contracts) OVER () AS am_settled_afternoon_total
FROM
(
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 10 MINUTE), '%H:%i') AS et_time,
sum(if(startsWith(ticker, 'O:SPXW'), volume, 0)) AS weekly_spxw_contracts,
sum(if(startsWith(ticker, 'O:SPXW'), 0, volume)) AS am_settled_spx_contracts
FROM global_markets.options_minute_aggs
WHERE (startsWith(ticker, 'O:SPX260515') OR startsWith(ticker, 'O:SPXW260515'))
AND window_start >= toDateTime('2026-05-15 19:00:00', 'UTC')
AND window_start < toDateTime('2026-05-15 21:30:00', 'UTC')
GROUP BY et_time
HAVING weekly_spxw_contracts > 0
)
ORDER BY et_timeReading the same 3:00 p.m. onward clock on Friday: the last weekly bucket with volume opens at 16:00 ET and carries 409 contracts, while the AM-settled root prints 0 contracts across the whole afternoon. Same expiration date on both, one full session apart.
SET is not Thursday's close
SET is calculated once, on the morning of an AM-settled expiration, from the first regular-session trade in each S&P 500 member. The members do not all open in the same second, and the resulting number is a composite of Friday's opening prints that appears on no intraday chart. The distance between Thursday's close and Friday's opening level is the move an AM-settled holder carries with no market in which to trade it.
The panel below measures that overnight move on SPY, an S&P 500 exchange traded fund, for every monthly expiration Friday since late 2025. SET is computed from the index members themselves, and SPY stands in here as the tradable read of the same overnight move.
| expiration_date | expiration_label | overnight_gap_pct | abs_gap_pct | avg_abs_gap_pct |
|---|---|---|---|---|
| 2025-10-17 | Oct 17, 2025 | -0.17 | 0.17 | 0.44 |
| 2025-11-21 | Nov 21, 2025 | 0.39 | 0.39 | 0.44 |
| 2025-12-19 | Dec 19, 2025 | 0.02 | 0.02 | 0.44 |
| 2026-01-16 | Jan 16, 2026 | 0.21 | 0.21 | 0.44 |
| 2026-02-20 | Feb 20, 2026 | -0.32 | 0.32 | 0.44 |
| 2026-03-20 | Mar 20, 2026 | -0.5 | 0.5 | 0.44 |
| 2026-04-17 | Apr 17, 2026 | 0.64 | 0.64 | 0.44 |
| 2026-05-15 | May 15, 2026 | -0.85 | 0.85 | 0.44 |
| 2026-07-17 | Jul 17, 2026 | -1.15 | 1.15 | 0.44 |
| 2026-08-21 | Aug 21, 2026 | 0.45 | 0.45 | 0.44 |
| 2026-09-18 | Sep 18, 2026 | -0.17 | 0.17 | 0.44 |
The exact SQL behind every number
SELECT
toString(d) AS expiration_date,
formatDateTime(d, '%b %e, %Y') AS expiration_label,
round(gap_pct, 2) AS overnight_gap_pct,
round(abs(gap_pct), 2) AS abs_gap_pct,
round(avg(abs(gap_pct)) OVER (), 2) AS avg_abs_gap_pct
FROM
(
SELECT
d,
100 * (toFloat64(open_px) - toFloat64(prev_close)) / toFloat64(prev_close) AS gap_pct
FROM
(
SELECT
date AS d,
open AS open_px,
lagInFrame(close) OVER (ORDER BY date ASC) AS prev_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2025-10-01'
AND date <= today() - 2
)
WHERE toDayOfWeek(d) = 5
AND toDayOfMonth(d) BETWEEN 15 AND 21
)
ORDER BY expiration_dateAcross 11 monthly expirations beginning Oct 17, 2025, the absolute move from the prior close to the expiration-Friday open averaged 0.44%. The most recent one, Sep 18, 2026, measured 0.17%. A third Friday that lands on a market holiday drops out of the panel on its own, since no session prints.
A strike pinned at Thursday's close
Take a hypothetical to see what the two clocks do to one strike. The index finishes Thursday at 6,000. A 6,000-strike call in the AM-settled monthly and a 6,000-strike call in the Friday weekly look identical at that moment, both sitting exactly at the money. The monthly holder is finished trading: that contract resolves against SET the next morning, and an overnight move of the average size measured above settles it one way or the other. The weekly holder gets another full session and a live market into 4:00 p.m. Friday. AM settled versus PM settled options works through the settlement mechanics, and SPX versus SPY options covers contract size and cash settlement.
FAQ
What time do SPX options stop trading each day?
Regular trading in SPX and SPXW runs from 9:30 a.m. to 4:15 p.m. ET, fifteen minutes past the 4:00 p.m. close of the stock market, with a curb session to 5:00 p.m. ET. An expiring SPXW is the exception: it stops at 4:00 p.m. ET on its expiration day, and at 1:00 p.m. ET on a scheduled half day.
Can I close a monthly SPX position on expiration Friday?
Not in the regular session. The AM-settled monthly held its last regular session on the Thursday. Cboe's approved extension lets expiring AM-settled SPX trade in the overnight Global Trading Hours session until 9:25 a.m. ET on the expiration date, and reaching that session depends on the broker.
Do SPX and SPXW with the same third-Friday date expire at the same moment?
No. The AM-settled SPX contract settles on Friday's opening prints and stopped trading the previous day. The SPXW weekly with that same date trades to 4:00 p.m. ET on Friday and settles on the closing level.
What is SET, and where does it come from?
SET is the Special Opening Quotation for the S&P 500, calculated on the morning of an AM-settled expiration from the first regular-session trade in each index member. It is published under the symbol SET, and it is the number that decides every AM-settled SPX contract for that date.
Why does my SPX contract show a Friday expiration if it stopped trading Thursday?
The expiration date and the last trading day are two separate fields on the contract. An AM-settled monthly expires Friday and stops trading Thursday. The date on the ticker is the settlement date, not the trading deadline.
Every panel above ships with the SQL that produced it, one expander away. To check when a specific SPX expiration last traded, ask the question in plain English on the Strasmore terminal.
Data notes and method
- The two roots are separated by the contract symbol prefix. A symbol beginning O:SPXW is the weekly, PM-settled root. A symbol beginning O:SPX followed directly by the expiration digits is the AM-settled monthly.
- All stored timestamps are UTC. Every intraday panel converts to America/New_York before bucketing, and the May 2026 windows sit in Eastern Daylight Time.
- The intraday windows deliberately run wider than the regular session, from 3:00 p.m. to 5:30 p.m. ET and from 8:00 a.m. to 10:00 a.m. ET, keeping any print after the 4:00 p.m. stock market close visible rather than filtered away.
- Session buckets use Eastern calendar dates. An evening overnight print counts under the evening's own date.
- Trading hours and the expiring-series cutoffs quoted here come from the Cboe SPX product specification, read in September 2026, together with Cboe's 2025 notices on the Global Trading Hours extension for expiring AM-settled series. Product specifications change, and that extension was phased in across the same period.
- The gap panel reads SPY, an S&P 500 exchange traded fund, as a tradable stand-in for the index level. The settlement value itself is built from the index members.