curve_dispersion
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 | median_share_pct | lowest_share_pct | highest_share_pct |
|---|---|---|---|
| 09:30 | 11.51 | 6.34 | 17.14 |
| 10:00 | 7.9 | 4.55 | 13.14 |
| 10:30 | 6.79 | 3.25 | 14.21 |
| 11:00 | 5.94 | 2.89 | 11.67 |
| 11:30 | 5.53 | 2.6 | 23.55 |
| 12:00 | 5.06 | 1.8 | 10.68 |
| 12:30 | 4.3 | 2.03 | 12.03 |
| 13:00 | 4.75 | 2.63 | 8.85 |
| 13:30 | 4.25 | 2.51 | 11.9 |
| 14:00 | 5.4 | 3.1 | 11.98 |
| 14:30 | 5.42 | 3.85 | 12.79 |
| 15:00 | 7.6 | 4.06 | 13.06 |
| 15:30 | 21.32 | 14.21 | 36.6 |
- 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…) | |
median_share_pct |
number | 4.25 to 21.32 | percent |
lowest_share_pct |
number | 1.8 to 14.21 | percent |
highest_share_pct |
number | 8.85 to 36.6 | 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
et_date,
formatDateTime(toStartOfInterval(et, INTERVAL 30 MINUTE), '%H:%i', 'America/New_York') AS et_time,
sum(shares) AS bucket_shares
FROM bars
WHERE minute_of_day >= 570
AND minute_of_day < 960
GROUP BY et_date, et_time
),
per_day AS
(
SELECT
et_date,
sum(bucket_shares) AS day_shares
FROM per_bucket
GROUP BY et_date
)
SELECT
b.et_time AS et_time,
round(100 * quantileDeterministic(0.5)(b.bucket_shares / d.day_shares, toYYYYMMDD(b.et_date)), 2) AS median_share_pct,
round(100 * min(b.bucket_shares / d.day_shares), 2) AS lowest_share_pct,
round(100 * max(b.bucket_shares / d.day_shares), 2) AS highest_share_pct
FROM per_bucket AS b
INNER JOIN per_day AS d ON d.et_date = b.et_date
GROUP BY et_time
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
volume_curve
series 13×4
→
lunch_pov
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 →