3. VWAP策略原理:成交量加权平均价格的计算逻辑、时间切片与成交量预测
VWAP,全称是Volume-Weighted Average Price,成交量加权平均价格。说白了,它就是一个“谁交易得多,谁说了算”的平均价。
我刚开始做量化那会儿,总觉得VWAP就是个简单的均价计算。后来在实盘中吃过亏,才发现里面的门道比想象中深得多。今天咱们就把它的计算逻辑、时间切片和成交量预测这三个核心问题彻底讲透。
3.1 VWAP的计算逻辑:别被公式吓到
VWAP的计算公式其实很简单:
VWAP = Σ(价格 × 成交量) / Σ(成交量)
嗯,就是每一笔成交的“价格乘以成交量”加起来,再除以总成交量。你想想看,这不就是加权平均嘛。
但这里有个关键点:VWAP是累积计算的。从开盘第一笔交易开始,到当前时刻,所有成交数据都要参与计算。
举个例子:
| 时间 | 价格 | 成交量 | 价格×成交量 | 累计成交量 | VWAP |
|---|---|---|---|---|---|
| 09:30:01 | 100.0 | 500 | 50,000 | 500 | 100.00 |
| 09:30:05 | 100.5 | 300 | 30,150 | 800 | 100.19 |
| 09:30:10 | 99.8 | 700 | 69,860 | 1,500 | 100.01 |
看到没?随着新交易进来,VWAP会不断更新。我习惯把这个过程叫做“价格在成交量中游泳”——成交量越大,对VWAP的影响就越大。
核心要点:VWAP不是预测未来的指标,而是对过去成交情况的“加权总结”。它反映的是市场参与者真实的平均成交成本。
3.2 时间切片:把一天切成几块?
VWAP的计算需要时间切片。为什么?因为真实交易中,我们不可能等所有成交都完成再算——那黄花菜都凉了。
常见的切片方式有两种:
- 固定时间切片:比如每5分钟、每30分钟切一次。简单粗暴,但容易忽略盘中的活跃期。
- 成交量驱动切片:比如每累计成交10万手切一次。更贴近市场节奏,但实现起来麻烦点。
我个人更推荐第二种。为什么呢?
有一次我在做A股的VWAP策略,用固定5分钟切片。结果发现上午10:00-10:30那段时间,成交量特别大,但我的切片却把这段时间分成了6个等份,每个切片里的成交量差异巨大。后来改成成交量驱动切片,效果明显好了很多。
我的经验:对于流动性好的股票(比如茅台、宁德时代),建议用成交量驱动切片,每切片成交量设为总成交量的5%-10%。对于流动性差的股票,固定时间切片反而更稳定。
时间切片还有一个作用:计算切片VWAP。每个切片内单独算一个VWAP,然后把这些切片VWAP连起来,就形成了VWAP曲线。这条曲线就是策略的“锚”。
3.3 成交量预测:VWAP策略的灵魂
VWAP策略的核心,其实是成交量预测。为什么?
你想想看,VWAP是累积的。如果你不知道未来还有多少成交量,你怎么知道当前价格相对于最终VWAP是高了还是低了?
成交量预测的方法有很多,我挑几个常用的说说:
3.3.1 历史分布法
最简单的方法。统计过去N天每个时间切片的成交量占比,然后取平均。
# 伪代码示例
def predict_volume_histogram(stock_code, date, slice_minutes=5):
# 取过去20天的数据
hist_data = get_hist_data(stock_code, date-20, date-1)
# 计算每个时间切片的成交量占比
slice_ratios = []
for day in hist_data:
day_slices = slice_by_time(day, slice_minutes)
total_vol = sum(day_slices)
ratios = [vol/total_vol for vol in day_slices]
slice_ratios.append(ratios)
# 取平均
avg_ratios = np.mean(slice_ratios, axis=0)
return avg_ratios
这个方法有个坑:节假日效应。我曾经在国庆节前用这个方法预测,结果预测的成交量分布和实际差了30%以上。因为节前大家交易意愿低,历史分布完全失效了。
避坑指南:使用历史分布法时,一定要剔除异常交易日(比如财报日、分红日、重大消息日)。我一般会保留过去20个“正常”交易日的数据。
3.3.2 实时修正法
这个方法更聪明一些。它不依赖历史,而是根据当前已经发生的成交量,动态调整预测。
核心逻辑是:如果今天前30分钟成交量比历史均值高了20%,那么后面每个切片的预测值也相应上调20%。
def realtime_adjustment(hist_ratios, current_vol, current_slice_idx):
# 计算当前已发生切片的实际成交量占比
actual_ratio = current_vol / total_predicted_vol
# 计算历史对应切片的平均占比
hist_ratio = sum(hist_ratios[:current_slice_idx+1])
# 调整系数
adjust_factor = actual_ratio / hist_ratio
# 调整后续切片的预测
adjusted_ratios = hist_ratios.copy()
for i in range(current_slice_idx+1, len(adjusted_ratios)):
adjusted_ratios[i] *= adjust_factor
return adjusted_ratios
这个方法我用了很久,效果不错。但要注意:调整系数不能太激进。我一般会加一个上下限,比如0.7到1.3之间,防止单日异常数据把预测带偏。
3.3.3 机器学习法
如果你有足够的数据和算力,可以试试机器学习。特征可以包括:
- 时间特征(星期几、是否月末、是否季末)
- 市场特征(大盘涨跌幅、板块热度)
- 个股特征(过去N日成交量、波动率)
不过说实话,我在实盘中很少用机器学习做成交量预测。原因很简单:成交量受太多随机因素影响,模型很容易过拟合。有一次我用LSTM模型预测,回测时漂亮得很,一上实盘就崩了。
我的建议:对于大多数交易场景,历史分布法+实时修正法已经够用了。机器学习可以作为辅助,但别把它当主力。
3.4 VWAP策略的核心逻辑图
下面这张图,是我自己总结的VWAP策略核心流程。你看一眼就能明白整个逻辑链条:
这张图把整个流程串起来了:行情数据进来 → 切成时间片 → 预测未来成交量 → 计算VWAP → 输出交易信号。每一步都环环相扣,缺一不可。
3.5 几个容易踩的坑
最后,分享几个我在实战中踩过的坑:
- 开盘价处理:开盘第一笔成交的价格和成交量,对全天VWAP影响很大。我习惯在开盘后等3-5分钟再启动策略,等数据稳定了再说。
- 大单冲击:突然出现一笔超大单,会瞬间拉偏VWAP。我的做法是:如果单笔成交量超过总成交量的5%,就把它当作异常值过滤掉。
- 收盘前效应:A股收盘前最后几分钟,经常有大量成交。如果预测模型没考虑到这一点,VWAP会严重偏离实际。
嗯,VWAP策略的原理就讲到这里。说白了,它就是一个“跟着成交量走”的均价策略。计算逻辑不难,难的是成交量预测和时间切片的选择。这部分内容,在实际交易中会反复用到,建议你多动手写写代码试试。