4. VWAP执行策略核心:如何将大单拆分成小单?
好,咱们直接进入正题。大单拆分,说白了就是怎么把一头大象,切成能一口口吃下去的小块。VWAP策略的核心,就在这个“切”字上。你切得越精细,越贴近市场节奏,最终的成交均价就越接近VWAP。
我个人习惯把拆分策略分成两大类:静态拆分和动态拆分。静态是“按计划行事”,动态是“见机行事”。两者各有千秋,但实战中,我几乎只用动态拆分。
4.1 静态拆分:简单但不够聪明
静态拆分,就是提前把一天的成交量分布画好,然后按时间切片,每个切片分配固定比例的单量。
举个例子,假设历史数据显示,上午9:30-10:00的成交量占全天的15%。那好,我就把总单量的15%放在这个时段执行。每个时段内,再均匀地切成小单,比如每分钟发一笔。
代码实现起来很简单:
def static_split(total_qty, volume_profile, interval_minutes=5):
"""
静态拆分:按历史成交量分布分配单量
:param total_qty: 总委托量
:param volume_profile: 每个时间切片的成交量占比列表
:param interval_minutes: 切片时长(分钟)
:return: 每个切片对应的委托量列表
"""
slices = []
for ratio in volume_profile:
slice_qty = int(total_qty * ratio)
slices.append(slice_qty)
return slices
你看,逻辑很直白。但问题也明显——它假设历史会重演。我在项目中遇到过好几次,某天突然出个新闻,成交量分布完全变了。静态拆分还在按旧数据发单,结果就是要么发早了,要么发晚了,VWAP偏差大得离谱。
我曾经在A股市场吃过这个亏。某只股票因为突发利好,开盘后半小时成交量暴增到平时的3倍。静态拆分还在按历史比例慢慢发单,结果大部分单子都发在了低点,后面价格拉上去,我完全没跟上。那次教训让我彻底转向了动态拆分。
4.2 动态拆分:实时调整,贴近市场
动态拆分,核心就一句话:根据当前市场的实际成交量,动态调整发单速度。
怎么调?我常用的方法是:
- 设定一个目标VWAP路径。比如,我希望我的累计成交量占比,始终与市场累计成交量占比保持一致。
- 实时计算偏差。每过一分钟,算一下“我的累计成交量占比” vs “市场的累计成交量占比”。
- 根据偏差调整下一分钟的发单量。如果我的占比落后了,就多发一点;如果超前了,就少发一点。
这里有个关键参数:调整系数。系数太大,容易过度反应;系数太小,又跟不上市场节奏。我一般设成0.5到1.0之间,具体看股票的流动性。
def dynamic_split(current_qty, target_ratio, actual_ratio, total_remaining, adjustment_coef=0.8):
"""
动态拆分:根据当前偏差调整下一分钟发单量
:param current_qty: 当前已成交量
:param target_ratio: 目标累计成交量占比
:param actual_ratio: 市场实际累计成交量占比
:param total_remaining: 剩余总委托量
:param adjustment_coef: 调整系数
:return: 下一分钟建议发单量
"""
deviation = target_ratio - actual_ratio
# 如果偏差为正,说明我们落后了,需要加速
# 如果偏差为负,说明我们超前了,需要减速
adjustment = deviation * adjustment_coef
next_qty = int(total_remaining * (1 + adjustment) / (剩余分钟数))
return max(0, next_qty)
嗯,这里要注意:调整不能太激进。我见过有人把系数设成2.0,结果市场一波动,单子忽大忽小,反而增加了冲击成本。
4.3 时间切片 vs 成交量切片
说到拆分,还有个绕不开的话题:切片方式。
| 切片方式 | 核心逻辑 | 优点 | 缺点 |
|---|---|---|---|
| 时间切片 | 固定时间间隔(如每分钟)发一笔 | 实现简单,容易控制节奏 | 在成交量稀疏时段,容易暴露意图 |
| 成交量切片 | 市场每成交一定数量,就发一笔 | 能更好地隐藏大单,降低冲击 | 实现复杂,需要实时监控市场成交 |
我个人更倾向于成交量切片。为什么?你想想看,时间切片在流动性差的时候,你发一笔大单,市场一眼就看出来了。而成交量切片,是跟着市场的节奏走,市场快我就快,市场慢我就慢,隐蔽性更好。
我在做美股量化交易时,就遇到过这种情况。某只小盘股,平时一分钟成交不到1000股。如果用时间切片,每分钟发500股,那基本就是明牌了。改用成交量切片后,我设定每成交2000股发一笔,单子就散在了市场的自然波动里,几乎没人察觉。
4.4 核心逻辑流程图
下面这张图,是我自己总结的VWAP动态拆分核心流程。你看一眼,基本就明白整个逻辑链条了。
说白了,这个流程就是一个闭环。你设定目标,然后不断拿实际数据去对比,有偏差就调整。循环往复,直到单子全部执行完。
4.5 实战中的几个小技巧
最后,分享几个我在实战中总结出来的小技巧:
- 不要用固定切片大小。我见过有人把每笔单子固定成1000股,结果市场波动大的时候,1000股可能只占成交量的0.1%,波动小的时候却占了5%。更好的做法是,根据当前市场的平均单笔成交量来动态调整切片大小。
- 留一个“安全垫”。在收盘前最后15分钟,我通常会留出总单量的5%-10%作为缓冲。如果前面执行有偏差,最后这段时间可以快速修正。如果前面执行得很好,那这部分就按正常节奏发完。
- 关注盘口深度。拆分策略不能只看成交量,还要看买卖盘的深度。如果买一只有100股,你非要发500股的卖单,那价格肯定被打下去。我一般会参考盘口前5档的总挂单量,确保每笔单子不会超过这个量的20%。
我刚开始做VWAP执行时,总想着把拆分算法做得越复杂越好。后来发现,很多时候简单策略+严格执行,效果反而更好。别为了炫技而过度优化,市场会给你教训的。
好了,关于大单拆分,核心就是这些。记住:静态拆分是基础,动态拆分是进阶。如果你刚开始做,可以从静态拆分入手,慢慢过渡到动态。但如果你追求更好的执行效果,直接上动态拆分吧,别犹豫。