相对成交量(RVOL)是什么?如何解读
相对成交量(RVOL)将个股成交量与其20日均量对比,高于1表示当日交易比平常活跃。本文用分钟级数据实测日内成交量的U形分布,并给出按时段调整的日内RVOL计算方法。
相对成交量(RVOL,relative volume)衡量一只股票当前的交易活跃程度与其自身近期正常水平的对比:用当日成交股数除以该股的日均成交量,通常取最近 20 个交易日的平均值。RVOL 为 1 表示这是普通的一天,2 表示换手的股数是平常的两倍,0.5 则表示这一交易日只有平常一半的节奏。本页每一个数字都由分钟级美国市场数据测得,每个面板都附有生成它的完整查询。
什么是相对成交量?通俗定义
原始成交量本身说明不了多少问题:500 万股对一只超大盘股来说是极其清淡的一天,对一只小盘股来说却可能是一年一遇的大事。相对成交量把与该股自身正常水平的对比明确写进了公式:
RVOL = 当日成交量 ÷ 该股日均成交量(通常取最近 20 个交易日)
举一个假设的例子:一只日均成交 1000 万股的股票,到收盘时成交(print)了 2500 万股,当天的 RVOL 就是 2.5。(print 指上报到综合行情记录(consolidated tape,覆盖全市场的成交记录)的一笔成交;交易员口中的“the tape”就是这份记录的简称。)20 个交易日的回看窗口只是一种惯例:各平台也会用 10 天、30 天或 50 天;20 个交易日大约相当于一个日历月的交易时间。这个窗口还会继承交易所日历的特殊安排:节假日的半日交易只会给均值贡献正常交易日的一小部分成交量,市场休市日与提前收盘一文列出了这些日期的分布。
交易者为什么关注相对成交量?
RVOL 衡量的是参与度,不是方向。高 RVOL 的交易日往往集中出现在可辨认的事件前后:财报、指数纳入、头条新闻。放量之下的价格变动背后有一群人参与;同样的变动如果发生在 RVOL 只有 0.3 的日子,可能只是寥寥几笔订单的结果。活跃度还与可交易性同行:横向对比各只股票,成交最清淡的名字往往挂着最宽的买卖价差,这些报价来自全天双边挂单的做市商;就单只股票而言,其最清淡交易日的报价往往比最活跃交易日略宽一些。(成交量同时也是成交量加权平均价 VWAP的基础,那是另一个重要的基于成交量的参考基准。)
相对成交量怎么计算?以及时段陷阱
全天口径的计算只是一次除法:当日总成交量 ÷ 最近 20 个交易日的日均成交量。它只有在收盘后才是诚实的。陷阱在于盘中就去计算:上午 10:30 时,累计成交量自然只是任何全天数字的一小部分,于是即便是剧烈放量的早盘也会显得很清淡。日内成交量沿时钟呈 U 形分布,任何日内 RVOL 都必须从这个形状出发。
下面就是这一形状,测量对象是标普 500 ETF SPY:最近 30 天已完成交易日中,每个 30 分钟时段内每分钟成交股数的中位数,含延长时段(美东时间凌晨 4:00 至晚间 8:00)。
每个数字背后的完整 SQL
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_time9:30 时段,也就是常规交易的头半个小时,每分钟成交股数中位数为 136.9 千股,而紧邻其前的 9:00 盘前时段只有 3.7 千股。节奏在 12:30 时段放缓到 50.1 千股,随后向收盘逐步回升:3:30 时段达到 174.2 千股,这是通往收盘集合竞价的冲刺段,远高于午间低谷。下午 4:00 收盘钟响之后,每分钟节奏断崖式跌入盘后交易。
日内相对成交量:按时段做调整
修正的办法是更换分母:把今天的累计成交量与同一时刻的平均累计成交量作比较。这就需要知道在一天中的每个时点,正常交易日的成交量通常已经完成了多少份额。下面用 SPY 最近 20 个已完成交易日来测量:
每个数字背后的完整 SQL
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 checkpoint到上午 10:00,即常规交易开始半小时后,SPY 通常只完成了最终全天成交量的 12.2%;到正午为 35.3%,到下午 2:00 为 51.5%,到下午 3:30 也仍然只有 67.7%。即使到下午 4:00 收盘钟响时,累计也只有 86.1%:其余部分都在 16:00 或之后才上报,其中大部分落在钟响后的最初几分钟里,此时收盘集合竞价和其他收盘时段的成交陆续登上行情记录;盘后时段本身要清淡得多。这与上图中的断崖相吻合:钟响之后每分钟节奏骤降,而全天总量中仍有相当一部分还在上报之中。按时段调整的早盘 RVOL,等于今天的累计成交量除以 20 日均量与该时点份额的乘积。一点提醒:这份时刻表是 SPY 自己的。每只股票都有自己的时钟,下文的实例测量的就是另一只股票的时钟。
实例:一个真实的放量交易日(MU)
2026 年 6 月是美光(Micron)成交繁重的一个月,MU 2026 年 6 月深度复盘梳理了完整的行情记录。下面是当月成交量最大的单个交易日,并用两种口径分别计算 RVOL:
每个数字背后的完整 SQL
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 当月最大的交易日落在 2026-06-25。当天到上午 10:30,已成交 32.8 百万股,而此前 20 个交易日同一时刻的平均值为 17.3 百万股,按时段调整的 RVOL 为 1.9。如果改用 51 百万股的全天均量去除这个早盘累计值,朴素口径的读数只有 0.64:一个看上去低于平均的日子,实际上早盘正以接近平常两倍的节奏运转。该交易日最终成交 77.2 百万股,全天 RVOL 为 1.5。
与网上那些十倍于均量的截图相比,这个收盘数字看起来可能并不起眼。它是否真的不起眼,要交给分布来回答,下一节就来测量。
相对成交量多高才算高?
交易论坛上流传着诸如“RVOL 超过 2 就算高”的门槛。这里给出实测版本:对所有 20 日日均成交量超过 500 万股(且此前恰有完整 20 个交易日历史)的美国上市股票和 ETF,计算我们数据中最近一个已完成交易日的全天 RVOL,并在该群体内做百分位统计。关于这个标签的一点说明:筛选按股数而非美元金额计,所以这个高成交量群体从超大盘股和 ETF 一直延伸到价格低廉、换手频繁的小盘股。股数意义上的高成交量并不等于容易交易。
每个数字背后的完整 SQL
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 percentile在这个高成交量群体中,位于中位数的名字当日成交量是其自身 20 日均量的 0.86 倍。十只里有九只低于 1.41,一百只里只有一只超过 2.92。把上一节 MU 的那个交易日放到这张表旁边,它就不再显得不起眼了:即便是活跃的名字,大多数日子也都在自身均量附近徘徊;数倍于均量的日子很罕见。
底部尾端同样重要:第 10 百分位为 0.07。这么低的读数通常意味着这只股票的 20 日均量中还留着某一个巨量交易日:放量之后,被抬高的分母会把 RVOL 压低数周。这个窗口是有记忆的,向上向下都一样。
一点提醒:这只是单个交易日的横截面。百分位每天都会漂移,而全市场性的事件日(指数再平衡、期权到期)可能整体抬高这条曲线。
哪些股票出现异常成交量?RVOL 排行榜
同一个样本范围,这次做排名(每周更新的版本见本周异常成交量股票):在日均成交量超 500 万股的名字里,2026-07-17 交易日全天 RVOL 最高的十个读数,也就是选股器会标记为异常成交量的榜单。筛选要求此前有完整的 20 个交易日历史:新上市的股票没有有意义的 20 日均量,否则榜单会被这类数据假象填满。
每个数字背后的完整 SQL
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 10榜首的 MUU 当日成交 70.2 百万股,而其 20 日均量为 6.9 百万股,RVOL 达到 10.2。榜上每一行都超过了自身均量。这样的榜单往往偏离家喻户晓的超大盘股:让本已庞大的均量翻倍需要天量的股数,而较小的名字一个交易日就能把自己的成交记录放大数倍。
数据说明:交易日选取与剔除规则
两张排名表使用同一个样本范围和同一条交易日规则。候选交易日只有在 SPY 当日行情记录达到 SPY 自身此前 20 个交易日均量的至少 60% 时才被视为完整:最新一天的数据到达存在延迟,这道检查可以避免把只加载了一部分的日子当成已完成的交易日来读。两张表还剔除了一个最近被交易所重新分配给新上市公司的代码:数据商的行情源在这个代码下混着两家不同公司的历史,其 20 日均量因此不是有意义的基准。SQL 中的剔除名单在每次刷新时都与我们的代码身份校验保持同步;任何新标记出的重用代码都会以同样的方式加入。
FAQ
RVOL 多少算高?
没有官方门槛。以我们数据中最近一个已完成交易日的高成交量美国股票实测:中位数名字的当日成交量是其 20 日均量的 0.86 倍,第 90 百分位为 1.41,第 99 百分位为 2.92。
RVOL 等于 2 是什么意思?
表示这只股票的成交量达到了所测窗口(通常是最近 20 个交易日)均量的两倍。时钟很重要:盘中相对同一时刻均值读出的 2 是很强的读数;收盘时的 2 则表示全天以正常两倍的节奏完成。
日内相对成交量怎么计算?
用今天的累计成交量,除以您选定的回看窗口内同一时刻的平均累计成交量。如果拿上午的累计值去除全天均量,读数会被严重低估:到上午 10:00,SPY 通常只完成了最终全天成交量的 12.2%。
相对成交量包含盘前和盘后交易吗?
各平台的口径不同;本页统计美东时间日历日内的每一根分钟线,含延长时段。就 SPY 而言,盘前贡献明显偏小:9:00 时段每分钟成交中位数为 3.7 千股,而开盘后紧接着的时段为 136.9 千股。
相对成交量高是看涨还是看跌?
都不是。RVOL 衡量参与度而非方向:无论在一只股票表现最好的日子还是最差的日子,密集的成交都会出现。历史上,高 RVOL 的交易日常与财报、指数调整和头条新闻同时出现;这个数字说明人群来了,但没有说明他们倾向哪一边。
上面每个面板都附带生成它的完整 SQL。在 Strasmore 终端上打开任意一个,换成您自己的代码,就能为您实际交易的名字测量 RVOL。