Strasmore Research
Learn 2026-07-04

Market Holidays and Early Closes: Verify, Don't Assume

Ten US market holidays a year, a few 1pm early closes, and weekend-shift rules — verified from calendar AND tape, with July 3, 2026 as the worked example.

When is the stock market closed? The honest answer for anyone working with market data: whenever the exchange calendar AND the tape both say so — never when you assume. US equity markets observe about ten holidays a year, plus a handful of 1:00 pm ET early closes, and when a holiday lands on a Saturday the market takes the Friday before off. That last rule just produced a four-day trading week: July 4, 2026 fell on a Saturday, so the market closed Friday July 3 in full.

The receipt: July 3, 2026 was a full closure

QueryJuly 3, 2026 in the exchange calendar and on the tape
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = toDate('2026-07-03')) AS calendar_rows,
    (SELECT any(status) FROM global_markets.stocks_market_holidays WHERE date = toDate('2026-07-03')) AS status,
    (SELECT any(name) FROM global_markets.stocks_market_holidays WHERE date = toDate('2026-07-03')) AS holiday_name,
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-07-03 00:00:00') AND window_start < toDateTime('2026-07-04 00:00:00')) AS spy_bars_jul3,
    (SELECT countIf((toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-29 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')) AS regular_bars_that_week

Two independent checks agree: the calendar carries {q:jul3_receipt:calendar_rows} exchange rows for July 3 with status "{q:jul3_receipt:status}" ({q:jul3_receipt:holiday_name}), and the tape shows {q:jul3_receipt:spy_bars_jul3} SPY bars that day — against {q:jul3_receipt:regular_bars_that_week} regular-session bars across the week's four traded days, exactly four full 390-minute sessions. Not an early close: a closure. The week's recap covers what those four sessions did.

Closed vs early close: the two statuses

QueryThe remaining 2026 closure calendar: full closures and 1pm early closes
The exact SQL behind every number
SELECT toString(date) AS d, any(name) AS holiday, any(status) AS status, count() AS exchange_rows
FROM global_markets.stocks_market_holidays
WHERE date >= toDate('2026-07-03') AND date <= toDate('2026-12-31')
GROUP BY date
ORDER BY date

The second half of 2026 holds {q:closures_2026h2:row_count} calendar events, and the status column carries the distinction that matters for any intraday number: a "closed" day has no session at all, while an "early-close" day (the Friday after Thanksgiving, Christmas Eve) runs a shortened session that typically ends at 1:00 pm ET. A volume or closing-price calculation that assumes a 4:00 pm close on an early-close day is quietly wrong — the session bounds have to come from the calendar, not from habit.

When the calendar can't tell you: verify from the tape

QueryJuneteenth 2026: absent from this calendar's rows, visible in the tape
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.stocks_market_holidays WHERE date = toDate('2026-06-19')) AS calendar_rows_jun19,
    (SELECT toString(min(date)) FROM global_markets.stocks_market_holidays WHERE date >= toDate('2026-01-01')) AS calendar_first_date,
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-19 00:00:00') AND window_start < toDateTime('2026-06-20 00:00:00')) AS spy_bars_jun19,
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-18 00:00:00') AND window_start < toDateTime('2026-06-19 00:00:00')) AS spy_bars_jun18

Calendars have edges. This one's rows begin at {q:juneteenth_receipt:calendar_first_date} — so Juneteenth (June 19, 2026), a full market holiday, shows {q:juneteenth_receipt:calendar_rows_jun19} calendar rows here. The tape still tells the truth: {q:juneteenth_receipt:spy_bars_jun19} SPY bars on June 19 against {q:juneteenth_receipt:spy_bars_jun18} the day before. The working rule: the calendar is the first check, observed bars are the second, and a session only counts when both agree.

FAQ

Why does a Saturday holiday close the market on Friday?

Exchange rules observe fixed-date holidays on the nearest weekday: a Saturday holiday moves to Friday, a Sunday holiday to Monday. July 4, 2026 (Saturday) was observed Friday July 3.

How early is an early close?

US equities typically close at 1:00 pm ET on early-close days, with the shortened session's official close computed then — any "closing price" logic has to follow the real bounds.

How many sessions are in a year?

Roughly 250–253 — but the honest way to know a period's session count is to count distinct trading days in the data, the way the June recap verifies its 21.

Want to check a date yourself? Both panels above are one query each on the Strasmore terminal.