Stock Market Hours: Open 9:30, Close 4:00 ET
What time does the stock market open and close? NYSE and Nasdaq regular hours run 9:30 a.m.–4 p.m. ET, plus premarket and after-hours; closed weekends.
US stock market hours run from 9:30 a.m. to 4:00 p.m. Eastern Time, Monday through Friday, the NYSE and the Nasdaq both open regular trading at 9:30 a.m. ET and close it at 4:00 p.m. ET. Around that regular session sit two extended windows: premarket trading from 4:00 a.m. ET and after-hours trading until 8:00 p.m. ET, with markets shut on weekends and on roughly ten holidays a year. Every figure on this page is measured from real trade records, with the exact query behind each number one click away. (For the at-a-glance version, next closure, most recent session, see is the stock market open today.)
What time does the stock market open and close?
The regular trading session, the hours that quoted prices, index levels, and the evening news all describe, runs from the opening bell at 9:30 a.m. ET to the closing bell at 4:00 p.m. ET: six and a half hours, five days a week. Both major US listing exchanges keep the same clock, and a standard brokerage order works this window by default.
The full electronic trading day is wider than the bells:
- Premarket: 4:00 a.m. to 9:30 a.m. ET, electronic trading before the opening bell.
- Regular session: 9:30 a.m. to 4:00 p.m. ET, where the bulk of the day's business gets done.
- After-hours: 4:00 p.m. to 8:00 p.m. ET, electronic trading after the closing bell.
Two auctions bracket the regular day. An opening auction sets each stock's official opening price at 9:30 a.m., and the closing auction, a single giant matched trade moments after 4:00 p.m., sets the official closing price quoted everywhere that evening. All times on this page are Eastern: the same regular session runs 6:30 a.m. to 1:00 p.m. on the US West Coast.
What do stock market hours look like on the tape?
Definitions are one thing; the tape is the proof. The panels below take a recent full-length session on the SPY tape, 2026-08-19, a Wednesday, the most recent session old enough for its record to be complete (the data feed runs a day or two behind), verified by counting its regular-session minute bars: 390 of them, one for every minute between the bells. The session's first bar printed at 04:00 ET and its last at 19:59 ET, the tape spans the full extended day, 4:00 a.m. to 8:00 p.m.
The exact SQL behind every number
WITH
(
SELECT max(d)
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 21
AND window_start < today() - 2
GROUP BY d
HAVING rth_bars = 390
)
) AS session_day
SELECT
toString(session_day) AS session_date,
formatDateTime(session_day, '%W') AS weekday,
countIf(et_min >= 570 AND et_min < 960) AS regular_session_bars,
min(et_min) AS first_bar_minute_of_day,
max(et_min) AS last_bar_minute_of_day,
formatDateTime(min(et_ts), '%H:%i') AS first_bar_et,
formatDateTime(max(et_ts), '%H:%i') AS last_bar_et,
round(sum(volume) / 1e6, 1) AS total_shares_m,
round(100.0 * sumIf(volume, et_min < 570) / sum(volume), 1) AS premarket_pct,
round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 960) / sum(volume), 1) AS regular_pct,
round(100.0 * sumIf(volume, et_min >= 960 AND et_min < 990) / sum(volume), 1) AS post_close_30min_pct,
round(100.0 * sumIf(volume, et_min >= 990) / sum(volume), 1) AS evening_pct,
round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 600) / sum(volume), 1) AS first_30min_pct,
round(100.0 * sumIf(volume, et_min >= 930 AND et_min < 960) / sum(volume), 1) AS last_30min_pct,
round(100.0 * sumIf(volume, et_min >= 750 AND et_min < 780) / sum(volume), 1) AS midday_half_hour_pct
FROM
(
SELECT
volume,
toTimeZone(window_start, 'America/New_York') AS et_ts,
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) AS et_min
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) = session_day
)The volume split is the lesson. Of the 39 million SPY shares that traded across that whole sixteen-hour span, the regular session carried 79.5%. The five-and-a-half-hour premarket printed 4.2%. The half hour immediately after the closing bell printed 15.6%, a window that catches large negotiated trades reported to the tape once the session ends, and the remaining three and a half evening hours printed 0.7% combined.
Half-hour buckets show the day's shape:
The exact SQL behind every number
WITH
(
SELECT max(d)
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 21
AND window_start < today() - 2
GROUP BY d
HAVING rth_bars = 390
)
) AS session_day
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_half_hour,
round(sum(volume) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) = session_day
GROUP BY et_half_hour
ORDER BY et_half_hourOn this session the closing half hour printed 20% of the entire day's volume, against 5.2% for the 12:30-to-1:00 lunchtime half hour; the opening half hour printed 10.1%. The heavy close has a mechanical anchor: index funds, mutual funds, and benchmarked institutions transact at official closing prices, and their orders pool into the closing auction. In all, volume landed in 32 distinct half-hour buckets across the extended day.
What are premarket and after-hours trading?
Premarket (4:00 a.m. to 9:30 a.m. ET) and after-hours (4:00 p.m. to 8:00 p.m. ET) are electronic-only trading windows around the regular day. Fewer participants show up there, bid-ask spreads run wider, and most brokers accept only limit orders in these sessions. Company news concentrates in them: earnings releases cluster just after the 4:00 p.m. close and in the hours before the open, the windows where a stock's price can gap far from its prior close. A price printed at 7:00 p.m. carries no guarantee about where the stock opens the next morning.
Session-by-session volume shares, measured bid-ask spread costs, and the clock-time when headlines actually land are all in after-hours and premarket trading, the companion piece to this page. The short version, visible in the panels above: extended sessions are real and tradable, and they are thin next to the regular day.
What hours do options and futures trade?
Options on individual companies trade 9:30 a.m. to 4:00 p.m. ET, no premarket, no after-hours. Options on a short list of broad-market ETFs and index products, SPY, QQQ, IWM, index options like SPX and VIX, get 15 extra minutes, until 4:15 p.m. ET. The tape shows the split on 2026-08-19, the same session measured above:
The exact SQL behind every number
WITH
(
SELECT max(d)
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 21
AND window_start < today() - 2
GROUP BY d
HAVING rth_bars = 390
)
) AS session_day
SELECT
if(startsWith(ticker, 'O:SPY'), 'SPY options (ETF)', 'AAPL options (single name)') AS contract,
toString(session_day) AS session_date,
countIf(sip_timestamp >= toDateTime(concat(toString(session_day), ' 15:45:00'), 'America/New_York')
AND sip_timestamp < toDateTime(concat(toString(session_day), ' 16:00:00'), 'America/New_York')) AS trades_345_to_400,
countIf(sip_timestamp >= toDateTime(concat(toString(session_day), ' 16:00:00'), 'America/New_York')
AND sip_timestamp < toDateTime(concat(toString(session_day), ' 16:15:00'), 'America/New_York')) AS trades_400_to_415,
formatDateTime(toTimeZone(max(sip_timestamp), 'America/New_York'), '%H:%i') AS last_trade_et,
toHour(toTimeZone(max(sip_timestamp), 'America/New_York')) * 60
+ toMinute(toTimeZone(max(sip_timestamp), 'America/New_York')) AS last_trade_minute_of_day
FROM global_markets.options_trades
WHERE (startsWith(ticker, 'O:SPY') OR startsWith(ticker, 'O:AAPL'))
AND match(ticker, '^O:(SPY|AAPL)[0-9]{6}[CP][0-9]{8}$')
AND sip_timestamp >= toDateTime(concat(toString(session_day), ' 15:45:00'), 'America/New_York')
AND sip_timestamp < toDateTime(concat(toString(session_day), ' 23:00:00'), 'America/New_York')
GROUP BY contract
ORDER BY contractThe last 15 minutes of the regular session were busy on both tapes: 7402 AAPL options trades, 53682 SPY. The 15 minutes after the bell split them: AAPL managed 0 stray prints (the last at 15:59 ET) while SPY printed 16238 trades, the last at 16:15 ET. Expiration keeps its own clock, when do 0DTE options trade maps it.
Futures keep a different clock entirely: CME equity-index futures trade nearly 24 hours, Sunday 6:00 p.m. ET to Friday 5:00 p.m. ET with a one-hour daily pause at 5:00 p.m., the overnight tape behind every "futures are up this morning" headline. The bond market trades over-the-counter on SIFMA's recommended hours, roughly 8:00 a.m. to 5:00 p.m. ET, with its own holiday calendar: bonds close for Columbus Day and Veterans Day while stocks trade.
When is the stock market closed?
US stock markets close for weekends, for about ten full-day holidays a year, and early, at 1:00 p.m. ET, on a few scheduled half days. The calendar below comes straight from the exchange schedule and maintains itself: each holiday drops off as it passes and the next one moves up.
The exact SQL behind every number
SELECT
toString(date) AS holiday_date,
formatDateTime(date, '%a') AS weekday,
any(name) AS holiday,
any(status) AS day_status,
any(if(status = 'early-close',
formatDateTime(toTimeZone(close, 'America/New_York'), '%I:%i %p'),
'')) AS early_close_et,
dateDiff('day', today(), date) AS days_away
FROM global_markets.stocks_market_holidays
WHERE date >= today()
GROUP BY date
ORDER BY dateThe next scheduled closure is Labor Day on 2026-09-07, 16 days out, and the loaded calendar lists 12 dated closures ahead, each marked as a full closure or an early close. On an early-close day the regular session ends at 1:00 p.m. ET instead of 4:00 p.m., three and a half hours of trading instead of six and a half, with the closing auction printing at 1:00 p.m. These half days cluster around Thanksgiving and Christmas. The weekend make-up rules (a Saturday holiday closes the market the Friday before, a Sunday holiday the Monday after), the full calendar, and how to audit a past closure from the tape are covered in stock market holidays and early closes.
What does a half day look like on the tape?
The calendar names the early closes; the tape shows what one looks like. The most recent half day on the SPY tape was 2025-12-24, a Wednesday: 210 regular-session minute bars from 9:30 a.m. to the 1:00 p.m. closing auction.
The exact SQL behind every number
WITH
(
SELECT max(d)
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 400
AND window_start < today() - 2
GROUP BY d
HAVING rth_bars >= 150 AND rth_bars <= 240
)
) AS half_day
SELECT
toString(half_day) AS session_date,
formatDateTime(half_day, '%W') AS weekday,
countIf(et_min >= 570 AND et_min < 780) AS morning_session_bars,
formatDateTime(max(et_ts), '%H:%i') AS last_bar_et,
max(et_min) AS last_bar_minute_of_day,
round(sum(volume) / 1e6, 1) AS total_shares_m,
round(100.0 * sumIf(volume, et_min < 570) / sum(volume), 1) AS premarket_pct,
round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 780) / sum(volume), 1) AS regular_pct,
round(100.0 * sumIf(volume, et_min >= 780 AND et_min < 810) / sum(volume), 1) AS post_close_30min_pct,
round(100.0 * sumIf(volume, et_min >= 810) / sum(volume), 1) AS evening_pct,
round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 600) / sum(volume), 1) AS first_30min_pct,
round(100.0 * sumIf(volume, et_min >= 750 AND et_min < 780) / sum(volume), 1) AS last_30min_pct,
round(100.0 * sumIf(volume, et_min >= 750 AND et_min < 780) / sum(volume)
- 100.0 * sumIf(volume, et_min >= 570 AND et_min < 600) / sum(volume), 1) AS close_minus_open_pct
FROM
(
SELECT
volume,
toTimeZone(window_start, 'America/New_York') AS et_ts,
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) AS et_min
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 400
AND toDate(toTimeZone(window_start, 'America/New_York')) = half_day
)The shape of a full day survives the compression. Of the 35.6 million SPY shares that printed, the shortened regular session carried 95.5%, and the final half hour before the 1:00 p.m. close carried 23.8%, well ahead of the opening half hour's 12.2%, the same closing-auction gravity as a normal day, pulled forward three hours. The half hour after the close printed 3.1% (the block-report window again) and the rest of the afternoon just 0.1%. Extended hours shut early too: the day's last bar printed at 16:59 ET, after-hours ends around 5:00 p.m. on half days, three hours ahead of the usual 8:00 p.m. Options close early as well: 1:00 p.m. for single names, 1:15 p.m. for the extended ETF and index contracts.
The exact SQL behind every number
WITH
(
SELECT max(d)
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 400
AND window_start < today() - 2
GROUP BY d
HAVING rth_bars >= 150 AND rth_bars <= 240
)
) AS half_day
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_half_hour,
round(sum(volume) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 400
AND toDate(toTimeZone(window_start, 'America/New_York')) = half_day
GROUP BY et_half_hour
ORDER BY et_half_hourVolume landed in 21 half-hour buckets, the familiar busy-open, heavier-close shape squeezed into three and a half hours.
How many trading days are in a year?
Take out weekends and holidays and a calendar year leaves roughly 250 trading sessions. Counting them from the tape settles the exact number:
The exact SQL behind every number
SELECT
count() AS trading_days,
countIf(rth_bars >= 380) AS full_length_sessions,
countIf(rth_bars <= 240) AS shortened_sessions,
countIf(rth_bars > 240 AND rth_bars < 380) AS irregular_sessions,
countIf(is_weekend) AS weekend_sessions,
toString(min(d)) AS first_session,
toString(max(d)) AS last_session
FROM
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
toDayOfWeek(toDate(toTimeZone(window_start, 'America/New_York'))) >= 6 AS is_weekend,
countIf((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) AS rth_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 370
AND window_start < today() - 2
GROUP BY d, is_weekend
HAVING rth_bars > 0
)Between 2025-08-18 and 2026-08-19 the market held 253 regular sessions, 251 full-length days plus 2 shortened ones, and exactly 0 weekend sessions, the tape's own receipt that no Saturday or Sunday held a regular session.
Stock market hours around the world
US hours are one slice of a nearly continuous global rotation. The London Stock Exchange trades 8:00 a.m. to 4:30 p.m. local time; its final stretch typically overlaps the first two US regular-session hours, 9:30 to 11:30 a.m. ET, European closes land mid-morning in New York. Tokyo trades 9:00 a.m. to 3:30 p.m. local time with a lunch break, entirely inside the US overnight. Somewhere, a major exchange is open on almost any weekday, but a US-listed stock prints only during the US hours measured on this page.
Stock Market Hours FAQ
What time does the stock market open?
The NYSE and Nasdaq open regular trading at 9:30 a.m. Eastern Time, Monday through Friday. Electronic premarket trading starts much earlier, at 4:00 a.m. ET, but each stock's official opening price is set at the 9:30 a.m. opening auction.
Is the stock market open on weekends?
No. US stock exchanges run no sessions on Saturday or Sunday, the trailing year of tape data above shows 0 weekend sessions. After Friday's 4:00 p.m. close and its 8:00 p.m. after-hours cutoff, trading resumes with Monday's 4:00 a.m. premarket, holidays aside.
What are pre-market and after-hours trading?
Electronic trading outside regular hours: premarket runs 4:00 a.m. to 9:30 a.m. ET and after-hours runs 4:00 p.m. to 8:00 p.m. ET. Both operate with fewer participants and wider bid-ask spreads than the regular session, and most brokers accept only limit orders there.
When does the market close early?
On scheduled half days, regular trading ends at 1:00 p.m. ET instead of 4:00 p.m., typically the Friday after Thanksgiving, Christmas Eve when it falls on a weekday, and July 3 in some years. The trailing year's tape shows 2 shortened sessions.
What happens if a stock is halted at the close?
A stock still halted at the closing bell does not get a delayed closing auction that day, exchange rules bar a reopening auction once the halt runs past roughly 3:50 p.m. ET, so the halt simply continues through the close. With no auction to set a price, the exchange falls back to the volume-weighted average price of the stock's own trades in the final five minutes before the halt as its official closing price, not simply its last trade. Halts are per stock, the rest of the market closes at 4:00 p.m. on schedule.
Does the stock market close at 4:00 or 4:30?
US stock exchanges close regular trading at 4:00 p.m. ET. Quotes that keep moving after that come from the after-hours session, which runs to 8:00 p.m. ET, and a few index products trade until 4:15 p.m. ET.
Market hours are a schedule; the tape is the receipt. Every panel above is a stored query you can open, edit, and re-run on the Strasmore terminal, check any session, any ticker, or the next closure ahead in plain English.