3. 成交量加权价格(VWAP)
聊完VPIN,咱们得先搞清楚一个基础概念——VWAP。说实话,很多新手交易员容易把VWAP和VPIN搞混。我刚开始做量化的时候也犯过这个错,以为它们是一回事。其实不然,VWAP是VPIN计算过程中的关键一环,没有VWAP,VPIN就无从谈起。
3.1 VWAP的定义与计算
VWAP,全称Volume-Weighted Average Price,翻译过来就是「成交量加权平均价格」。说白了,它不是一个简单的算术平均价,而是把成交量作为权重,算出来的一个「真实成交均价」。
你想想看,如果某只股票在10块钱成交了100股,在11块钱成交了10000股,那它的真实成交均价肯定更接近11块,而不是10.5块。VWAP干的就是这个事。
计算公式其实很简单:
VWAP = Σ(价格 × 成交量) / Σ(成交量)
嗯,这里要注意,VWAP通常是在日内计算的,而且是累积计算的。也就是说,从开盘到当前时刻,所有成交的价格和成交量都要算进去。
我给你们看一段Python代码,这是我实际项目中用过的版本:
def calculate_vwap(trade_data):
"""
计算VWAP
trade_data: DataFrame,包含price和volume列
"""
# 计算价格×成交量的累积和
trade_data['pv'] = trade_data['price'] * trade_data['volume']
# 计算累积VWAP
trade_data['cum_pv'] = trade_data['pv'].cumsum()
trade_data['cum_vol'] = trade_data['volume'].cumsum()
trade_data['vwap'] = trade_data['cum_pv'] / trade_data['cum_vol']
return trade_data['vwap']
这段代码看起来简单,但我曾经踩过一个坑——如果成交量数据有缺失或者为0,除零错误就来了。所以实际项目中,我一般会加一个保护:
def safe_vwap(trade_data):
trade_data['pv'] = trade_data['price'] * trade_data['volume']
trade_data['cum_pv'] = trade_data['pv'].cumsum()
trade_data['cum_vol'] = trade_data['volume'].cumsum()
# 避免除零
trade_data['vwap'] = np.where(
trade_data['cum_vol'] > 0,
trade_data['cum_pv'] / trade_data['cum_vol'],
trade_data['price'] # 如果没成交量,就用当前价格
)
return trade_data['vwap']
3.2 VWAP在交易中的意义
VWAP在交易圈里地位很高,尤其是机构交易员。为什么?我给你讲个真实场景。
假设你是一个基金经理,要买入100万股某股票。如果你一股脑全买进去,价格肯定被你推高了。这时候,VWAP就成了一个「基准线」。如果你能以低于VWAP的价格买入,说明你执行得不错;如果高于VWAP,那就说明你买贵了。
我个人习惯把VWAP当作一个「多空分水岭」来看:
- 价格在VWAP上方:说明买方力量强,市场偏多
- 价格在VWAP下方:说明卖方力量强,市场偏空
- 价格围绕VWAP震荡:说明多空力量均衡,市场在犹豫
我曾经用VWAP做过一个简单的日内策略:当价格突破VWAP且成交量放大时做多,跌破VWAP且成交量放大时做空。效果嘛,在趋势行情里还不错,但在震荡市里就容易被来回打脸。所以后来我加了VPIN来过滤噪音,这个后面会讲到。
核心要点:VWAP的本质是「市场参与者的平均成本线」。机构用它评估执行质量,散户可以用它判断市场情绪。
3.3 VWAP与VPIN的关系
好,现在咱们聊聊VWAP和VPIN到底什么关系。这个问题我在知乎上看到过好几次,很多人搞不清楚。
简单来说:VWAP是VPIN计算的基础原料。
VPIN的全称是Volume-synchronized Probability of Informed Trading,它需要把交易数据按照「成交量桶」来分组。每个桶里装固定数量的成交量,然后计算这个桶里的VWAP,再跟上一个桶的VWAP做比较,来判断方向。
我画了一张图,帮你理清这个逻辑:
从这张图你可以看到,VWAP是VPIN计算链条上的一个中间产物。没有VWAP,你就没法判断每个成交量桶里的买卖方向,也就没法算出VPIN。
小提示:在实际计算中,桶的大小V(即每个桶包含的成交量)会影响VPIN的敏感度。V越小,VPIN对市场变化的反应越快,但噪音也越大。我一般先用VWAP的日均成交量除以50作为初始值,再根据回测结果调整。
还有一个细节很多人会忽略——VWAP的计算精度。在VPIN计算中,我们用的是桶内VWAP,而不是整个交易日的VWAP。这意味着每个桶都有自己的VWAP,然后我们比较相邻桶的VWAP来判断方向。
举个例子:
| 成交量桶 | 桶内VWAP | 与上一桶比较 | 判定方向 |
|---|---|---|---|
| 桶1 | 100.50 | - | 基准 |
| 桶2 | 101.20 | 上升 | 买方主动 |
| 桶3 | 100.80 | 下降 | 卖方主动 |
| 桶4 | 102.00 | 上升 | 买方主动 |
你看,通过比较桶间VWAP的变化,我们就能判断出每个桶里的主导力量是买方还是卖方。然后把这些方向信息汇总,就得到了VPIN。
注意:用VWAP判断买卖方向有一个前提——假设市场是有效的,价格上升意味着买方更积极。但在极端行情下(比如闪崩),这个假设可能不成立。我曾经在2015年股灾期间回测过,VWAP方向判断的准确率会下降,需要结合其他指标一起看。
总结一下VWAP和VPIN的关系:
- VWAP是基础:VPIN的每一步计算都离不开VWAP
- VWAP是微观:它反映的是单个桶内的平均成交价格
- VPIN是宏观:它把多个桶的方向信息汇总成一个概率值
- 两者互补:VWAP告诉你价格在哪里,VPIN告诉你信息交易者是否在行动
我个人习惯是把VWAP和VPIN放在一起看。如果VPIN很高,同时价格远离VWAP,那说明市场可能出现了信息驱动的大行情。这时候我会特别警惕,要么顺势而为,要么离场观望。
好了,VWAP这部分就讲到这里。记住,VWAP不是终点,它是通往VPIN的桥梁。下一节我们会正式进入VPIN的计算,到时候你会看到VWAP是怎么一步步变成VPIN的。