什么是成交量加权移动平均线?
成交量加权移动平均线(VWMA)是一种技术指标,以图表上的一条线来表示滚动计算的成交量加权价格。对于每根K线,VWMA 都会使用两个对应输入:所选价格(通常为收盘价)以及该K线对应的成交量。回溯周期决定每次计算纳入多少根最近的K线。
VWMA 是一种描述性趋势叠加指标。VWMA 上升表示滚动的成交量加权结果正在上升,而 VWMA 下降表示该结果正在下降。无论方向如何,都不能证明价格会继续沿同一方向运行。

VWMA 在滚动窗口内,将每根K线的一个所选价格与一个成交量数值结合起来进行计算。
VWMA 加权的对象
VWMA 会按每根K线对应记录的成交量,对该K线’的所选价格进行加权。假设两根K线都仍处于回溯窗口内,那么其中一根K线的成交量若是另一根的两倍,其在加权计算中的影响也将是两倍。
VWMA 的加权规则不同于等权重和时间新近性加权。简单移动平均线会给予每根K线相同的影响权重,而指数移动平均线或线性加权移动平均线则根据时间规则给予较新的K线更大影响。VWMA 的影响来源于成交量,而不仅仅是K线’的新旧程度。
VWMA 衡量什么,以及不衡量什么
VWMA 衡量的是每根K线中一个所选价格观测值的加权平均;VWMA 并不衡量每根K线内部各个价格水平上的完整成交分布。如果 VWMA 使用收盘价进行计算,那么出于加权目的,计算会将该K线’的总成交量分配给这一收盘价观测值。
因此,“真实价格”、“实际价值”和“共识价格”这些说法都不能精确描述 VWMA。VWMA 可以显示K线级别的成交量如何改变滚动价格平均值,但 VWMA 无法准确识别每一个成交单位在单根蜡烛图中的具体成交位置。正是这一区别,使 VWMA 有别于按单独价格水平组织成交量的分析方法。
其公式明确体现了这一测量边界。
VWMA 公式与计算示例
VWMA 公式是将同一组K线中“价格乘以成交量”的滚动总和,除以该组K线中成交量的滚动总和。
VWMA 公式
t 时刻的 VWMA = 最近 n 根K线中(价格 × 成交量)之和 ÷ 最近 n 根K线中成交量之和

其中:
- PiP_i = 第 i 根K线的所选价格
- ViV_i = 第 i 根K线的成交量
- nn = 滚动窗口中的K线数量
- tt = 当前K线
简单来说:
VWMA = 价格 × 成交量总和 / 成交量总和
以下五根K线的数据集为假设示例,仅用于演示计算过程。
| K线 | 所选价格 | 成交量 | 价格 × 成交量 |
|---|---|---|---|
| 1 | 50 | 100 | 5,000 |
| 2 | 52 | 150 | 7,800 |
| 3 | 51 | 80 | 4,080 |
| 4 | 53 | 300 | 15,900 |
| 5 | 54 | 200 | 10,800 |
| 总计 | 830 | 43,580 |
五周期 VWMA:
VWMA = 43,580 ÷ 830 = 52.5060
五周期 SMA:
SMA = (50 + 52 + 51 + 53 + 54) ÷ 5 = 52.0000
在本示例中,VWMA 比 SMA 高出 0.5060,因为较大的成交量对应的是较高的价格。该计算展示了加权如何改变平均值,但该计算本身并不构成买入信号。
公式变量与边界情况
只有在价格、成交量和窗口规则被一致定义的情况下,VWMA 计算才是有效的。所选价格可以是收盘价、开盘价、典型价格或其他支持的数据源,因此公布某个数值时,应明确说明所用数据源,而不应假设所有平台都使用相同输入。
当前 n−1 行通常不会有完整窗口的 VWMA,前提是计算要求必须包含全部 n 根K线。若成交量总和为零,则 VWMA 未定义,因为除以零没有有效结果。价格或成交量缺失时,需要明确处理规则;除非数据集说明采用了不同的有符号成交量约定,否则应拒绝负成交量数值。经调整的历史价格与成交量也应采用兼容的公司行为调整政策。
当输入数据有效后,就可以在图表上对计算结果进行解读。
如何在图表上解读 VWMA
VWMA 的解读主要看该线’的斜率、价格相对于该线的位置,以及 VWMA 与同周期价格平均线之间的距离。VWMA 上升表示滚动的成交量加权数值正在上升,VWMA 下降表示该数值正在下降,VWMA 走平则表示加权结果变化不大。
价格位于 VWMA 上方,表示当前价格高于所选窗口内的滚动成交量加权平均值。价格位于 VWMA 下方,表示当前价格低于该平均值。这些关系描述的是位置,而不是高估、低估或必然反转。
交易者也可能观察价格是否在 VWMA 附近反复出现反应。这类反应可使 VWMA 在既定方法中成为一个实用参考,但这条线并不是有保证的支撑位或阻力位。

