4. VWAP计算实现:Python实现标准VWAP、滚动VWAP计算、累计VWAP计算
好了,咱们直接进入正题。VWAP的计算,说白了就是「价格 × 成交量」的加权平均。听起来简单,但实际写代码时,不同场景下的实现方式差别还挺大。我最早做这个的时候,以为一个公式就能搞定所有,结果被实盘数据狠狠教育了一回。
今天咱们就一次性把三种最常见的VWAP计算方式讲透:标准VWAP、滚动VWAP、累计VWAP。每种我都会给出完整的Python实现,并附上我踩过的坑。
4.1 标准VWAP:最基础,也最容易出错
标准VWAP,就是整个交易时段内,从开盘到当前时刻的加权平均价格。公式很简单:
VWAP = Σ(价格 × 成交量) / Σ(成交量)
但注意,这里的「价格」通常用成交均价,而不是收盘价。我见过不少新手直接用收盘价算,结果偏差很大。
来看代码:
import pandas as pd
import numpy as np
def standard_vwap(df):
"""
计算标准VWAP(从开盘到当前时刻)
df: 包含 'price', 'volume' 列的DataFrame
"""
# 计算价格×成交量的累计和
df['pv'] = df['price'] * df['volume']
df['cum_pv'] = df['pv'].cumsum()
df['cum_vol'] = df['volume'].cumsum()
# VWAP = 累计价格×成交量 / 累计成交量
df['vwap'] = df['cum_pv'] / df['cum_vol']
return df
4.2 滚动VWAP:捕捉短期趋势的关键
滚动VWAP,也叫滑动窗口VWAP。它只取最近N笔交易或最近N分钟的数据来计算。这个在日内高频交易里特别有用——标准VWAP太「迟钝」了,滚动VWAP能更快反映价格变化。
举个例子:假设你设置窗口为20笔交易,那么每来一笔新交易,就踢掉最旧的那一笔,重新算一次加权平均。
实现方式有两种:
def rolling_vwap_loop(df, window=20):
"""
滚动VWAP - 循环实现(适合小数据量)
"""
df['vwap_rolling'] = np.nan
for i in range(window, len(df)+1):
window_data = df.iloc[i-window:i]
pv_sum = (window_data['price'] * window_data['volume']).sum()
vol_sum = window_data['volume'].sum()
df.loc[df.index[i-1], 'vwap_rolling'] = pv_sum / vol_sum
return df
def rolling_vwap_vectorized(df, window=20):
"""
滚动VWAP - 向量化实现(推荐,大数据量用这个)
"""
df['pv'] = df['price'] * df['volume']
df['cum_pv'] = df['pv'].rolling(window=window).sum()
df['cum_vol'] = df['volume'].rolling(window=window).sum()
df['vwap_rolling'] = df['cum_pv'] / df['cum_vol']
return df
4.3 累计VWAP:多周期对比的利器
累计VWAP,就是按某个时间周期(比如每天、每小时)重新开始累计。这个在跨周期分析时特别有用——你可以对比今天的累计VWAP和昨天的,判断价格是偏强还是偏弱。
实现思路:先按周期分组,然后在每个组内做标准VWAP计算。
def cumulative_vwap_by_period(df, period='D'):
"""
按周期计算累计VWAP
period: 'D' 按天, 'H' 按小时, 'W' 按周
"""
# 确保时间索引
df = df.copy()
df['pv'] = df['price'] * df['volume']
# 按周期分组,每组内做累计
df['cum_pv'] = df.groupby(pd.Grouper(freq=period))['pv'].cumsum()
df['cum_vol'] = df.groupby(pd.Grouper(freq=period))['volume'].cumsum()
df['vwap_cumulative'] = df['cum_pv'] / df['cum_vol']
return df
🔑 核心要点:
- 标准VWAP:适合判断全天均价水平,但反应慢
- 滚动VWAP:适合短线交易,窗口越小越灵敏
- 累计VWAP:适合多周期对比,比如日间强弱分析
4.4 三种VWAP的对比与选择
我整理了一个表格,方便你快速对比:
| 类型 | 计算范围 | 适用场景 | 延迟 | 我常用的窗口 |
|---|---|---|---|---|
| 标准VWAP | 开盘至今 | 机构大单、全天策略 | 高 | 全天 |
| 滚动VWAP | 最近N笔/分钟 | 高频交易、短线择时 | 低 | 20笔或5分钟 |
| 累计VWAP | 按周期重置 | 跨周期对比、趋势判断 | 中 | 按天或按小时 |
嗯,这里要特别说一句:没有哪种VWAP是「最好」的。我见过有人把滚动VWAP的窗口设成200笔,结果跟标准VWAP几乎没区别,白白浪费计算资源。你想想看,窗口越大,滚动VWAP就越接近标准VWAP,那何必多此一举?
4.5 避坑指南:我踩过的三个大坑
做VWAP计算这么多年,有些坑我是一步一步踩过来的。分享给你,希望你能绕开:
- 坑一:价格用错了 —— 我曾经直接用收盘价代替成交均价,结果VWAP曲线跟实际偏差了0.3%。后来才发现,应该用每笔交易的成交均价,或者至少用(high+low)/2来近似。
- 坑二:成交量单位不一致 —— 有的数据源成交量是「手」,有的是「股」。我吃过一次亏,把「手」当「股」算,VWAP直接偏了100倍。建议统一转成「股」再计算。
- 坑三:除零错误 —— 当累计成交量为0时,VWAP会变成NaN。这在开盘第一笔交易时特别常见。我的处理方式是:如果累计成交量=0,则VWAP等于当前价格。
4.6 知识体系总览
最后,我用一张SVG图把三种VWAP的关系和适用场景串起来,方便你整体把握:
好了,三种VWAP的实现就讲到这里。代码我都贴出来了,建议你直接复制到自己的环境里跑一遍。数据可以用随机生成的,也可以从交易所下载历史tick数据。跑通了,你就能感受到不同VWAP在曲线形态上的差异——标准VWAP平滑得像条直线,滚动VWAP则像心电图一样跳动。
下一节咱们会聊VWAP的实战应用,包括怎么用它来做交易信号、怎么跟其他指标配合。不过那是后话了,先把今天的代码吃透再说。
公众号:蓝海资料掘金营,微信deep3321