Wetin be RVOL (relative volume) and how to read am
RVOL na stock volume wey dem divide by im 20-day average. Above 1 mean trading busy pass normal. We still dey look intraday time-of-day RVOL and wetin dem count as high.
Relative volume (RVOL) dey measure how busy one stock dey trade if you compare am with im own recent normal: na di session share volume wey dem divide by di stock average daily volume, wey dem usually take from di last 20 sessions. RVOL wey be 1 na ordinary day, 2 mean say twice di usual shares change hand, and 0.5 mark session wey dey run for half speed. Every figure for dis page dem measure am from minute-level US market data, with di exact query wey dem attach to each panel.
Wetin be relative volume? Meaning wey plain
Raw volume no mean much by imself: five million shares fit be quiet day for mega-cap, but for small-cap e fit be event wey dey happen once a year. Relative volume dey compare am directly to di stock own normal level:
RVOL = di volume for today ÷ di stock average daily volume (normally di last 20 sessions)
One example wey we dey imagine: stock wey dey average 10 million shares per day and print 25 million by di close end with RVOL of 2.5. (A print na trade wey dem report to di consolidated tape — di market-wide record of executions — and "di tape" na trader shorthand for dat record.) Di 20-session lookback na convention — platforms still dey use 10, 30, or 50 days; e roughly be one calendar month of trading. Di window still carry di exchange calendar own wahala: holiday half-day dey add only fraction of normal session volume to di average, and market holidays and early closes dey show where dem land.
Why traders dey watch relative volume
RVOL na gauge wey show participation, no be direction gauge. Days wey RVOL high dey cluster around events wey you fit identify — earnings, index additions, headline news. Price move wey print for heavy volume get crowd behind am; di same move for RVOL of 0.3 fit be work of just handful of orders. Activity still dey travel with tradability: across stocks, di names wey dem trade least get di widest bid-ask spreads, wey di market makers wey dey quote both sides all day post, and for any one stock, quotes tend to sit somehow wider for im quietest sessions dan for im busiest. (Volume still dey underpin VWAP, di volume-weighted average price — di other big volume-based reference.)
How to calculate relative volume — and the time-of-day trap
Di full-day calculation na just one division: di session total volume ÷ di 20-session average daily volume. E dey honest only after di close. Di trap na when you run am mid-session: by 10:30 a.m. di running total naturally be small fraction of any full-day figure, so even violent morning go read like say e dey sleep. Intraday volume dey follow U-shape across di clock, and any intraday RVOL gats start from dat shape.
Below na di shape, wey dem measure on SPY, di S&P 500 ETF: median shares wey dem trade per minute for each 30-minute clock bucket over di last 30 days of completed sessions, extended hours dey inside (4:00 a.m. to 8:00 p.m. Eastern Time).
The exact SQL behind every number
SELECT formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(quantileDeterministic(0.5)(toFloat64(volume), toUInt64(toUnixTimestamp(window_start))) / 1000, 1) AS median_minute_volume_k
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= now() - INTERVAL 30 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))
GROUP BY et_time
HAVING et_time >= '04:00' AND et_time < '20:00'
ORDER BY et_timeDi 9:30 bucket — di first half hour of regular trading — run median of 136 thousand shares per minute, against 3.5 thousand for di 9:00 premarket bucket just before am. Di pace thin go 49.5 thousand for di 12:30 bucket, den e build into di close: 168.3 thousand for di 3:30 bucket, di run-up to di closing auction and well above di lunchtime trough. After di 4:00 p.m. bell di per-minute pace fall off cliff enter after-hours trading.
Intraday relative volume: adjust for time of day
Di fix dey change di denominator: compare today running total against di average running total for di same clock time. Dat one need make you sabi di share of normal day volume wey don already complete for each point on di clock — we measure am here on SPY last 20 sessions wey don finish:
The exact SQL behind every number
WITH per_min AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_min,
sum(toFloat64(volume)) AS v
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= now() - INTERVAL 45 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))
GROUP BY et_date, et_min
),
last20 AS (
SELECT DISTINCT et_date FROM per_min ORDER BY et_date DESC LIMIT 20
)
SELECT checkpoint AS et_checkpoint,
round(avg(share) * 100, 1) AS avg_pct_of_day_volume_done
FROM (
SELECT et_date,
checkpoint,
sumIf(v, et_min < checkpoint) / sum(v) AS share
FROM (
SELECT et_date, et_min, v, arrayJoin(['10:00', '12:00', '14:00', '15:30', '16:00']) AS checkpoint
FROM per_min
WHERE et_date IN (SELECT et_date FROM last20)
)
GROUP BY et_date, checkpoint
)
GROUP BY checkpoint
ORDER BY checkpointBy 10:00 a.m., half hour inside regular trading, SPY don typically print just 12.4% of im full-day volume wey go come later; by noon 34.8%, by 2:00 p.m. 51.1%, by 3:30 p.m. e still be only 67.3%. Even at di 4:00 p.m. closing bell di total stand at 85.7% — everi oda tin na im dem dey report at or after 16:00, and most of am land for di first minutes after di bell, wen di closing auction and oda end-of-day trades hit di tape; di after-hours session itself far thinner. Dat one align with di cliff for di chart up top: per-minute pace collapse at di bell even as meaningful slice of di day total still dey report. A time-adjusted morning RVOL divide today cumulative volume by di 20-day average wey dem multiply by di checkpoint share. One caveat: dis schedule na SPY own — each stock get im own clock, and di worked example wey dey below measure one name own.
One example wey work: one session wey volume heavy well-well (MU)
June 2026 na heavy month for Micron — the deep-dive for MU June 2026 dey show the full tape. Na the single session wey get the biggest volume for that month we dey show here, with the RVOL maths wey dem do both ways:
The exact SQL behind every number
WITH mu_daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sum(toFloat64(volume)) AS day_volume,
sumIf(toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '10:30') AS vol_by_1030
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= toDateTime('2026-04-15 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-01 00:00:00', 'America/New_York')
GROUP BY et_date
HAVING day_volume > 1000000
),
biggest AS (
SELECT et_date, day_volume, vol_by_1030
FROM mu_daily
WHERE et_date >= toDate('2026-06-01') AND et_date <= toDate('2026-06-30')
ORDER BY day_volume DESC
LIMIT 1
),
trailing AS (
SELECT sum(day_volume) / 20 AS adv, sum(vol_by_1030) / 20 AS avg_by_1030
FROM (
SELECT day_volume, vol_by_1030
FROM mu_daily
WHERE et_date < (SELECT et_date FROM biggest)
ORDER BY et_date DESC
LIMIT 20
)
)
SELECT formatDateTime((SELECT et_date FROM biggest), '%Y-%m-%d') AS session_date,
round((SELECT vol_by_1030 FROM biggest) / 1e6, 1) AS vol_by_1030_m,
round((SELECT avg_by_1030 FROM trailing) / 1e6, 1) AS avg_vol_by_1030_m,
round((SELECT vol_by_1030 FROM biggest) / (SELECT avg_by_1030 FROM trailing), 1) AS rvol_1030_adjusted,
round((SELECT vol_by_1030 FROM biggest) / (SELECT adv FROM trailing), 2) AS rvol_1030_naive,
round((SELECT day_volume FROM biggest) / 1e6, 1) AS session_volume_m,
round((SELECT adv FROM trailing) / 1e6, 1) AS trailing_adv_m,
round((SELECT day_volume FROM biggest) / (SELECT adv FROM trailing), 1) AS rvol_full_dayMU biggest session for the month land for 2026-06-25. By 10:30 a.m. that day, 32.8 million shares don trade, against an average of 17.3 million by the same clock time over the prior 20 sessions — na time-adjusted RVOL of 1.9. Divide that morning total by the full-day average of 51 million instead, and the naive reading na 0.64: e be like say the day dey below average, for one morning wey dey run close to twice im usual pace. The session finish at 77.2 million shares, na full-day RVOL of 1.5.
That closing figure fit look small next to screenshots of movers wey be ten times average — whether e truly small na question for distribution, wey dem go measure next.
Wetin dem call high relative volume?
For trading forums, dem dey throw around numbers like "RVOL wey pass 2 na high one." Dis na the correct version: full-day RVOL for every US-listed stock and ETF wey get 20-day average daily volume above 5 million shares (and full 20 past sessions of history), dem arrange am by percentile for the whole group based on the most recent session wey don finish for our data. One note about the label: the screen dey count shares, no be dollars, so dis high-volume group cover from mega-caps and ETFs go down to cheap, high-churn small-caps — high share volume no be the same thing as easy tradability.
The exact SQL behind every number
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
toFloat64(sum(volume)) AS day_volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 40 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))
GROUP BY ticker, et_date
),
spy_days AS (
SELECT et_date,
day_volume,
avg(day_volume) OVER (ORDER BY et_date ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS prior_avg
FROM daily
WHERE ticker = 'SPY' AND day_volume > 10000000
),
sessions AS (
SELECT et_date FROM spy_days
),
latest AS (
SELECT max(et_date) AS d FROM spy_days WHERE prior_avg > 0 AND day_volume >= 0.6 * prior_avg
),
prior20 AS (
SELECT et_date FROM sessions WHERE et_date < (SELECT d FROM latest) ORDER BY et_date DESC LIMIT 20
),
rvols AS (
SELECT ticker, day_vol / adv20 AS rvol
FROM (
SELECT ticker,
sumIf(day_volume, et_date = (SELECT d FROM latest)) AS day_vol,
sumIf(day_volume, et_date IN (SELECT et_date FROM prior20)) / 20 AS adv20,
countIf(day_volume > 0 AND et_date IN (SELECT et_date FROM prior20)) AS sessions_traded
FROM daily
WHERE ticker NOT IN ('SPCX')
GROUP BY ticker
HAVING adv20 > 5000000 AND day_vol > 0 AND sessions_traded = 20
)
)
SELECT pair.1 AS percentile,
round(pair.2, 2) AS rvol
FROM (
SELECT arrayJoin(arrayZip(['p10', 'p25', 'p50 (median)', 'p75', 'p90', 'p99'], quantilesExact(0.1, 0.25, 0.5, 0.75, 0.9, 0.99)(rvol))) AS pair
FROM rvols
)
ORDER BY percentileThe median name for dis high-volume group trade at 0.73 times im own 20-day average. Nine out of ten names dey below 1.37, and na only one in a hundred clear 4.71. Put MU session from the previous section against dis table, e go stop to look small — even busy names dey spend most days near dem own average; multiples of am dey rare.
The bottom tail matter too: the 10th percentile sit for 0.11. Readings wey low like dat dey usually mark stock wey im 20-day average still carry one big session — after spike, the inflated denominator go hold RVOL down for weeks. The window get memory, for both directions.
One caveat: dis na single session cross-section — percentiles dey shift day by day, and market-wide event days (index rebalances, option expirations) fit lift the whole curve.
Which stocks get unusual volume? Di RVOL leaderboard
Same universe, rank am (di standing weekly version dey for unusual volume stocks dis week): di ten highest full-day RVOL readings for di 2026-07-21 session among names wey dey average over 5 million shares a day — di board wey a screener go flag as unusual volume. Di screen need full 20 prior sessions — recent listings no get meaningful 20-day average and dem for just fill di board with artifacts.
The exact SQL behind every number
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
toFloat64(sum(volume)) AS day_volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 40 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))
GROUP BY ticker, et_date
),
spy_days AS (
SELECT et_date,
day_volume,
avg(day_volume) OVER (ORDER BY et_date ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS prior_avg
FROM daily
WHERE ticker = 'SPY' AND day_volume > 10000000
),
sessions AS (
SELECT et_date FROM spy_days
),
latest AS (
SELECT max(et_date) AS d FROM spy_days WHERE prior_avg > 0 AND day_volume >= 0.6 * prior_avg
),
prior20 AS (
SELECT et_date FROM sessions WHERE et_date < (SELECT d FROM latest) ORDER BY et_date DESC LIMIT 20
)
SELECT ticker,
formatDateTime((SELECT d FROM latest), '%Y-%m-%d') AS session_date,
round(day_vol / 1e6, 1) AS session_volume_m,
round(adv20 / 1e6, 1) AS adv_20d_m,
round(day_vol / adv20, 1) AS rvol
FROM (
SELECT ticker,
sumIf(day_volume, et_date = (SELECT d FROM latest)) AS day_vol,
sumIf(day_volume, et_date IN (SELECT et_date FROM prior20)) / 20 AS adv20,
countIf(day_volume > 0 AND et_date IN (SELECT et_date FROM prior20)) AS sessions_traded
FROM daily
WHERE ticker NOT IN ('SPCX')
GROUP BY ticker
HAVING adv20 > 5000000 AND day_vol > 0 AND sessions_traded = 20
)
ORDER BY rvol DESC, ticker
LIMIT 10Di top of di board, LBGJ, print 169.2 million shares against a 20-day average of 5.1 million — an RVOL of 33.3. Every row clear im own average. Boards like dis dey tilt away from household mega-caps — to double an already-enormous average need extraordinary number of shares, while a smaller name fit multiply im tape for one session.
Data notes: session selection and exclusions
Both ranked tables dey use di same universe and di same session rule. A candidate session only count as complete once SPY tape for dat date reach at least 60% of SPY own prior-20-session average volume — di newest day data dey arrive with lag, and dis check keep a partially loaded day from being read as a finished session. Both tables also exclude one symbol wey di exchanges recently reassign to a new listing: vendor feeds carry two different companies history under dat ticker, so im 20-day average no be a meaningful baseline. Di exclusion list for di SQL dey in sync with our symbol-identity checks at every refresh; any newly flagged reused symbol dem add am di same way.
FAQ
Wetin be good RVOL number?
No official threshold dey. We measure am across high-volume US stocks for di most recent completed session for our data, di median name run at 0.73 times im 20-day average, di 90th percentile na 1.37, and di 99th na 4.71.
Wetin RVOL of 2 mean?
Di stock don trade twice im average volume for di window wey dem measure, usually di trailing 20 sessions. Di clock matter: 2 against same-time-of-day average na strong mid-session reading; 2 at di close mark day wey dey double di normal pace.
How una dey calculate relative volume intraday?
Divide today cumulative volume by di average cumulative volume for di same clock time over your lookback window. If you divide mid-morning total by full-day average, e dey understate di reading badly — by 10:00 a.m., SPY don typically complete only 12.4% of im eventual day volume.
Relative volume dey include premarket and after-hours trading?
Platform conventions dey differ; dis page dey count every minute bar for di Eastern Time calendar day, extended hours dey inside. For SPY di premarket contribution dey visibly small — median of 3.5 thousand shares a minute for di 9:00 bucket versus 136 thousand just after di open.
High relative volume dey bullish or bearish?
E no be any of dem. RVOL dey measure participation, no be direction — heavy tape dey show for stock im best and worst days alike. High-RVOL sessions don historically coincide with earnings, index changes, and headline news; di number just talk say crowd show up, no be which side dem lean.
Every panel wey dey above carry di exact SQL wey produce am — open one, swap in your own ticker, and measure RVOL for di names wey you actually dey trade on di Strasmore terminal.