VWMA 与同周期 SMA 的比较
当 VWMA 与同周期 SMA 使用相同价格源时,对比两者可以单独观察成交量的影响。如果 VWMA 高于 SMA,说明窗口内高成交量K线对应的价格往往高于等权平均值。如果 VWMA 低于 SMA,说明高成交量K线对应的价格往往低于等权平均值。
VWMA–SMA 之间的差距扩大,意味着成交量加权正在造成相较于等权重更大的差异。差距缩小则意味着两种计算结果正在趋同,这可能发生在成交量变得更均匀,或具有较大影响的K线离开滚动窗口时。
VWMA–SMA 的关系并不能证明这种差异是由买方还是卖方造成的。该关系展示的是记录下来的K线成交量如何分布在所选K线价格之上。因此,在 VWMA 与其他相近指标之间进行选择时,需要比较它们的加权规则和窗口规则。
VWMA 与 VWAP、SMA、EMA 和 LWMA 的比较
VWMA 是滚动的成交量加权平均值,而 VWAP 是基于锚点累积的成交量加权平均值,SMA为等权重平均,EMA和 LWMA 则采用基于时间新近性的加权方式。没有任何一种指标在所有情况下都更优,合适的指标取决于交易者希望该计算回答什么问题。
对比表
VWMA、VWAP、SMA、EMA 和 LWMA 之间的主要区别,在于各指标如何分配权重以及如何定义其计算窗口。
| 指标 | 加权规则 | 窗口行为 | 重置或锚点 | 常见价格源 | 适用问题 | 主要局限 |
|---|---|---|---|---|---|---|
| VWMA | 每根K线价格按对应K线成交量加权 | 滚动最近 n n根K线 | 无固定重置 | 通常为收盘价;平台设置可能不同 | 成交量如何改变滚动价格趋势? | 存在滞后,且依赖成交量数据源质量 |
| VWAP | 每个价格源按成交量加权 | 从某个锚点开始累积 | 通常为交易时段,也可能提供周、月或事件锚点 | 常见为典型价格,如 HLC3 | 自所选锚点以来的成交量加权平均值是多少? | 结果取决于锚点和价格源设置 |
| SMA | 每个所选价格获得相同权重 | 滚动最近 n n根K线 | 无固定重置 | 通常为收盘价 | 窗口内的等权平均值是多少? | 忽略成交量,反应较慢 |
| EMA | 近期价格获得指数级更高权重 | 递归式时间新近性加权序列 | 无固定重置 | 所选价格序列 | 如何让近期价格变化获得更大影响? | 可能对噪音和来回震荡较敏感 |
| LWMA | 较新的价格获得线性递增的预设权重 | 滚动最近 n n根K线 | 无固定重置 | 所选价格序列 | 如何让最新K线获得线性更大的影响? | “加权”指的是时间新近性,而非成交量 |
通常是更清晰的选择。如果需要一个应纳入K线成交量的滚动趋势衡量指标,VWMA 通常是更清晰的选择。当等权重或时间新近性加权更符合分析需求时,SMA、EMA 和 LWMA 仍然是基于价格的替代方案。
加权规则只是决策的一部分,因为所选周期、时间框架、价格源和成交量数据源同样会影响输出结果。
VWMA 设置:VWMA(20)是什么意思?
VWMA(20)表示该 VWMA 使用当前图表上最近的 20 根K线。数字 20 指的是K线数量,而不是固定的时钟时间,因此其覆盖时长会随图表时间框架而变化。
| 图表时间框架 | 20 周期 VWMA 覆盖范围 |
|---|---|
| 1 分钟 | 最近 20 根 1 分钟K线 |
| 5 分钟 | 最近 20 根 5 分钟K线,即 100 分钟的K线区间 |
| 1 小时 | 最近 20 根 1 小时K线 |
| 日线 | 最近 20 根交易时段K线 |
市场休市、K线缺失、交易时段模板以及延长交易时段设置,都可能使实际经过的时钟时间不同于简单乘法结果。20 周期默认值只是一个起始配置,并不意味着 20 是适用于所有品种、时间框架或目标的最佳周期。
价格源、时间框架与成交量数据
只有在已知价格源、时间框架以及成交量字段含义的情况下,VWMA 设置才具有可解释性。即使长度和成交量序列相同,基于收盘价的 VWMA 与基于典型价格的 VWMA 也可能不同。
成交量也可能代表不同类型的数据。交易所市场可能提供已报告的成交量,而某些经纪商或数据提供商的数据源则使用 tick volume(逐笔报价量)或其他特定于数据源的衡量方式。例如,MetaTrader 在其数据常量和函数中区分 tick volume 和 real volume(真实成交量)。基于某一数据源计算的 VWMA,不应被假定与另一数据源计算的 VWMA 一致。
周期选择应被视为可测试参数。较短周期的 VWMA 通常变化更快,因为数据点更早离开窗口;较长周期的 VWMA 通常变化更平缓。合适的周期取决于品种、时间框架、数据源和规则体系,而不是某个通用设置。
一旦数据和设置固定,VWMA 就可以纳入明确的交易规则中。
交易者如何使用 VWMA
交易者会将 VWMA 用作趋势过滤器、相对价格参考、回调参考,或交叉策略中的一个条件。VWMA 应用于规则体系中描述市场背景,而不应被视为自动预测工具。
趋势过滤器可能只在 VWMA 上升且价格位于该线之上时允许做多设置。相对价格规则可能将收盘价与 VWMA 进行比较,但不会把这种差异视为估值判断。回调规则可能观察价格在 VWMA 附近的表现,而交叉规则则可能将 VWMA 与同一价格源的移动平均线进行比较。无论哪种用法,仍然需要入场时机、失效条件、出场规则和风险规则。
假设性的 VWMA–SMA 策略示例
一个假设性的 VWMA–SMA 策略可以测试:与等权平均相比,成交量加权是否增加了额外信息。以下规则卡定义的是一个研究示例,并未报告任何预期收益、胜率或交易优势。
| 规则组成 | 假设性规范 |
|---|---|
| 背景 | 使用流动性良好的品种以及有记录且一致的成交量数据源 |
| 指标 | 20 周期 VWMA 和 20 周期 SMA,且使用相同的所选价格源 |
| 做多信号 | 在K线收盘后,VWMA 上穿 SMA |
| 确认条件 | 收盘价位于两条均线之上,且 VWMA 的单根K线斜率为正 |
| 入场时机 | 按下一根K线’可执行价格建模入场,而不是按已知信号收盘价入场 |
| 失效条件 | 根据预先定义的反向收盘或反向交叉规则出场或判定失效 |
| 风险 | 根据固定风险预算和单独定义的市场结构止损来设定仓位规模 |
| 不交易条件 | 成交量缺失/为零、交易时段数据不一致,或完整窗口 VWMA 未定义 |
| 成本模型 | 在适用情况下纳入佣金、点差、滑点和融资成本 |
| 测试状态 | 尚未测试;暂无任何业绩声明 |
该假设性策略将观察到的交叉信号与后续执行假设区分开来。这种区分可防止回测在只有信号K线收盘后才知道的价格上入场。

