27、订单流与成交量加权价格区间(VWAP Range)
VWAP 这个指标,做交易的人应该都不陌生。但大多数人只把它当个均线用——价格在 VWAP 上面就看多,下面就看空。说实话,这种用法太粗糙了。
我做了这么多年订单流交易,发现一个很有意思的现象:VWAP 真正的价值不在于那条线本身,而在于它形成的价格区间。今天我就把这个 VWAP Range 的玩法拆开来讲。
VWAP Range 的构建
先说说什么是 VWAP Range。它不是一条线,而是一个带——由 VWAP 线、上轨和下轨组成。
我个人习惯用标准差来构建这个区间。具体做法是:
// VWAP Range 计算示例(伪代码)
VWAP = Σ(价格 × 成交量) / Σ(成交量)
// 计算标准差
标准差 = sqrt( Σ( (价格 - VWAP)² × 成交量 ) / Σ(成交量) )
// 构建区间
上轨 = VWAP + 2 × 标准差
下轨 = VWAP - 2 × 标准差
中轨 = VWAP
这里有个细节要注意:计算标准差时一定要用成交量加权。普通标准差会把每个价格点同等对待,但订单流交易里,成交量大的价格点显然更重要。
我在项目中遇到过一个问题:用 1 分钟 K 线算 VWAP Range,结果区间太窄,频繁被突破。后来改成用 tick 数据计算,效果就好多了。你想想看,tick 级别的数据能捕捉到每一笔成交的细节,区间自然更准确。
| 参数 | 说明 | 我常用的值 |
|---|---|---|
| 计算周期 | 用于计算 VWAP 的时间窗口 | 当日(日内交易)或 20 周期 |
| 标准差倍数 | 决定区间宽度 | 1.5 或 2.0 |
| 数据粒度 | tick 级别或分钟级别 | tick 级别优先 |
订单流在 VWAP Range 内的行为
区间建好了,接下来看订单流在里面怎么动。我总结了三个典型行为模式:
1. 区间内的吸筹与派发
当价格在 VWAP Range 内震荡时,大资金往往在悄悄干活。如果 Delta(主动买卖量差)持续为正,但价格不涨——这叫吸筹。反过来,Delta 持续为负但价格不跌——这叫派发。
我曾经在某个品种上看到过这种情况:价格在 VWAP 中轨附近晃了整整两个小时,Delta 一直是正的,累计 Delta 曲线稳步上升。我当时就判断有人在吸筹,果断跟了进去。结果半小时后价格突破上轨,直接拉了一波。
2. 订单簿的堆积效应
VWAP 中轨附近经常会出现订单簿的堆积。为什么?因为很多算法交易会把 VWAP 作为参考价,在中轨附近挂单。
我观察到一个规律:如果中轨附近出现大单堆积,且 Delta 在向某个方向倾斜,那突破的方向大概率就是 Delta 指向的方向。说白了,订单簿告诉你阻力在哪,Delta 告诉你谁会赢。
3. 区间边界的测试行为
价格碰到上轨或下轨时,订单流会给出明确的信号。如果价格触轨时 Delta 急剧放大,说明突破意愿强。如果 Delta 萎缩,说明只是试探。
嗯,这里要注意:不要看到触轨就进场。我吃过这个亏——有一次价格碰到上轨,我直接追多,结果 Delta 瞬间转负,价格被打回区间内。后来我学乖了,一定要等 Delta 确认。
VWAP Range 突破策略
好了,重头戏来了。基于上面的分析,我设计了一套 VWAP Range 突破策略。这套策略我实盘跑过,效果还不错。
策略框架
- 识别区间:用 tick 数据计算 VWAP Range,取 1.5 倍标准差
- 等待突破:价格突破上轨或下轨,且突破 K 线的 Delta 大于前 5 根 K 线的平均 Delta 的 2 倍
- 确认信号:突破后回测区间边界,如果回测时 Delta 不减弱,确认突破有效
- 进场:在确认信号出现后进场,止损设在区间边界另一侧
- 止盈:目标为区间宽度的 1.5 倍
代码实现片段
def vwap_range_breakout(df, std_mult=1.5):
# 计算 VWAP 和区间
df['vwap'] = (df['price'] * df['volume']).cumsum() / df['volume'].cumsum()
df['std'] = np.sqrt(
((df['price'] - df['vwap']) ** 2 * df['volume']).cumsum() / df['volume'].cumsum()
)
df['upper'] = df['vwap'] + std_mult * df['std']
df['lower'] = df['vwap'] - std_mult * df['std']
# 检测突破
df['breakout_up'] = (df['price'] > df['upper']) & (df['delta'] > df['delta'].rolling(5).mean() * 2)
df['breakout_down'] = (df['price'] < df['lower']) & (df['delta'] < df['delta'].rolling(5).mean() * 2)
return df
避坑指南
我曾经在震荡市里用这个策略,结果连续被打脸。后来我加了一个过滤器:只有当 VWAP Range 的宽度在最近 20 个周期的 30% 分位数以上时,才执行突破策略。区间太窄说明市场在收敛,突破往往是假突破。
知识体系图
下面这张图总结了 VWAP Range 的核心逻辑:
说实话,VWAP Range 这套东西,刚开始用的时候会觉得有点复杂。但一旦你习惯了用订单流去验证每一个突破信号,你会发现胜率提升得很明显。我自己的账户曲线就是最好的证明——从最初的频繁止损,到现在的稳定盈利,关键就在于学会了等待那个 Delta 确认的信号。
记住一句话:价格可以骗人,但成交量不会。VWAP Range 给了你框架,订单流给了你眼睛,两者结合,你就能看清市场的真实意图。
交易系统化学习资料 微信Strategy888888