Trading Calendar and Session Differences by Venue

Direct Answer

A trading calendar is not just a list of NYSE holidays. Each asset class, exchange, and broker-supported instrument has its own session structure, holiday schedule, and special trading day calendar. US equities observe NYSE holidays with early closes before Thanksgiving and on the day before Christmas when that day falls on a weekday. US equity futures (CME) have different holiday schedules than equities and also have daily settlement breaks that interrupt continuous trading. Crypto markets trade 24/7/365 but may have platform-level maintenance windows. European equities observe local national holidays that US traders frequently forget to account for.

An automated trading system that doesn't maintain an accurate, per-venue trading calendar will attempt to trade on market close days, will fail to understand why its MOO (market-on-open) orders are being rejected at 9:28 ET on an early-close day, and will miscalculate signal expiry windows that depend on knowing the next valid trading session. The calendar layer must be a first-class component of your integration, not a hardcoded list of holidays that becomes stale and wrong within one calendar year.

Key Takeaways

  • Each venue has its own calendar: NYSE, NASDAQ, CME Globex, CBOE, LSE, TSX, and crypto exchanges each maintain separate holiday and session schedules. A multi-asset system needs one calendar per venue.
  • Early-close days are not full holidays: US equities close at 13:00 ET (not 16:00 ET) the day after Thanksgiving and December 24 when that date falls on a weekday. MOC and LOC orders are handled at 13:00, not 16:00. Strategies that compute session length will get it wrong without explicit early-close handling.
  • Futures have daily settlement breaks: CME Globex equity futures (ES, NQ, RTY) have a daily maintenance break from 17:00-18:00 ET. Crypto futures on CME have weekly maintenance windows. Orders cannot be submitted during these breaks.
  • Query broker calendar APIs. Don't hardcode: Most brokers provide a calendar endpoint that returns open/closed status and session hours for a given date. Use this rather than maintaining your own holiday list.
  • GTC orders and holidays interact: DAY orders submitted before a holiday close are canceled by end of session. GTC orders persist through the holiday and are working again when the market reopens.
  • Crypto "always-on" has maintenance exceptions: Major crypto exchanges (Coinbase, Binance, Kraken) have periodic maintenance windows of 5-60 minutes during which trading halts. These are not published in advance on a consistent calendar.
  • Extended hours have their own effective calendar: Pre-market and after-hours trading happen on days when the regular session is open, but on early-close days, after-hours trading may not be available or may be shortened. Verify with your broker.
  • Holidays affect settlement, not just trading: When a holiday falls between a trade date and its settlement date, settlement is pushed to the next business day. T+1 settlement for a trade placed on Wednesday before a Thursday holiday settles Friday, not Thursday.

Core Concepts

US Equity and Options Calendar

NYSE and NASDAQ observe the same federal holidays for equity trading: New Year's Day, Martin Luther King Jr. Day (third Monday in January), Presidents' Day (third Monday in February), Good Friday, Memorial Day (last Monday in May), Juneteenth (June 19), Independence Day (July 4), Labor Day (first Monday in September), Thanksgiving (fourth Thursday in November), and Christmas Day (December 25). When a holiday falls on Saturday, the Friday before is the observed market holiday. When it falls on Sunday, the Monday after is the observed holiday.

Early-close days for US equities are: the Friday after Thanksgiving (13:00 ET close) and December 24 if that date falls on a Monday through Thursday (13:00 ET close). On early-close days, the MOC (market-on-close) and LOC (limit-on-close) order cutoff is at 13:00 ET, not 16:00 ET. Options chains also expire differently on early-close days: weeklies expiring on an early-close day settle at 13:00 ET, which affects options strategies timed to close near the regular session end.

US equity options (CBOE) follow the same holiday schedule as equities but have additional complexity for Friday expirations: third-Friday monthly expirations for standard SPX index options settle on the opening price of the Friday session (AM settlement), while weekly SPX expirations and all SPY expirations settle on the Friday close (PM settlement). Strategies involving these options need the calendar to distinguish AM vs. PM settlement dates.

Implement the calendar as a data-driven module: a JSON or database record per date per venue, with fields for open time, close time, is_holiday (boolean), is_early_close (boolean), and early_close_time. Derive the next-session and previous-session functions from this record rather than implementing calendar arithmetic manually. Source the data from the broker's calendar API (Alpaca, for example, provides GET /v2/calendar returning session open/close times per date) and refresh it periodically, at minimum once at system startup each trading day.

Futures Trading Session Structure