为什么交叉并不是完整策略
VWMA 交叉并不是完整策略,因为交叉只定义了信号条件,却没有定义执行、风险、成本或评估。关于 VWMA 的社区讨论经常提到信号滞后、趋势接近结束以及需要确认;这些担忧反映的是规则缺失,而不是对该指标本身的支持或否定。
在解读回测结果之前,请核实:
- 品种、交易场所、交易时段、时间框架和成交量数据源
- 价格源以及指标周期是否一致
- 信号在哪一根K线上被明确确认
- 下一个可执行价格以及跳空的处理方式
- 佣金、点差、滑点、融资成本和合约变更
- 缺失数据和公司行为调整
- 样本内区间与未触及的样本外区间
- 对相邻 VWMA 周期的敏感性,而不是只看一个优化值
- 回撤、风险暴露、换手率以及相关基准
- 在任何实盘使用前进行前向测试
实际实现必须复现这些计算和时序规则,且不能引入未来信息。
如何在 Python 中计算 VWMA
在 Python 中,可以通过将“价格 × 成交量”的滚动总和除以同一窗口内“成交量”的滚动总和来计算 VWMA。实现时应保持行顺序,在需要时要求完整窗口,并在滚动分母为零时返回未定义值。
该计算使用标准的 pandas 滚动求和。Python 函数应明确命名价格列和成交量列,以便结果能够追溯到其输入。
Python 示例
以下 pandas 函数在不使用未来行数据的情况下计算尾随 VWMA。
import pandas as pd
def add_vwma(
frame: pd.DataFrame,
window: int = 20,
price_col: str = "close",
volume_col: str = "volume",
) -> pd.DataFrame:
"""返回一个副本,其中包含尾随 VWMA 列,且不存在前视偏差。"""
if window < 1:
raise ValueError("window 必须至少为 1")
result = frame.copy()
price = pd.to_numeric(result[price_col], errors="coerce")
volume = pd.to_numeric(result[volume_col], errors="coerce")
numerator = (price * volume).rolling(
window, min_periods=window
).sum()
denominator = volume.rolling(
window, min_periods=window
).sum()
safe_denominator = denominator.where(denominator.ne(0))
result[f"vwma_{window}"] = numerator.div(safe_denominator)
return result
上述五行计算表可作为测试向量:
example = pd.DataFrame(
{
"close": [50, 52, 51, 53, 54],
"volume": [100, 150, 80, 300, 200],
}
)
calculated = add_vwma(example, window=5)
assert abs(calculated["vwma_5"].iloc[-1] - 52.5060240964) < 1e-10
只有当生产数据集使用相同的价格、成交量、窗口、缺失值和调整规则时,Python 结果才具有可复现性。平台实现同样需要接受相同程度的审查。
MT4 和 MT5 上的 VWMA
MT4 和 MT5并未将 VWMA 列为标准移动平均平滑方法之一,因此除非经纪商或插件提供相关功能,否则 VWMA 通常需要自定义指标或自定义计算。MetaQuotes 记录的标准移动平均方法包括 SMA、EMA、SMMA 和 LWMA。
自定义 VWMA 应提供回溯周期、应用价格和成交量类型等参数。该自定义指标还应处理K线不足、零成交量、重新计算和缓冲区索引等问题。在使用下载的指标之前,请核实其来源、公式、文件出处、平台版本,以及该指标使用的是 tick volume 还是真实成交量。在开始任何策略测试之前,匹配的测试向量应能复现手工计算结果。
自定义实现会在该指标’本身常规分析局限之外,增加操作层面的风险。
局限性与常见错误
VWMA 的局限包括滞后、对异常成交量的敏感性、数据源质量、参数选择以及缺乏预测确定性。VWMA 总结的是历史K线,因此任何 VWMA 信号都发生在构成该信号的价格和成交量数据已经出现之后。
| 局限或错误 | 为何重要 | 适当控制 |
|---|---|---|
| 将 VWMA 视为预测工具 | 该计算描述的是过去的观测值 | 使用条件性表述,并测试明确规则 |
| 将 VWMA 称为“真实价值” | 每根K线只有一个所选价格,无法捕捉每一笔成交价格 | 应将 VWMA 描述为K线级别的成交量加权平均值 |
| 忽视成交量来源 | tick volume 与交易所成交量可能产生不同结果 | 记录并保持使用同一数据源 |
| 将每一次交叉都视为交易机会 | 信号本身未包含执行、失效、风险和成本 | 使用完整且预先声明的规则体系 |
| 假设 VWMA 就是支撑或阻力 | 历史反应并不能保证未来仍会出现相同反应 | 将该线视为参考,而非屏障 |
| 只使用一个优化后的周期 | 单一设置可能只是拟合了某一段样本中的噪音 | 测试相邻周期和未触及区间 |
| 混淆 LWMA 与 VWMA | 时间新近性加权与成交量加权回答的是不同问题 | 核实公式和平台方法 |
| 忽视高成交量异常值 | 单根异常K线可能会显著拉动 VWMA | 检查事件背景并进行敏感性测试 |
| 比较不同价格源或不同周期 | 这种比较改变了不止一个变量 | 在隔离成交量影响时,应匹配价格源和周期 |
没有任何 VWMA 设置或策略在所有情况下都普遍准确。VWMA 的实用性取决于明确的目的、可靠的输入数据,以及来自相同市场条件下的证据。
常见问题
VWMA 并不自动等同于滚动 VWAP,也不能单独提供完整的交易信号,而且由于计算使用历史K线,因此可能存在滞后。
VWMA 是否等同于滚动 VWAP?
VWMA 和滚动 VWAP 可能使用相似的成交量加权算法,但名称并不能保证两者数值相同。只有当价格源、滚动或锚定窗口、重置规则、交易时段处理方式以及平台实现完全一致时,这两种计算才可视为等价。
VWMA 可以作为独立的买入或卖出信号吗?
仅凭 VWMA 并不能定义一笔完整交易。一个可用的方法需要市场背景、信号时机、入场、失效、出场、仓位规模、成本,以及来自适当测试的证据。任何 VWMA 线或交叉都不能保证盈利结果。
为什么 VWMA 在交叉后可能出现滞后?
VWMA 之所以滞后,是因为其计算使用了仍保留在滚动窗口中的历史价格和成交量,直到被更新的K线替代。交叉确认的是两个历史平均值的先后顺序已经发生变化;交叉并不能识别新趋势的精确起点。
结论
VWMA 是一种利用成交量来决定每根K线价格’影响力的滚动平均线。当价格源、周期、时间框架和成交量数据源已知,并且将该线与同周期 SMA 进行比较时,VWMA 的信息价值最为明显。VWMA 可以支持可测试的方法,但 VWMA 无法替代执行、风险管理或证据。
















