gap_buckets
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-09, from day-trading-strategies-explained.
| gap_bucket | sessions | median_rvol | median_range_pct |
|---|---|---|---|
| under 0.5% | 1043 | 0.89 | 1.68 |
| 0.5% to 1% | 485 | 0.92 | 2.08 |
| 1% to 2% | 317 | 0.97 | 2.63 |
| 2% to 4% | 142 | 0.97 | 3.56 |
| 4% and up | 45 | 1.38 | 5.2 |
- Rows × columns
- 5 × 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 |
|---|---|---|---|
gap_bucket |
text | 5 distinct values (0.5% to 1%, 1% to 2%, 2% to 4%…) | |
sessions |
number | 45 to 1,043 | |
median_rvol |
number | 0.89 to 1.38 | |
median_range_pct |
number | 1.68 to 5.2 | 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.
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 dedup AS (
SELECT
ticker,
date,
toFloat64(any(open)) AS o,
toFloat64(any(close)) AS c,
toFloat64(any(high)) AS h,
toFloat64(any(low)) AS l,
toFloat64(max(volume)) AS vol
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'AMD', 'F', 'T')
AND date >= today() - 420
AND date < today()
GROUP BY ticker, date
),
windowed AS (
SELECT
ticker,
date,
o, c, h, l, vol,
lagInFrame(c, 1) OVER (
PARTITION BY ticker ORDER BY date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS prev_close,
avg(vol) OVER (
PARTITION BY ticker ORDER BY date
ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING
) AS base_vol
FROM dedup
),
gaps AS (
SELECT
ticker,
date,
abs(o / prev_close - 1) * 100 AS gap_pct,
vol / base_vol AS rvol,
(h - l) / o * 100 AS range_pct
FROM windowed
WHERE prev_close > 0
AND base_vol > 0
AND o > 0
AND date >= today() - 370
)
SELECT
multiIf(gap_pct < 0.5, 'under 0.5%',
gap_pct < 1.0, '0.5% to 1%',
gap_pct < 2.0, '1% to 2%',
gap_pct < 4.0, '2% to 4%',
'4% and up') AS gap_bucket,
count() AS sessions,
round(quantileDeterministic(0.5)(rvol, cityHash64(ticker, date)), 2) AS median_rvol,
round(quantileDeterministic(0.5)(range_pct, cityHash64(ticker, date)), 2) AS median_range_pct
FROM gaps
GROUP BY gap_bucket
ORDER BY min(gap_pct)
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.