Equity futures on CME Globex (ES, NQ, YM, RTY) trade nearly continuously from Sunday 18:00 ET to Friday 17:00 ET. The only regular break is a daily maintenance window from 17:00-18:00 ET Monday through Thursday. Outside of this break, order submission is possible 23 hours per day on trading days. This schedule is fundamentally different from regular equity trading and requires separate calendar logic for futures-specific signals.

CME futures have specific contract expiration dates (quarterly: March, June, September, December, the third Friday of each expiration month) and futures roll periods (typically 8-10 days before expiration when volume migrates from the front month to the next month). A strategy trading the "front-month" contract needs to roll to the next contract around expiration to avoid taking delivery (for physically-settled contracts) or holding through expiration pricing mechanics (for cash-settled contracts like ES).

Treasury futures (ZN, ZB, ZF) and commodity futures each have their own holiday schedules and maintenance breaks that may differ from equity futures. CME publishes a full exchange calendar at cmegroup.com. For a system trading multiple futures products, query the product-level trading hours from your broker's API or CME's product specification tables and store them per-product in your calendar data.

Test your futures calendar by checking that your system does not attempt order submissions during the 17:00-18:00 ET maintenance window. Schedule a test that submits a dummy order at 17:01 ET and verifies the adapter rejects it as outside session hours. Also verify that orders submitted at 17:59 ET (just before the break ends) are correctly queued or rejected rather than submitted into the break window.

International Venue Calendar Differences

If your strategy trades international equities or ETFs with significant international exposure, local holidays become relevant. The London Stock Exchange (LSE) observes UK public holidays: Good Friday, Easter Monday, Early May Bank Holiday (first Monday in May), Spring Bank Holiday (last Monday in May), Summer Bank Holiday (last Monday in August), Christmas Day, and Boxing Day (December 26). US traders often miss Easter Monday and Boxing Day, which are not US holidays.

The Tokyo Stock Exchange (TSE) observes Japanese public holidays, which include unique dates not present in Western calendars: Coming of Age Day (second Monday in January), Marine Day (third Monday in July), Mountain Day (August 11), and Health-Sports Day (second Monday in October). TSE also has an unusual custom of marking the first and last trading days of the calendar year as shortened sessions in some years.

European equity futures on Eurex follow a mixed calendar: German national holidays affect the Frankfurt-listed contracts, while pan-European indices observe a core set of common holidays. If your system hedges international equity exposure using local ETFs (EWJ for Japan, EWU for UK, EWG for Germany), those ETFs trade on US exchanges and follow NYSE hours, but their underlying markets are closed on their local holidays, which causes liquidity reductions and tracking error spikes.

