VWAP 是什么?
为什么机构看这条线、散户却常常用错
你在图上拉了条 VWAP,把它当多空分界线——上方就做多、下方就做空。跑几天之后你会发现,这条线每天开盘 flip 一次,中间常常无感触发。照着做的日子甚至比不看它还糟。
没有人先跟你讲的是:VWAP 从设计之初就不是拿来预测方向的——它是机构做完一笔单之后,用来检查「我这笔执行有没有比市场的平均成本差」的计分板。把计分板当入场信号,就像看温度计来决定要不要感冒。
这篇不重复 VWAP 的公式与图表操作——那些在 Volume Profile / VWAP / TWAP 完整教程 已经写过。这里只讲四个散户把它用错的地方,以及少数几种它真正有意义的用法。
先讲结论:两边看的是同一条线,用途完全不同
同一个 VWAP 数字,在机构桌上与散户图表上代表的意义几乎不重叠。这张表是给你比对用的,不用背——后面每一节会拆一遍。
| 机构执行台 | 散户图表 | ||
|---|---|---|---|
| 拿来做什么 | 事后检查执行成本 | 事前预测进出场 | |
| 时间轴 | 从自己下单开始、到单子做完为止 | 整个交易日 | |
| 怎么算胜负 | 成交均价比 VWAP 差几个 bp | 价格穿越 VWAP 有没有续走 | |
| 谁在推动这条线 | 不含自己这笔单 | 包含所有人的单,包括你 | |
| 重置点 | 自己单子的起点 | 当日开盘(一个习惯) |
落差一:VWAP 是给执行后打分用的,不是给入场前预测用的
VWAP 这个指标最早出现在机构的 execution desk,用途是解决一个很具体的问题:一个大单子被拆成几百笔小单塞出去之后,怎么证明自己「没有把市场推很多」?
于是就有了 Σ(price × volume) / Σ(volume) 这个公式——它不是猜下一笔会走去哪,而是把整段时间里的成交,按量加权平均起来。做完单之后,把自己的平均成交价跟这个数字相减,差距用 basis point(bp,也就是一个百分点的百分之一)报回去。这是一种回头看的计分板。
散户拿到这条线的时候顺序反过来:它已经被画在 K 线上,看起来像一条可以「反弹」的支撑。但这条线的每个点都是过去成交价的加权平均,跟未来没有结构性的关系。它在图上长得像均线,只是因为它每根 K 棒都往前算一次。
落差二:跨日累积的 VWAP 是自己发明出来的
TradingView 的 ta.vwap() 预设在每个 session boundary(也就是交易时段的边界,例如美股每天 9:30 开盘那一刻)重置。Pine Script v5 以后允许你自己指定 anchor(ta.vwap(source, anchor, stdev_mult)),可以是 session、week、month,或任何你自己算出来的 bool 条件。
但常见的一种误用是:把 anchor 设成 barstate.isfirst、然后从资料的第一根 K 棒一路累积下去,用意是「拿到一条稳定的长期均线」。这条线在图上看起来很平滑,但它已经不是 VWAP 了,它是「从你可看到的历史起点以来的成交量加权平均价」。这个数字没有任何机构会拿去用。
想要一条「跨日的成交量加权平均」,那个东西叫 anchored VWAP:从某个明确事件开始重新累积——某次财报、某次跳空缺口、某个减半日。它有意义是因为 anchor 本身是事件;从历史第一根 K 棒起不算事件,只算「Pine 有多少资料」。同一条脚本换一个交易对、换一段时间范围,那条线的位置就完全不同。
落差三:VWAP 假设你不会推动市场——加密散户刚好相反
再回头看那个公式:Σ(price × volume) / Σ(volume)。「量」这一项是市场的量——所有人的成交加起来。机构的假设是「我的单子相对市场很小,我加进去也不会歪太多」,这在美股大盘股上大致成立。
加密散户身上这个假设常常反过来。原因不是散户单子大,而是「这条线是哪个交易所的 VWAP」这件事本身就很糊。BTC 在币安、OKX、Bybit、Coinbase 之间同时报价,每个交易所自己的 VWAP 都不一样,也都只反映自己那一小块的成交。你在 TradingView 拉出来的 VWAP 通常挂在某个单一交易所的资料源上,那条线代表的是那一个交易所的加权平均,不是「市场」的平均。
落差四:把 VWAP 当均线做交叉,是把它当成了另一个东西
这是新手 Pine Script 最爱写的策略:close 上穿 ta.vwap 入场、下穿出场。回测跑起来曲线看起来还行,实盘跑一个月你会看到它整天在 flip。
原因很简单:VWAP 每天重置,均线不会。开盘那几根 K 棒 VWAP 几乎贴着价格,因为累积量小、权重被最新那根 K 棒吃走大半,任何一个小波动都会触发穿越。真正的均线用一段固定历史窗口做平均,开盘时它跟昨天差不多,不会这样过度反应。
更根本的问题是:均线与 VWAP 在「单位」上就不一样——EMA(20) 是「最近 20 根 K 棒的价格趋势」,VWAP 是「今天到现在为止量分布的中心」。把两个放在同一个规则里当交叉条件,等于用温度计跟血压计比大小。
那什么时候用 VWAP 才是对的?
两种用法在既有的机构工作流里是稳定的,散户照着用不会走偏:
用法一:检查自己的执行成本
你这一天做了几笔单,把每笔的成交均价跟同一时段的 VWAP 相减。这是机构桌上 execution trader 的日常 KPI:你的均价比 VWAP 好,代表你这笔单的时机没有拖累市场;比 VWAP 差,代表你追高或杀低了。这对散户也成立,尤其是分批建仓或分批平仓的情况——它比「我上次入场的价格是多少」更能告诉你节奏对不对。
用法二:anchored VWAP,挂在具体事件上
这是 Brian Shannon 这一路人推广起来的用法:把 anchor 挂在某个所有人都看到的事件——财报公布那根 K 棒、跳空缺口的那根 K 棒、某次减半、某次协议升级。从那个 anchor 开始算的 VWAP,代表「这个事件之后所有入场的人的加权平均持仓成本」。这条线在图上有一个具体含义:如果你是那个事件之后才入场的人,你现在是赚还是赔、赚赔幅度平均在哪。
用 Pine 写起来的骨架是这样(v5 起 ta.vwap 就吃 anchor 参数):
//@version=5
indicator("Anchored VWAP from event", overlay=true)
// 让你在图上点一根 K 棒当 anchor(input.time 可以用鼠标指定)
anchorTime = input.time(timestamp("2026-01-01T00:00:00+00:00"), "Anchor 事件时间")
// 这根 K 棒的开盘时间到了 anchorTime,就重置累积
newAnchor = time >= anchorTime and time[1] < anchorTime
// ta.vwap 的第二个参数就是 bool 型的重置信号
avwap = ta.vwap(hlc3, newAnchor)
plot(avwap, "Anchored VWAP", color.orange, 2)诚实的一段:这条线的极限
就算你把它用对了,VWAP 还是有几件事做不到,先写在前面:
- 它不会告诉你方向——它只是把过去成交往一个中心压过去,中心点本身没有预测力。
- 它对低流动性的标的意义很弱——量太少的时候,加权跟不加权差不了多少。
- 加密盘本来就 24 小时,若又用短周期切 anchor,样本点会太少,算出来抖动很大。
比较安全的做法:把 VWAP 当成一个补充滤网——你的主策略是某个突破、某个型态、某个信号,VWAP 只是拿来做「这个信号发生在多方成本上方还是下方」的分类器。不要让 VWAP 自己当入场条件。
如果你已经在跑 TradingView webhook
webhook 就是 alert 触发时把 JSON payload 送到你自己伺服器的那条通道。最常见的做法是把 VWAP 的条件写进 Pine 策略里当过滤器:strategy.entry 只在「信号成立 而且 close 在 anchored VWAP 上方」时才触发。这样真正发出去的 alert 是有过滤的,webhook 端不需要再判断。
这种写法的坑不是 VWAP 本身,是「信号的 timing 跟 K 棒收盘的关系」——如果你用 barstate.isconfirmed 才触发,信号会晚一根 K 棒;如果不用,你会拿到会消失的信号(Pine Script 的 Alert 没有记忆那篇解释过为什么)。把 VWAP 加进来之前先确定这件事没踩到。
常见问题
TradingView 内建的那条 VWAP 是哪个交易所的?
anchored VWAP 跟一般 VWAP 差在哪?只是换个起点吗?
为什么 Pine 内建的 ta.vwap 预设不能算跨日?
ta.vwap(source, anchor) 的第二个参数是 bool,你可以在里面自己算出「每周一开盘」或「某个事件时间」再送进去。但预设值是 session 重置,这是刻意的——把跨日累积做预设会误导绝大多数使用者。我把 VWAP 当做多空分界线在做日内交易,是不是完全不对?
机构的 VWAP algo 跟我在 TradingView 看到的 VWAP 是同一个东西吗?
Get started
把 anchored VWAP 过滤器加进你的 Pine 策略,webhook 到交易所这段交给 TVSBot——用你自己的 API key,先 dry-run,风控自己设。
免费开始使用