closure_window
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-22, from after-hours-trading-on-holidays-and-weekends.
| session_date | weekday | first_print_et_minute | last_print_et_minute | last_print_et |
|---|---|---|---|---|
| 2025-11-24 | Mon | 240 | 1199 | 19:59 |
| 2025-11-25 | Tue | 240 | 1199 | 19:59 |
| 2025-11-26 | Wed | 240 | 1139 | 18:59 |
| 2025-11-27 | Thu | 0 | 0 | no trading |
| 2025-11-28 | Fri | 240 | 1019 | 16:59 |
| 2025-11-29 | Sat | 0 | 0 | no trading |
| 2025-11-30 | Sun | 0 | 0 | no trading |
| 2025-12-01 | Mon | 240 | 1199 | 19:59 |
| 2025-12-02 | Tue | 240 | 1199 | 19:59 |
| 2025-12-03 | Wed | 240 | 1199 | 19:59 |
| 2025-12-04 | Thu | 240 | 1199 | 19:59 |
| 2025-12-05 | Fri | 240 | 1139 | 18:59 |
- Rows × columns
- 12 × 5
- Period covered
- to
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
session_date |
date | 2025-11-24 to 2025-12-05 | |
weekday |
text | 7 distinct values (Fri, Mon, Sat…) | |
first_print_et_minute |
number | 0 to 240 | |
last_print_et_minute |
number | 0 to 1,199 | |
last_print_et |
text | 4 distinct values (16:59, 18:59, 19:59…) |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
SELECT
toString(cal.day) AS session_date,
formatDateTime(cal.day, '%a') AS weekday,
toUInt32(ifNull(t.first_minute, 0)) AS first_print_et_minute,
toUInt32(ifNull(t.last_minute, 0)) AS last_print_et_minute,
if(last_print_et_minute = 0,
'no trading',
concat(leftPad(toString(intDiv(last_print_et_minute, 60)), 2, '0'), ':',
leftPad(toString(modulo(last_print_et_minute, 60)), 2, '0'))) AS last_print_et
FROM
(
SELECT toDate('2025-11-24') + arrayJoin(range(12)) AS day
) AS cal
LEFT JOIN
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
min(toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) AS first_minute,
max(toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) AS last_minute
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-11-24 00:00:00'
AND window_start < '2025-12-06 06:00:00'
GROUP BY d
) AS t ON t.d = cal.day
ORDER BY cal.day