volume_by_ict_hour
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-10-05, from us-stock-market-hours-vietnam-time.
| ict_time | et_time | avg_volume_mil | pct_of_day | sessions_counted |
|---|---|---|---|---|
| 15:00 | 04:00 | 0.1 | 0.22 | 21 |
| 16:00 | 05:00 | 0.04 | 0.1 | 21 |
| 17:00 | 06:00 | 0.07 | 0.16 | 21 |
| 18:00 | 07:00 | 0.2 | 0.48 | 21 |
| 19:00 | 08:00 | 0.44 | 1.03 | 21 |
| 20:00 | 09:00 | 4.12 | 9.64 | 21 |
| 21:00 | 10:00 | 5.22 | 12.22 | 21 |
| 22:00 | 11:00 | 4.81 | 11.27 | 21 |
| 23:00 | 12:00 | 3.27 | 7.65 | 21 |
| 00:00 | 13:00 | 2.93 | 6.86 | 21 |
| 01:00 | 14:00 | 4.32 | 10.12 | 21 |
| 02:00 | 15:00 | 10.78 | 25.25 | 21 |
| 03:00 | 16:00 | 5.88 | 13.77 | 21 |
| 04:00 | 17:00 | 0.36 | 0.85 | 21 |
| 05:00 | 18:00 | 0.12 | 0.29 | 21 |
| 06:00 | 19:00 | 0.04 | 0.09 | 21 |
- Rows × columns
- 16 × 5
- 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 |
|---|---|---|---|
ict_time |
text | 16 distinct values (00:00, 01:00, 02:00…) | |
et_time |
text | 16 distinct values (04:00, 05:00, 06:00…) | |
avg_volume_mil |
number | 0.04 to 10.78 | count |
pct_of_day |
number | 0.09 to 25.25 | percent |
sessions_counted |
number | every row is 21 |
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.
WITH tape AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toHour(toTimeZone(window_start, 'America/New_York')) AS et_hour,
toHour(toTimeZone(window_start, 'Asia/Ho_Chi_Minh')) AS ict_hour,
toFloat64(volume) AS volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2026-09-01 04:00:00'
AND window_start < '2026-10-01 04:00:00'
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 240
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 1200
),
per_hour AS
(
SELECT
session_date,
et_hour,
ict_hour,
sum(volume) AS hour_volume
FROM tape
GROUP BY session_date, et_hour, ict_hour
)
SELECT
concat(if(ict_hour < 10, '0', ''), toString(ict_hour), ':00') AS ict_time,
concat(if(et_hour < 10, '0', ''), toString(et_hour), ':00') AS et_time,
round(avg(hour_volume) / 1e6, 2) AS avg_volume_mil,
round(100 * sum(hour_volume) / any(day_total.all_volume), 2) AS pct_of_day,
count() AS sessions_counted
FROM per_hour
CROSS JOIN (SELECT sum(hour_volume) AS all_volume FROM per_hour) AS day_total
GROUP BY ict_time, et_time, et_hour
ORDER BY et_hour
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.