volume_curve
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-17, from twap-vs-vwap-vs-pov-orders.
| et_time | avg_volume_millions | vwap_share_pct | twap_share_pct |
|---|---|---|---|
| 09:30 | 4.61 | 11.37 | 7.69 |
| 10:00 | 3.33 | 8.22 | 7.69 |
| 10:30 | 2.79 | 6.88 | 7.69 |
| 11:00 | 2.47 | 6.08 | 7.69 |
| 11:30 | 2.48 | 6.12 | 7.69 |
| 12:00 | 2.2 | 5.42 | 7.69 |
| 12:30 | 1.97 | 4.85 | 7.69 |
| 13:00 | 2.04 | 5.04 | 7.69 |
| 13:30 | 1.87 | 4.61 | 7.69 |
| 14:00 | 2.28 | 5.63 | 7.69 |
| 14:30 | 2.46 | 6.07 | 7.69 |
| 15:00 | 3.14 | 7.76 | 7.69 |
| 15:30 | 8.9 | 21.96 | 7.69 |
- Rows × columns
- 13 × 4
- 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 |
|---|---|---|---|
et_time |
text | 13 distinct values (09:30, 10:00, 10:30…) | |
avg_volume_millions |
number | 1.87 to 8.9 | count |
vwap_share_pct |
number | 4.61 to 21.96 | percent |
twap_share_pct |
number | every row is 7.69 | percent |
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.
the exact SQL behind every number
WITH bars AS
(
SELECT
toTimeZone(window_start, 'America/New_York') AS et,
toHour(et) * 60 + toMinute(et) AS minute_of_day,
toDate(et) AS et_date,
toFloat64(volume) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-06-01 00:00:00', 'UTC')
AND window_start < toDateTime('2026-09-01 00:00:00', 'UTC')
),
per_bucket AS
(
SELECT
formatDateTime(toStartOfInterval(et, INTERVAL 30 MINUTE), '%H:%i', 'America/New_York') AS et_time,
sum(shares) AS bucket_shares,
countDistinct(et_date) AS sessions
FROM bars
WHERE minute_of_day >= 570
AND minute_of_day < 960
GROUP BY et_time
)
SELECT
b.et_time AS et_time,
round(b.bucket_shares / b.sessions / 1e6, 2) AS avg_volume_millions,
round(100 * b.bucket_shares / t.window_shares, 2) AS vwap_share_pct,
round(100 / t.bucket_count, 2) AS twap_share_pct
FROM per_bucket AS b
CROSS JOIN
(
SELECT
sum(bucket_shares) AS window_shares,
count() AS bucket_count
FROM per_bucket
) AS t
ORDER BY et_time
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
More from this analysistwap-vs-vwap-vs-pov-orders
lunch_pov
series 13×4
→
curve_dispersion
series 13×4
→
open_vs_lunch
table 5×6
→
One SPY $600 LEAPS call's price over two years (expired Jan 16 2026)
series 470×2
→
monthly
series 241×4
→
2s10s spread, monthly average: last 20 years
series 240×2
→
See all 2,309 queries →