Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-10-18 · data as of October 18, 2026 · refreshed weekly

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.

QueryOne full trading day for SPY, wey dem split by session window (latest full session)
session dateweekdayregular session barsfirst bar minute of daylast bar minute of dayfirst bar etlast bar ettotal shares mpremarket pctregular pctpost close 30min pctevening pctfirst 30min pctlast 30min pctmidday half hour pct
2026-10-14Wednesday390240119904:0019:5955.72.686.292.18.125.13.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 t
Run am yourself

The 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:

QuerySPY volume by half hour, from premarket reach after-hours (same session, ET clock)
32 rows (showing 20)
et half hourshares m
04:000.05
04:300.02
05:000.01
05:300
06:000.02
06:300.01
07:000.05
07:300.02
08:000.13
08:300.83
09:000.33
09:304.52
10:002.77
10:302.46
11:002.76
11:302.16
12:002.84
12:301.97
13:001.97
13:303.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_hour
Run am yourself

For 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:

QuerySingle-name vs. ETF options for 4:00 p.m. bell: AAPL and SPY options trades around close (same session)
contractsession datetrades 345 to 400trades 400 to 415last trade etlast trade minute of day
AAPL options (single name)2026-10-1411803316:00960
SPY options (ETF)2026-10-14644342969816:14974
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 contract
Run am yourself

The 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.

QueryUS stock market holidays and early closes wey dey come, from exchange calendar
holiday dateweekdayholidayday statusearly close etdays away
2026-11-26ThuThanksgivingclosed40
2026-11-27FriThanksgivingearly-close01:00 PM41
2026-12-24ThuChristmasearly-close01:00 PM68
2026-12-25FriChristmasclosed69
2027-01-01FriNew Years Dayclosed76
2027-01-18MonMartin Luther King, Jr. Dayclosed93
2027-02-15MonWashington's Birthdayclosed121
2027-03-26FriGood Fridayclosed160
2027-05-31MonMemorial Dayclosed226
2027-06-18FriJuneteenthclosed244
2027-07-05MonIndependence Dayclosed261
2027-09-06MonLabor Dayclosed324
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 date
Run am yourself

The 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.

QueryThe latest early-close session for SPY, wey dem split by session window
session dateweekdaymorning session barslast bar etlast bar minute of daytotal shares mpremarket pctregular pctpost close 30min pctevening pctfirst 30min pctlast 30min pctclose minus open pct
2025-12-24Wednesday21016:59101939.91.289.67.81.410.924.213.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 t
Run am yourself

Full-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.

QuerySPY volume by half hour for early-close session, from premarket reach shortened after-hours (ET clock)
26 rows (showing 20)
et half hourshares m
04:000.03
04:300
05:000.01
05:300.01
06:000.01
06:300.01
07:000.05
07:300.03
08:000.1
08:300.11
09:000.13
09:304.36
10:003.84
10:303.46
11:004.98
11:303.79
12:005.69
12:309.66
13:003.11
13:300.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_hour
Run am yourself

Volume 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:

QueryTrading sessions for the past year, counted from SPY tape
trading daysfull length sessionsshortened sessionsirregular sessionsweekend sessionsfirst sessionlast session
2532512002025-10-132026-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
)
Run am yourself

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.

#market hours#sessions#trading calendar