STRASMORE/EXPLORE 3,094 QUERIES

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.

as of series 16×5read in context →
volume_by_ict_hour — 16 rows by 5 columns, computed from US exchange, SIP and OPRA data.
ict_timeet_timeavg_volume_milpct_of_daysessions_counted
15:0004:000.10.2221
16:0005:000.040.121
17:0006:000.070.1621
18:0007:000.20.4821
19:0008:000.441.0321
20:0009:004.129.6421
21:0010:005.2212.2221
22:0011:004.8111.2721
23:0012:003.277.6521
00:0013:002.936.8621
01:0014:004.3210.1221
02:0015:0010.7825.2521
03:0016:005.8813.7721
04:0017:000.360.8521
05:0018:000.120.2921
06:0019:000.040.0921
Rows × columns
16 × 5
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for volume_by_ict_hour, derived from the stored result.
ColumnTypeRangeNotes
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
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.