什么是RVOL相对成交量?如何解读
RVOL是股票成交量除以20日均值,1表示正常,超过1表示更活跃。了解盘中时段RVOL、何时算高,以及如何判断走势参与度与交易活跃性。
相对成交量(RVOL)用于衡量一只股票的交易活跃度相较于自身近期正常水平的变化:即当日成交股数除以该股的平均日成交量,通常采用过去20个交易日的数据。RVOL为1表示交易量正常,2表示成交股数是通常水平的两倍,0.5表示当日交易活跃度仅为正常水平的一半。本页所有数据均基于分钟级美国市场数据计算,每个面板均附有对应的精确查询。
什么是相对成交量?通俗定义
单看原始成交量,信息有限:对于超大盘股而言,500万股可能是异常冷清的一天;对于小盘股而言,却可能是一年才出现一次的成交量。相对成交量则明确将其与该股票自身的正常水平进行比较:
RVOL = 当日成交量 ÷ 股票平均日成交量(通常取最近20个交易日)
举例来说,某股票日均成交量为1,000万股,收盘前成交量达到2,500万股,则其RVOL为2.5。(Print指报告至综合行情记录的已执行交易;综合行情记录是全市场成交的汇总记录,“the tape”是交易员对该记录的简称。)20个交易日的回溯窗口是一种惯例。部分平台也会采用10日、30日或50日窗口,大致相当于一个自然月的交易日。该窗口还会受到交易所交易日历特殊安排的影响:节假日半日市只会将正常交易日部分成交量计入平均值,而市场节假日和提前收盘日会标示这些日期的具体安排。
为什么交易员关注相对成交量?
RVOL衡量的是市场参与度,而不是价格方向。高RVOL交易日通常集中在可识别的事件附近,例如财报发布、纳入指数或重大新闻。高成交量下形成的价格走势背后有大量市场参与者;而RVOL为0.3时,同样的走势可能只是少数几笔订单造成的。交易活跃度也会影响可交易性:在不同股票之间,成交最清淡的股票通常具有最宽的买卖价差,这些价差由全天双边报价的做市商挂出;对单只股票而言,成交清淡时段的报价通常也会比成交活跃时段略宽。(成交量还是VWAP,即成交量加权平均价格的基础。)
如何计算相对成交量,以及时段陷阱
全天相对成交量的计算只需做一次除法:交易时段总成交量 ÷ 过去20个交易日的日均成交量。只有收盘后计算,这一结果才可靠。陷阱在于盘中计算:上午10:30时,累计成交量自然只是全天成交量的一部分,因此即使早盘交易剧烈,计算结果也会显得低迷。盘中成交量会随时间呈U形分布,任何盘中RVOL计算都必须以这一形态为基准。
下面是SPY(标普500 ETF)的成交量形态:统计过去30个已完成交易日(包括盘前盘后交易,即美国东部时间凌晨4:00至晚上8:00)中,每个30分钟时段的每分钟成交股数中位数。
| 美东时间 | 每分钟成交量中位数 k |
|---|---|
| 04:00 | 0.7 |
| 04:30 | 0.5 |
| 05:00 | 0.4 |
| 05:30 | 0.5 |
| 06:00 | 0.5 |
| 06:30 | 0.5 |
| 07:00 | 1.7 |
| 07:30 | 1.9 |
| 08:00 | 2.6 |
| 08:30 | 3 |
| 09:00 | 3.8 |
| 09:30 | 95.6 |
| 10:00 | 76.2 |
| 10:30 | 64.1 |
| 11:00 | 50.9 |
| 11:30 | 46.7 |
| 12:00 | 38.8 |
| 12:30 | 38.2 |
| 13:00 | 37.7 |
| 13:30 | 34.1 |
每个数字背后的完整 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时段是常规交易的第一个半小时,其每分钟成交股数中位数为95.6千股;此前的9:00盘前交易时段为3.8千股。到12:30时段,成交速度降至38.2千股,随后在收盘前回升:3:30时段达到160.8千股,进入收盘集合竞价前的成交量明显高于午间低谷。下午4:00收盘铃响后,每分钟成交速度骤降,进入盘后交易。
盘中相对成交量:按交易时段调整
修正方法是改变分母:将今日截至当前的累计成交量,与过去平均水平在同一时刻的累计成交量进行比较。这需要知道正常交易日截至每个时点已完成的成交量占比。本文根据SPY最近20个完整交易日的综合行情逐笔数据进行测算:
| 美东时间检查点 | 日成交量平均完成百分比 |
|---|---|
| 10:00 | 11.2 |
| 12:00 | 33.3 |
| 14:00 | 49 |
| 15:30 | 64.5 |
| 16:00 | 81.8 |
每个数字背后的完整 SQL
WITH per_min AS (
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS et_date,
formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i') AS et_min,
sum(toFloat64(size)) AS v
FROM global_markets.stocks_trades
WHERE ticker = 'SPY'
AND sip_timestamp >= now() - INTERVAL 45 DAY
AND toDate(toTimeZone(sip_timestamp, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))
AND NOT hasAny(conditions, [15, 16, 38])
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通常只完成最终全天成交量的11.2%;到中午为33.3%,下午2:00为49%,下午3:30仍只有64.5%。即使到下午4:00收盘铃响起时,累计成交量也仅为81.8%。其余成交量会在16:00或之后上报,其中大部分出现在收盘铃响后的最初几分钟,此时收盘竞价及其他日终交易陆续进入行情记录;盘后交易时段本身的成交量则低得多。这与上图中的断崖式变化一致:收盘铃响后,每分钟成交速度骤降,但当天总成交量中仍有相当一部分尚在上报。
按时间调整的早盘RVOL,计算方式是将今日累计成交量除以20日平均成交量,再除以截至当前检查时点的成交量占比。需要注意的是,这套时间分布属于SPY,每只股票都有自己的成交节奏;下方示例测算的是另一只股票的情况。
一个真实高成交量交易日示例(MU)
2026年6月是美光(MU)成交活跃的一个月,MU 2026年6月深度分析完整梳理了整个交易过程。以下是该月成交量最大的一天,并分别采用两种方式计算RVOL:
| 交易时段日期 | 截至 10:30 的成交量 m | 截至 10:30 的平均成交量 m | 10:30 调整后相对成交量 | 10:30 简单相对成交量 | 交易时段成交量 m | 滚动平均日成交量 m | 全天相对成交量 |
|---|---|---|---|---|---|---|---|
| 2026-06-25 | 32.8 | 17.3 | 1.9 | 0.64 | 77.2 | 51 | 1.5 |
每个数字背后的完整 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百万股来除以当日上午成交量,朴素算法得出的RVOL为0.64:这看似是一个低于平均水平的交易日,但当日上午的成交速度接近平时的两倍。当天最终成交量为77.2百万股,对应的全天RVOL为1.5。
与成交量达到平均水平十倍的热门股截图相比,这一收盘成交量可能显得并不突出。但它是否确实如此,还需结合分布情况进行衡量,下面将对此展开分析。
什么才算相对成交量高?
交易论坛常把“RVOL高于2”视为高位。以下是基于数据的定义:我们选取所有在美国上市、20日平均日成交量超过500万股且拥有完整20个交易日前历史数据的股票和ETF,计算其全天RVOL,并按数据中最近一个完整交易日的横截面分布进行百分位排名。需要说明的是,该筛选按股数而非金额统计。因此,高成交量组既包括超大盘股和ETF,也包括股价较低、换手频繁的小盘股。成交股数高,并不等于容易交易。
| 百分位数 | 相对成交量 |
|---|---|
| p10 | 0.13 |
| p25 | 0.72 |
| p50 (median) | 0.98 |
| p75 | 1.28 |
| p90 | 1.6 |
| p99 | 5.09 |
每个数字背后的完整 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.98倍。十分之九的标的低于1.6倍,只有百分之一的标的超过5.09倍。将上一节中的MU当日数据与这张表对比后,MU的表现就不再显得温和。即使是活跃标的,大多数交易日的成交量也接近自身均值;达到均值数倍的情况并不常见。
分布的低端同样值得关注。第十百分位为0.13。如此低的读数通常意味着,某只股票的20日平均成交量中仍包含一次异常巨大的交易日。成交量激增后,偏高的分母会在数周内持续压低RVOL。这个计算窗口具有记忆效应,向上和向下都一样。
需要注意的是,这只是单个交易日的横截面数据。百分位会逐日变化。市场范围内的事件日,例如指数再平衡和期权到期日,可能推高整条分布曲线。
哪些股票成交量异常?RVOL排行榜
相同股票池,按成交量排序(每周固定版见本周成交量异常的股票):在日均成交量超过500万股的股票中,列出2026-10-08交易时段全天RVOL读数最高的十只股票。这是筛选器会标记为成交量异常的股票池。筛选要求股票拥有完整的此前20个交易日数据。近期上市股票没有有意义的20日平均值,否则会以数据噪音占满榜单。
| ticker | 交易时段日期 | 交易时段成交量 m | 20 日平均日成交量 m | 相对成交量 |
|---|---|---|---|---|
| SBFM | 2026-10-08 | 118.4 | 9.3 | 12.7 |
| OLB | 2026-10-08 | 405.6 | 44.2 | 9.2 |
| ONCO | 2026-10-08 | 46.9 | 6 | 7.9 |
| SXTC | 2026-10-08 | 64.7 | 8.7 | 7.4 |
| AIXI | 2026-10-08 | 58.7 | 8.3 | 7.1 |
| MDT | 2026-10-08 | 94.4 | 17.3 | 5.5 |
| CMG | 2026-10-08 | 65.4 | 12.9 | 5.1 |
| SBUX | 2026-10-08 | 28.4 | 5.6 | 5.1 |
| SDST | 2026-10-08 | 294.6 | 61.8 | 4.8 |
| MRNO | 2026-10-08 | 82.7 | 20.2 | 4.1 |
每个数字背后的完整 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榜首股票SBFM成交量为118.4百万股,20日平均成交量为9.3百万股,RVOL为12.7。榜单中的每只股票成交量都超过自身平均水平。此类榜单通常不会集中于投资者熟悉的大型权重股。要让本已极高的平均成交量翻倍,需要极大的成交股数;规模较小的股票则可能在一个交易日内让成交量成倍增长。
数据说明:交易时段选择与排除规则
两个排行榜使用相同的股票池和交易时段规则。只有当SPY在该日期的成交量达到其此前20个交易日平均成交量的至少60%时,候选交易时段才会被视为完整交易时段。最新交易日的数据存在延迟,这项检查可避免将尚未完整加载的交易日误读为完整交易时段。两个排行榜还会排除一个近期被交易所重新分配给新上市公司的代码:供应商数据源将两家不同公司的历史数据归于该代码下,因此其20日平均成交量无法作为有意义的基准。SQL中的排除名单会在每次刷新时与我们的代码身份检查保持同步;任何新发现的复用代码都会以相同方式加入名单。
常见问题
什么样的RVOL数值算好?
没有官方统一门槛。根据我们数据中最近一个已完成交易日的美国高成交量股票统计,中位数股票的成交量为其20日均值的0.98倍,90%分位数为1.6,99%分位数为5.09。
RVOL为2意味着什么?
这表示在统计窗口内,该股票的成交量达到平均水平的两倍。统计窗口通常为最近20个交易日。时间点很重要:如果是与当日同时段均值相比,盘中RVOL为2属于强劲读数;如果收盘时为2,则表示当天成交量达到正常水平的两倍。
如何计算盘中相对成交量?
将当日累计成交量除以回溯窗口内同一时刻的平均累计成交量。如果用上午盘中的累计成交量除以全天平均成交量,会严重低估读数。以上午10点为例,SPY通常只完成了最终全天成交量的11.2%。
相对成交量是否包括盘前和盘后交易?
不同平台的统计口径不同。本页面统计整个美国东部时间自然日的成交量,包括延长交易时段。对SPY而言,盘前交易的贡献明显较小:在9:00时段,每分钟成交量中位数为3.8千股,而开盘后不久为95.6千股。
高相对成交量意味着看涨还是看跌?
两者都不意味着。RVOL衡量的是市场参与度,而不是方向。成交活跃的交易同样会出现在股票表现最佳和最差的交易日。历史上,高RVOL交易日通常与财报发布、指数调整和突发新闻同时出现。这个指标只能说明市场参与者集中入场,不能说明他们偏向哪个方向。
上述每个面板都附有生成结果的完整SQL。打开其中一个面板,替换为您自己的ticker,即可在Strasmore终端上测量您实际交易股票的RVOL。