执行算法(TWAP / VWAP)与 TCA
直觉
你需要买入 10 万股,但一次性市价砸下去会把价格冲上天(上一节讲的冲击)。执行算法就是把这笔「母单」切成很多小「子单」、分散到一段时间里慢慢执行,降低冲击。两种最基础的是 TWAP(按时间均分)和 VWAP(按预期成交量分配——开盘收盘量大、午间量小,就在量大时多买)。评估执行好坏的核心指标是执行差额(Implementation Shortfall, IS):你的平均成交价相对到达价(决策那一刻的中间价)差了多少。
TWAP 与 VWAP
设日内共 段,每段成交量份额 ()、价格 ,到达价 :
「人话」解释:TWAP 和 VWAP 各什么时候用?
TWAP 最简单——不预测成交量,只要「时间均匀」,适合成交量模式不稳定、或你想最小化信息泄露(每段下等量单)时。VWAP 更聪明——它知道「开盘和收盘成交密集、午间清淡」,于是跟着市场的节奏下大单到量大时段、小单到量小时段,目标是匹配市场成交量加权均价。当成交量模式可预测时,VWAP 通常比 TWAP 更贴近基准、IS 更低。但若日内成交量突变(比如午间突发新闻),VWAP 的预设权重就会失灵。算法是「用对节奏换更低的冲击」。
可运行案例:TWAP vs VWAP vs 开盘一次性
模拟一条日内价格随机游走 + U 型成交量曲线,分别用三种方式执行同一笔买入,比较执行差额(IS,bps)。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(1); M = 78 # 78 个 5 分钟段(半天)
t = np.arange(M)
vol_prof = np.exp(-((t - M/2)/(M/4))**2)*0.5 + 0.5 # U 型: 开收盘量大, 午间小
vol_prof /= vol_prof.sum()
price = 100*np.exp(np.cumsum(rng.normal(0, 0.0008, M))) # 日内随机游走
arrival = price[0]
impact_bps_per_share = 0.5 # 大单一次性冲击(简化)
twap_avg = price.mean() # 等量切分 -> 算术均
vwap_avg = (price*vol_prof).sum() # 按成交量加权
naive = arrival * (1 + impact_bps_per_share*1e-2*20) # 开盘一次性 + 大冲击
def is_bps(fill): return (fill - arrival)/arrival*1e4
print(f"到达价 = {arrival:.2f}")
print(f"开盘一次性(含冲击) IS = {is_bps(naive):.1f} bps")
print(f"TWAP 均价 IS = {is_bps(twap_avg):.1f} bps")
print(f"VWAP 均价 IS = {is_bps(vwap_avg):.1f} bps ← 最贴近成交量加权基准")
fig, ax = plt.subplots(1, 2, figsize=(11, 3.3))
ax[0].plot(t, price, color='k', lw=1); ax[0].set_title('日内价格'); ax[0].set_xlabel('5分钟段')
ax[1].bar(t, vol_prof, color='steelblue'); ax[1].set_title('U 型成交量分布'); ax[1].set_xlabel('5分钟段')
plt.tight_layout(); plt.show()
print("\n→ 拆单降低冲击; 当成交量可预测时 VWAP 通常优于 TWAP。")
小结
- 执行算法把母单切成子单,降低价量冲击:TWAP 按时间均分、VWAP 按成交量加权;
- **执行差额(IS)**衡量成交价相对到达价的偏离,是评估执行质量的金标准;
- 成交量可预测时 VWAP 占优;不可预测或需隐藏意图时用 TWAP。