Source international calendar data from exchange-published holiday lists (available on each exchange's website and through data vendors like Refinitiv, Bloomberg, and open-source projects like pandas-market-calendars or exchange-calendars in Python). Automate calendar updates annually, not on demand, exchange holiday announcements for the following year are typically published in September or October of the current year.

Broker-Specific Session Handling and Calendar APIs

Different brokers expose calendar information differently. Alpaca provides a GET /v2/calendar?start=YYYY-MM-DD&end=YYYY-MM-DD endpoint returning an array of trading days with open and close times. A date absent from the array is a holiday. This is the simplest and most reliable way to maintain an accurate calendar, it's sourced from the same system that enforces the session on the broker's side.

Interactive Brokers surfaces trading hours through the TWS API's reqContractDetails callback, which includes a tradingHours string per contract listing the session times and holiday dates for that specific instrument. This is particularly useful for multi-asset portfolios because it gives per-contract session information, accounting for the fact that different contracts on IBKR may have different brokerages or exchange connections with slightly different session windows.

Coinbase, Kraken, and Binance don't publish formal calendar APIs because crypto trades continuously, but they do post maintenance notices on their status pages (status.coinbase.com, status.kraken.com). Monitoring these status pages via their APIs allows your system to detect planned maintenance before it happens and enter a defensive state (halt new orders, close positions if strategy requires it) rather than discovering the outage through failed API calls.

Build your calendar module to abstract the data source: a CalendarService interface with a method isMarketOpen(venue, timestamp): boolean and nextSessionOpen(venue, timestamp): DateTime. Concrete implementations query specific broker APIs or local cached data. Test the interface thoroughly with dates around known holidays, including the edge cases of early-close days and the maintenance break windows for futures.

Worked Scenario

  1. Scenario setup. It's the Friday after Thanksgiving. Your system starts at 09:30 ET and begins normal operations. It has one GTC limit sell order for AAPL at $195 that it placed Monday.
  2. Calendar check. Your calendar module queries the broker's calendar endpoint for the current date. The response shows close_time = 13:00 ET for this date (early-close day). The module sets an early-close flag and schedules a pre-close alert for 12:45 ET.
  3. MOC order rejected at 13:00 strategy fire. Your strategy fires a signal at 12:55 ET to add a MOC sell for 50 shares of SPY. Your calendar module checks: is it within 5 minutes of the actual close (13:00 ET on this early-close day)? Yes. The order is rejected at the adapter boundary with a clear message: "MOC orders not accepted within 5 minutes of session close."
  4. GTC order persists through weekend. Markets close at 13:00 ET. Your GTC AAPL sell order remains working. The system processes end-of-day reconciliation, confirming the order is still open at the broker.
  5. Incorrect system (no calendar awareness). A system without calendar awareness believes the close is 16:00 ET. It submits a MOC order at 12:55 ET and receives an error from the broker (it's already past the MOC cutoff at 13:00). It logs the error and spends 3 hours retrying until it times out, never realizing the market closed at 13:00.

Measurement Framework

MeasurementQuestion to Answer
Out-of-session order rejectionsHow many order submissions are rejected by the broker because the system attempted submission outside session hours?
Calendar cache staleness (days)How old is the system's calendar data, and does it cover the full remaining calendar year?
Early-close days correctly handledOn early-close days, did the system update session-end behavior to use the early-close time?
Unexpected holiday order rejectionsDid any orders fail because the system attempted to trade on a day the calendar indicated as open but was actually a holiday?
Roll date accuracy (futures)Were futures roll signals executed on the correct days relative to expiration, without the system attempting to hold an expiring contract to delivery?

Common Failure Modes

Hardcoded Holiday List Not Updated Annually

A system that hardcodes a holiday list for a specific year will operate incorrectly from January 1 of the next year. Martin Luther King Jr. Day falls on a different Monday each year; Presidents' Day, Memorial Day, Labor Day, and Thanksgiving similarly shift. A static 2025 holiday list will generate wrong results for 2026. Any system that uses a hardcoded list needs an annual update process, and the process needs to happen before January 1, not in response to a production failure on the first trading day of the year.

Flat lay of electronic devices and financial documents showcasing digital currency analysis.
Photo by Leeloo The First via Pexels

Use a calendar API or a maintained open-source calendar library. Both pandas-market-calendars (Python) and exchange-calendars provide regularly updated calendars for major exchanges and are maintained by the community. Check the library's last update date before depending on it for the current year's trading.

Missing Early-Close Detection for MOC/LOC Orders

A MOC or LOC order submitted after 13:00 ET on an early-close day is rejected by the exchange because the closing auction already occurred at 13:00. If your system's session logic only checks the regular 16:00 ET close, it will attempt to submit MOC orders right up to what it believes is the 15:50 ET cutoff, but on an early-close day, those submissions fail starting at 12:50 ET (10 minutes before the 13:00 early close).

Store early-close times explicitly in the calendar and check them before computing MOC/LOC order cutoffs. The cutoff for MOC submission is typically the close time minus 10 minutes, not a fixed time. Make the cutoff a function of the calendar-reported close time, not a hardcoded 15:50 ET constant.

Forgetting the 17:00-18:00 ET Futures Maintenance Break

A futures strategy that evaluates signals on a rolling basis and attempts to submit orders at 17:15 ET will receive rejections during the CME Globex maintenance break. If the retry logic doesn't recognize the maintenance break as expected behavior, it will retry the order repeatedly for 45 minutes, generating alerts and consuming rate-limit budget, before the market reopens at 18:00 ET.

Include futures maintenance breaks in your calendar module's isMarketOpen function. The break is deterministic (17:00-18:00 ET, Monday, Thursday for Globex equity futures) and can be hardcoded into the calendar module as a structured session definition. When isMarketOpen returns false for a maintenance break, the adapter should queue the order for submission at the next session open, not retry immediately.

Incorrect Settlement Date Calculation Around Holidays

A strategy that calculates settlement dates for tax-lot purposes or for cash-account free-ride prevention must add business days, not calendar days, to the trade date, and must skip holidays in the count. A trade on Wednesday before a Thursday holiday settles Friday (T+1 with the holiday excluded), not Thursday. A system that naively computes T+1 as trade_date + 1 calendar day will compute Thursday as the settlement date, which is wrong.

Implement settlement date calculation as a business-day-aware function that uses the same calendar data to skip holidays. Add explicit tests: a Wednesday trade before a Thursday holiday should settle Friday. A Monday trade should settle Tuesday (not Wednesday, even if Tuesday is the next calendar day after a theoretical weekend). The NYSE settlement calendar and the broker's own settlement calendar should agree; verify this for a sample of real trades.

FAQ

How do I get an authoritative trading calendar for US equities?

The most reliable source for an automated system is your broker's calendar API. Alpaca provides GET /v2/calendar with open and close times per day. Interactive Brokers exposes trading hours through reqContractDetails. As a secondary source, the NYSE publishes its holiday schedule annually at nyse.com, and the open-source pandas-market-calendars library (GitHub: rsheftel/pandas_market_calendars) maintains calendars for NYSE, NASDAQ, CME, and many international exchanges.

What are the early-close days for US equities in 2026?

In 2026, the day after Thanksgiving falls on Friday, November 27 (early close at 13:00 ET). Christmas Eve is Thursday, December 24 (early close at 13:00 ET). These are the standard early-close days for NYSE and NASDAQ equities. Check the NYSE's published schedule each year, as special circumstances (national day of mourning, emergency declarations) can create additional early-close or closed days not predictable in advance.

Does crypto truly trade 24/7 with no interruptions?

Spot crypto on most major exchanges trades continuously, but planned and unplanned maintenance interruptions do occur. Coinbase publishes planned maintenance to status.coinbase.com; Binance has similarly published maintenance windows, typically 1-4 hours on weekend nights. CME Bitcoin futures follow a schedule similar to other CME Globex products with the 17:00-18:00 ET daily break and holiday closures on US market holidays. For an automated system treating crypto as truly 24/7, monitoring the exchange's status API and handling temporary trading halts gracefully is necessary.

How do time zones affect my trading calendar implementation?

Internally, store all times in UTC. Convert to local exchange time only for display and for the specific comparison against exchange session hours. The most common bug is storing a session open time as a naive datetime and forgetting to apply EST/EDT depending on whether daylight saving time is active. The US switches between EST (UTC-5) and EDT (UTC-4) in March and November. Always use a time zone-aware library (e.g., Python's pytz or zoneinfo, JavaScript's Intl.DateTimeFormat) and store session boundaries in UTC to avoid ambiguity.

What happens to open orders when the market is closed for a holiday?

DAY orders are canceled at the end of the last trading session before the holiday, they don't persist into the holiday. GTC orders persist through the holiday and are working when the market reopens. Check with your specific broker because some brokers automatically cancel GTC orders as part of their holiday processing even though standard GTC behavior would keep them alive, this varies by broker and is discoverable only empirically or through the broker's support documentation.

How do I handle DST (Daylight Saving Time) transitions in my calendar?

Always express session times as local exchange time zone strings rather than UTC offsets, and let your time zone library handle the UTC conversion. NYSE regular session: 09:30-16:00 America/New_York. When you convert "09:30 America/New_York" to UTC in March (EDT, UTC-4), you get 13:30 UTC. In November (EST, UTC-5), the same "09:30 America/New_York" converts to 14:30 UTC. Using a proper time zone library handles this automatically; using a fixed UTC offset of -5 hours fails twice per year when the clock changes.

Does the futures calendar roll affect which contract the adapter should route orders to?

Yes, and this is a common source of subtle errors. When the front-month futures contract approaches expiration (typically within 8-10 days), volume migrates to the next-month contract. A strategy targeting the most-liquid front-month contract needs to roll its open position and update its symbol reference from the expiring contract (e.g., ESZ26, December 2026) to the next contract (ESH27, March 2027). The adapter's symbol translation must handle this roll: either by accepting a generic "ES front-month" identifier and mapping it to the specific active contract, or by receiving explicit roll instructions from the strategy. Document which approach your system uses and test it against a simulated expiration event.

How do I handle an unexpected market halt or trading suspension?

Market-wide circuit breakers halt all US equity trading when the S&P 500 declines 7%, 13%, or 20% from the prior day's close (triggering 15-minute, 15-minute, and all-day halts respectively). Individual stocks can be halted for regulatory filings, circuit breaker triggers (LULD, Limit Up/Limit Down), or exchange-initiated news halts. Your adapter should interpret order rejections with halt-related error codes (most brokers return a specific error code for a halted symbol) as a non-retryable state. Alert on halt events and halt automated trading in the affected symbol until the halt is lifted, verifying resumption through the broker's symbol status API or position updates before restarting.

How should a shortened session affect scheduled jobs such as end-of-day reconciliation?

Jobs anchored to a fixed wall-clock time run at the wrong point relative to the market on an early-close day, either before the close on a normal day or long after it on a short one. Anchoring them to calendar events instead, meaning a defined offset from the actual session close for that date, keeps the sequence correct. The same applies to snapshot capture and to any limit that resets daily, since a reset tied to the wrong boundary can leave a strategy trading with yesterday counters.

References

Educational Disclaimer

This guide is for educational and informational purposes only. Trading calendars, session hours, and holiday schedules change each year and may be modified on short notice by exchanges or regulators. Always verify current calendar information against official exchange publications before trading.