Stock Market Hours: E dey Open 9:30, Close 4:00 ET
Stock market dey open 9:30 a.m. reach 4:00 p.m. ET for NYSE and Nasdaq. Premarket and after-hours dey available, but market dey close weekends.
US stock market dey trade from 9:30 a.m. to 4:00 p.m. Eastern Time, Monday reach Friday. NYSE and Nasdaq both dey open regular trading by 9:30 a.m. ET and close am by 4:00 p.m. ET. Two extended trading windows dey around this regular session: premarket trading from 4:00 a.m. ET, plus after-hours trading until 8:00 p.m. ET. Market dey close for weekends and roughly ten holidays every year. Every figure for this page come from real trade records, and exact query wey produce each number dey one click away. (For quick view of whether market dey open today, the next closure, and the most recent session, see stock market dey open today.)
What time stock market dey open and close?
Regular trading session — na the hours wey quoted prices, index levels and evening news dey describe — dey run from opening bell at 9:30 a.m. ET reach closing bell at 4:00 p.m. ET. Na six and a half hours, five days every week. The two main US listing exchanges dey use the same clock, and standard brokerage order dey work for this period by default.
The full electronic trading day wide pass the bell times:
- Premarket: 4:00 a.m. to 9:30 a.m. ET, electronic trading before opening bell.
- Regular session: 9:30 a.m. to 4:00 p.m. ET, na here most of the day’s business dey happen.
- After-hours: 4:00 p.m. to 8:00 p.m. ET, electronic trading after closing bell.
Two auctions dey mark the beginning and end of regular day. Opening auction dey set each stock official opening price at 9:30 a.m. Then the closing auction, wey be one big matched trade moments after 4:00 p.m., dey set the official closing price wey everywhere dey quote that evening. All the times for this page na Eastern time. The same regular session dey run from 6:30 a.m. to 1:00 p.m. for US West Coast.
Stock market hours dey look like wetin for the tape?
Definitions na one thing; tape na the proof. The panels below use one recent complete session for SPY tape, 2026-10-14, a Wednesday, wey be the latest session wey old enough for the record to complete because data feed dey run one or two days behind. We verify am by counting the regular-session minute bars: 390 of dem, one for every minute between the bells. The session first bar print for 04:00 ET and the last one for 19:59 ET. The tape cover the full extended day, from 4:00 a.m. to 8:00 p.m.
| session date | weekday | regular session bars | first bar minute of day | last bar minute of day | first bar et | last bar et | total shares m | premarket pct | regular pct | post close 30min pct | evening pct | first 30min pct | last 30min pct | midday half hour pct |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-10-14 | Wednesday | 390 | 240 | 1199 | 04:00 | 19:59 | 55.7 | 2.6 | 86.2 | 9 | 2.1 | 8.1 | 25.1 | 3.5 |
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,
b.regular_session_bars AS regular_session_bars,
b.first_bar_minute_of_day AS first_bar_minute_of_day,
b.last_bar_minute_of_day AS last_bar_minute_of_day,
b.first_bar_et AS first_bar_et,
b.last_bar_et AS last_bar_et,
t.total_shares_m AS total_shares_m,
t.premarket_pct AS premarket_pct,
t.regular_pct AS regular_pct,
t.post_close_30min_pct AS post_close_30min_pct,
t.evening_pct AS evening_pct,
t.first_30min_pct AS first_30min_pct,
t.last_30min_pct AS last_30min_pct,
t.midday_half_hour_pct AS midday_half_hour_pct
FROM
(
SELECT
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
FROM
(
SELECT
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
)
) AS b
CROSS JOIN
(
SELECT
round(sum(shares) / 1e6, 1) AS total_shares_m,
round(100.0 * sumIf(shares, NOT is_close AND et_min < 570) / sum(shares), 1) AS premarket_pct,
round(100.0 * sumIf(shares, is_close OR (et_min >= 570 AND et_min < 960)) / sum(shares), 1) AS regular_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 960 AND et_min < 990) / sum(shares), 1) AS post_close_30min_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 990) / sum(shares), 1) AS evening_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 570 AND et_min < 600) / sum(shares), 1) AS first_30min_pct,
round(100.0 * sumIf(shares, is_close OR (et_min >= 930 AND et_min < 960)) / sum(shares), 1) AS last_30min_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 750 AND et_min < 780) / sum(shares), 1) AS midday_half_hour_pct
FROM
(
SELECT
toFloat64(size) AS shares,
has(conditions, 8) AS is_close,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= toDateTime(session_day, 'America/New_York')
AND sip_timestamp < toDateTime(session_day + 1, 'America/New_York')
AND NOT hasAny(conditions, [15, 16, 38])
)
) AS tThe volume split na the main lesson. Dem dey read am trade by trade from the consolidated tape, and the closing auction print count as part of the regular session wey e end. Out of the 55.7 million SPY shares wey trade across the full sixteen-hour period, regular session carry 86.2%. The five-and-a-half-hour premarket print 2.6%. The half hour immediately after closing bell print 9%. Na this window dey catch large negotiated trades wey dem report to the tape after the session don end. The remaining three and a half evening hours print 2.1% combined.
Half-hour buckets show how the day take move:
| et half hour | shares m |
|---|---|
| 04:00 | 0.05 |
| 04:30 | 0.02 |
| 05:00 | 0.01 |
| 05:30 | 0 |
| 06:00 | 0.02 |
| 06:30 | 0.01 |
| 07:00 | 0.05 |
| 07:30 | 0.02 |
| 08:00 | 0.13 |
| 08:30 | 0.83 |
| 09:00 | 0.33 |
| 09:30 | 4.52 |
| 10:00 | 2.77 |
| 10:30 | 2.46 |
| 11:00 | 2.76 |
| 11:30 | 2.16 |
| 12:00 | 2.84 |
| 12:30 | 1.97 |
| 13:00 | 1.97 |
| 13:30 | 3.77 |
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(if(has(conditions, 8),
toTimeZone(sip_timestamp, 'America/New_York') - INTERVAL 10 MINUTE,
toTimeZone(sip_timestamp, 'America/New_York')),
INTERVAL 30 MINUTE), '%H:%i') AS et_half_hour,
round(sum(toFloat64(size)) / 1e6, 2) AS shares_m
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= toDateTime(session_day, 'America/New_York')
AND sip_timestamp < toDateTime(session_day + 1, 'America/New_York')
AND NOT hasAny(conditions, [15, 16, 38])
GROUP BY et_half_hour
ORDER BY et_half_hourFor this session, the closing half hour, including the auction print, carry 25.1% of the whole day's volume. The 12:30-to-1:00 lunchtime half hour carry 3.5%, while the opening half hour carry 8.1%. The heavy close get one mechanical reason: index funds, mutual funds, and benchmarked institutions dey trade at official closing prices, and their orders dey gather for the closing auction. Altogether, volume land inside 32 separate half-hour buckets across the extended day.
Wetin be 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) na electronic-only trading windows wey surround the regular trading day. Fewer participants dey show for there, bid-ask spreads dey wider, and most brokers dey accept only limit orders for these sessions. Company news dey pile up for these periods. Earnings releases dey mostly come just after the 4:00 p.m. close and during the hours before market open. Na for these windows stock price fit gap far from the previous close. Price wey print for 7:00 p.m. no guarantee where the stock go open the next morning.
Session-by-session volume shares, measured bid-ask spread costs, and the exact time wey headlines actually land dey inside after-hours and premarket trading, wey be the companion piece to this page. The short version, as the panels above show: extended sessions dey real and traders fit trade them, but volume for there dey thin compared with the regular day.
Options and futures dey trade for which hours?
Options on individual companies dey trade from 9:30 a.m. to 4:00 p.m. ET. Dem no dey trade for premarket or after-hours. Options on small list of broad-market ETFs and index products, like SPY, QQQ and IWM, plus index options like SPX and VIX, get extra 15 minutes. Dem fit trade reach 4:15 p.m. ET. The tape show the split for 2026-10-14, for the same session wey we measure before:
| contract | session date | trades 345 to 400 | trades 400 to 415 | last trade et | last trade minute of day |
|---|---|---|---|---|---|
| AAPL options (single name) | 2026-10-14 | 11803 | 3 | 16:00 | 960 |
| SPY options (ETF) | 2026-10-14 | 64434 | 29698 | 16:14 | 974 |
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 regular session busy for both tapes: 11803 AAPL options trades and 64434 SPY. The 15 minutes after the bell separate dem. AAPL manage 3 stray prints, with the last one for 16:00 ET, while SPY print 29698 trades. The last one happen for 16:14 ET. Expiration get its own clock. when 0DTE options dey trade explain am.
Futures get completely different trading hours. CME equity-index futures dey trade nearly 24 hours, from Sunday 6:00 p.m. ET reach Friday 5:00 p.m. ET. Dem get one-hour daily pause from 5:00 p.m. The overnight tape dey behind every headline wey talk say “futures are up this morning.” The bond market dey trade over-the-counter during SIFMA recommended hours, roughly from 8:00 a.m. to 5:00 p.m. ET. E get its own holiday calendar. Bonds close for Columbus Day and Veterans Day, while stocks still dey trade.
When stock market dey close?
US stock markets dey close for weekends, for about ten full-day holidays every year, and early at 1:00 p.m. ET on some scheduled half days. The calendar below come straight from exchange schedule and e dey update itself: each holiday go comot after e pass, and the next one go move up.
| holiday date | weekday | holiday | day status | early close et | days away |
|---|---|---|---|---|---|
| 2026-11-26 | Thu | Thanksgiving | closed | 40 | |
| 2026-11-27 | Fri | Thanksgiving | early-close | 01:00 PM | 41 |
| 2026-12-24 | Thu | Christmas | early-close | 01:00 PM | 68 |
| 2026-12-25 | Fri | Christmas | closed | 69 | |
| 2027-01-01 | Fri | New Years Day | closed | 76 | |
| 2027-01-18 | Mon | Martin Luther King, Jr. Day | closed | 93 | |
| 2027-02-15 | Mon | Washington's Birthday | closed | 121 | |
| 2027-03-26 | Fri | Good Friday | closed | 160 | |
| 2027-05-31 | Mon | Memorial Day | closed | 226 | |
| 2027-06-18 | Fri | Juneteenth | closed | 244 | |
| 2027-07-05 | Mon | Independence Day | closed | 261 | |
| 2027-09-06 | Mon | Labor Day | closed | 324 |
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 na Thanksgiving for 2026-11-26, with 40 days remaining. The loaded calendar list 12 dated closures ahead, and e mark each one as full closure or early close. On early-close day, regular session dey end at 1:00 p.m. ET instead of 4:00 p.m. That one mean three and a half hours of trading instead of six and a half. The closing auction go print at 1:00 p.m. These half days dey gather around Thanksgiving and Christmas. The weekend make-up rules — Saturday holiday dey close the market on the Friday before, while Sunday holiday dey close am on the Monday after — plus the full calendar and how to audit past closure from the tape, dey covered for stock market holidays and early closes.
Half day dey look like wetin for tape?
Calendar dey show when market go close early; tape dey show how e really look. The latest half day for SPY tape na 2025-12-24, a Wednesday: 210 regular-session minute bars from 9:30 a.m. reach the 1:00 p.m. closing auction.
| session date | weekday | morning session bars | last bar et | last bar minute of day | total shares m | premarket pct | regular pct | post close 30min pct | evening pct | first 30min pct | last 30min pct | close minus open pct |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2025-12-24 | Wednesday | 210 | 16:59 | 1019 | 39.9 | 1.2 | 89.6 | 7.8 | 1.4 | 10.9 | 24.2 | 13.3 |
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,
b.morning_session_bars AS morning_session_bars,
b.last_bar_et AS last_bar_et,
b.last_bar_minute_of_day AS last_bar_minute_of_day,
t.total_shares_m AS total_shares_m,
t.premarket_pct AS premarket_pct,
t.regular_pct AS regular_pct,
t.post_close_30min_pct AS post_close_30min_pct,
t.evening_pct AS evening_pct,
t.first_30min_pct AS first_30min_pct,
t.last_30min_pct AS last_30min_pct,
round(t.last_30min_pct - t.first_30min_pct, 1) AS close_minus_open_pct
FROM
(
SELECT
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
FROM
(
SELECT
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
)
) AS b
CROSS JOIN
(
SELECT
round(sum(shares) / 1e6, 1) AS total_shares_m,
round(100.0 * sumIf(shares, NOT is_close AND et_min < 570) / sum(shares), 1) AS premarket_pct,
round(100.0 * sumIf(shares, is_close OR (et_min >= 570 AND et_min < 780)) / sum(shares), 1) AS regular_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 780 AND et_min < 810) / sum(shares), 1) AS post_close_30min_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 810) / sum(shares), 1) AS evening_pct,
round(100.0 * sumIf(shares, NOT is_close AND et_min >= 570 AND et_min < 600) / sum(shares), 1) AS first_30min_pct,
round(100.0 * sumIf(shares, is_close OR (et_min >= 750 AND et_min < 780)) / sum(shares), 1) AS last_30min_pct
FROM
(
SELECT
toFloat64(size) AS shares,
has(conditions, 8) AS is_close,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= toDateTime(half_day, 'America/New_York')
AND sip_timestamp < toDateTime(half_day + 1, 'America/New_York')
AND NOT hasAny(conditions, [15, 16, 38])
)
) AS tFull-day shape still dey show even after dem compress the session. Out of the 39.9 million SPY shares wey print, shortened regular session carry 89.6%. The final half hour before the 1:00 p.m. close, including the closing auction print, carry 24.2%. E pass the opening half hour wey carry 10.9%. Na the same closing-auction gravity wey normal day get, but dem move am forward by three hours. The half hour after close print 7.8%, again for the block-report window. The remaining afternoon print just 1.4%. Extended hours close early too. The last bar for the day print at 16:59 ET. After-hours dey end around 5:00 p.m. on half days, three hours before the usual 8:00 p.m. Options close early too: 1:00 p.m. for single names, and 1:15 p.m. for the extended ETF and index contracts.
| et half hour | shares m |
|---|---|
| 04:00 | 0.03 |
| 04:30 | 0 |
| 05:00 | 0.01 |
| 05:30 | 0.01 |
| 06:00 | 0.01 |
| 06:30 | 0.01 |
| 07:00 | 0.05 |
| 07:30 | 0.03 |
| 08:00 | 0.1 |
| 08:30 | 0.11 |
| 09:00 | 0.13 |
| 09:30 | 4.36 |
| 10:00 | 3.84 |
| 10:30 | 3.46 |
| 11:00 | 4.98 |
| 11:30 | 3.79 |
| 12:00 | 5.69 |
| 12:30 | 9.66 |
| 13:00 | 3.11 |
| 13:30 | 0.11 |
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(if(has(conditions, 8),
toTimeZone(sip_timestamp, 'America/New_York') - INTERVAL 10 MINUTE,
toTimeZone(sip_timestamp, 'America/New_York')),
INTERVAL 30 MINUTE), '%H:%i') AS et_half_hour,
round(sum(toFloat64(size)) / 1e6, 2) AS shares_m
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= toDateTime(half_day, 'America/New_York')
AND sip_timestamp < toDateTime(half_day + 1, 'America/New_York')
AND NOT hasAny(conditions, [15, 16, 38])
GROUP BY et_half_hour
ORDER BY et_half_hourVolume enter 26 half-hour buckets. The familiar busy-open and heavier-close pattern squeeze into three and a half hours.
How many trading days dey inside one year?
If you comot weekends and holidays, calendar year go leave roughly 250 trading sessions. To get the exact number, count dem from the tape:
| trading days | full length sessions | shortened sessions | irregular sessions | weekend sessions | first session | last session |
|---|---|---|---|---|---|---|
| 253 | 251 | 2 | 0 | 0 | 2025-10-13 | 2026-10-14 |
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-10-13 and 2026-10-14, market get 253 regular sessions: 251 full-length days plus 2 shortened ones. E also get exactly 0 weekend sessions. Na the tape itself confirm say no regular session hold on Saturday or Sunday.
Stock market hours for different places around the world
US hours na only one part of the global market cycle wey dey run almost continuously. London Stock Exchange dey trade from 8:00 a.m. to 4:30 p.m. local time. The last part of London session usually overlap with the first two US regular-session hours, from 9:30 to 11:30 a.m. ET. So, European market close dey happen around mid-morning for New York.
Tokyo dey trade from 9:00 a.m. to 3:30 p.m. local time, with lunch break. The whole session dey happen inside US overnight hours. Almost any weekday, at least one major exchange dey open somewhere. But US-listed stock fit only get prints during the US hours wey this page measure.
Stock Market Hours FAQ
Market go open what time?
NYSE and Nasdaq dey open regular trading by 9:30 a.m. Eastern Time, Monday reach Friday. Electronic premarket trading dey start much earlier, by 4:00 a.m. ET, but official opening price for each stock na the 9:30 a.m. opening auction go set am.
Stock market dey open for weekend?
No. US stock exchanges no dey run session on Saturday or Sunday. The trailing year tape data above show 0 weekend sessions. After Friday 4:00 p.m. close and 8:00 p.m. after-hours cutoff, trading go resume with Monday 4:00 a.m. premarket, except holiday dey.
Wetin be pre-market and after-hours trading?
Na electronic trading wey dey happen outside regular hours. Premarket dey run from 4:00 a.m. to 9:30 a.m. ET, while after-hours dey run from 4:00 p.m. to 8:00 p.m. ET. Both sessions get fewer participants and wider bid-ask spreads than regular session. Most brokers dey accept only limit orders for there.
When market dey close early?
For scheduled half days, regular trading dey end by 1:00 p.m. ET instead of 4:00 p.m. This one usually happen for Friday after Thanksgiving, Christmas Eve when e fall on weekday, and July 3 for some years. The trailing year tape show 2 shortened sessions.
Wetin dey happen if dem halt stock when market wan close?
If stock still dey halted when closing bell ring, e no go get delayed closing auction that day. Exchange rules no allow reopening auction once halt pass around 3:50 p.m. ET, so halt just continue through the close. Since no auction dey set price, exchange go use the stock’s volume-weighted average price from its own trades during the final five minutes before the halt as official closing price. E no be simply the last trade. Halts dey affect each stock separately; the rest of the market still close by 4:00 p.m. as scheduled.
Stock market dey close by 4:00 or 4:30?
US stock exchanges dey close regular trading by 4:00 p.m. ET. Quotes wey still dey move after that come from after-hours session, wey dey run reach 8:00 p.m. ET. Some index products dey trade reach 4:15 p.m. ET.
Market hours na schedule; tape na the receipt. Every panel above na stored query wey you fit open, edit and run again for Strasmore terminal. You fit check any session, any ticker, or the next closure ahead with plain English.