交易执行算法基础:四大核心算法详解
做量化交易这些年,我见过太多人一上来就研究高频策略,结果连最基本的执行算法都没搞明白。说实话,交易执行算法就像是开车时的方向盘——策略告诉你往哪开,执行算法决定你怎么打方向盘。今天我就把这四种最基础的算法掰开揉碎了讲给你听。
核心观点:交易执行算法的本质,是在「市场冲击成本」和「时间风险」之间找平衡。你想想看,大单子一次性砸进去,价格肯定被打飞;慢慢拆单吧,又怕市场突然转向。这四种算法就是解决这个矛盾的不同思路。
一、时间加权平均价格算法(TWAP)
TWAP 是最简单的算法,说白了就是「均匀拆单」。把一个大单子按时间切成小块,每块等量执行。比如你要买 100 万股,交易时间 4 小时,那就每小时买 25 万股,每分钟买 4167 股。
我在项目中遇到过这样一个场景:有个客户要做 ETF 套利,需要在一小时内买入一篮子股票。我直接用了 TWAP,因为 ETF 成分股流动性都还不错,而且套利窗口期就那么长,均匀执行最稳妥。
# TWAP 简单实现示例
def twap_schedule(total_quantity, total_seconds, interval_seconds=60):
"""
total_quantity: 总交易量
total_seconds: 总执行时间(秒)
interval_seconds: 切片间隔(默认60秒)
"""
num_slices = total_seconds // interval_seconds
slice_quantity = total_quantity / num_slices
schedule = []
for i in range(num_slices):
schedule.append({
'time': i * interval_seconds,
'quantity': slice_quantity
})
return schedule
我的经验:TWAP 适合流动性好、波动不大的品种。但要注意——如果市场突然出现大单,TWAP 不会做任何调整,该买还是买。我曾经在港股市场吃过这个亏,遇到大单砸盘,TWAP 还在傻傻地买,结果成本高了不少。
二、成交量加权平均价格算法(VWAP)
VWAP 比 TWAP 聪明一点。它不按时间均匀分配,而是按市场成交量来分配。市场成交活跃的时候多买点,冷清的时候少买点。目标就是让我们的成交均价尽量接近市场 VWAP。
为什么会这样?因为市场 VWAP 本身就是机构资金博弈的结果。如果你的成交价能贴近 VWAP,说明你没有给市场造成太大冲击,也没有被对手盘「吃」得太狠。
| 对比维度 | TWAP | VWAP |
|---|---|---|
| 分配依据 | 时间均匀 | 成交量比例 |
| 适用场景 | 流动性好、波动小 | 流动性一般、有成交量规律 |
| 风险特征 | 时间风险低 | 市场冲击风险低 |
| 实现难度 | 简单 | 中等(需要成交量预测) |
# VWAP 调度示例(需要成交量预测数据)
def vwap_schedule(total_quantity, volume_profile):
"""
volume_profile: 每个时间段的预测成交量占比
例如:[0.1, 0.15, 0.2, 0.25, 0.2, 0.1]
"""
total_volume_ratio = sum(volume_profile)
schedule = []
for i, ratio in enumerate(volume_profile):
slice_qty = total_quantity * (ratio / total_volume_ratio)
schedule.append({
'period': i,
'quantity': slice_qty,
'volume_ratio': ratio
})
return schedule
注意:VWAP 依赖成交量预测。如果预测不准,效果可能还不如 TWAP。我曾经用历史平均成交量做预测,结果遇到财报发布日,成交量暴增 3 倍,VWAP 调度完全乱套了。后来我改用实时成交量滚动预测,效果才稳定下来。
三、实施缺口算法(Implementation Shortfall)
这是我最喜欢用的算法,也是机构交易员的核心武器。实施缺口算法不追求「均价好看」,而是追求「总成本最小化」。它把交易成本拆成两部分:
- 延迟成本:等太久,价格跑掉了
- 冲击成本:买太急,把价格打上去了
算法会动态计算:现在买 vs 等会买,哪个更划算?如果市场趋势向上,那就赶紧买,别等;如果市场波动剧烈,那就慢点来,别当冤大头。
我记得有一次做美股大宗交易,客户要买 50 万股特斯拉。当时特斯拉正在拉升,实施缺口算法判断「延迟成本 > 冲击成本」,于是果断加速买入。最后成交价比 VWAP 还低了 0.3%,客户非常满意。
# 实施缺口算法的核心逻辑
def implementation_shortfall(price, arrival_price, volatility, urgency):
"""
price: 当前市场价格
arrival_price: 决策时的基准价格
volatility: 预估波动率
urgency: 紧迫程度(0-1)
"""
# 延迟成本估算
delay_cost = (price - arrival_price) / arrival_price
# 冲击成本估算(与交易量成正比)
impact_cost = 0.01 * urgency # 简化模型
# 决策:如果延迟成本 > 冲击成本,加速执行
if delay_cost > impact_cost:
return 'accelerate'
else:
return 'slow_down'
关键点:实施缺口算法需要实时计算「最优执行路径」。这不是一个固定的调度表,而是一个动态决策过程。每秒钟都在问自己:现在这个价格,我该不该出手?
四、百分比成交量算法(POV)
POV 算法很简单:我承诺只参与市场成交量的 X%。比如设置 POV=10%,那市场每成交 100 万股,我就买 10 万股。市场成交快我就买得快,市场冷清我就等着。
这种算法的好处是「隐形」。你想想看,如果一个大买家固定时间买入,很容易被市场发现。但 POV 算法跟着市场节奏走,别人很难察觉你的存在。
我曾经在 A 股市场用 POV 算法做日内回转交易。设置 POV=5%,一天下来成交了 200 万股,但盘面上完全看不出痕迹。对手盘还以为只是散户在交易呢。
# POV 算法核心逻辑
class POVAlgorithm:
def __init__(self, participation_rate=0.1):
self.rate = participation_rate # 参与率,如 0.1 表示 10%
self.total_traded = 0
def on_market_trade(self, trade_volume):
# 市场成交了 trade_volume,我该买多少?
my_volume = trade_volume * self.rate
self.total_traded += my_volume
return my_volume
我的建议:POV 的参与率设置很关键。设得太高(比如 30%),容易被发现;设得太低(比如 1%),可能一天都完不成任务。我一般从 5% 开始试,根据市场流动性动态调整。
四种算法的选择逻辑
说了这么多,到底该用哪个?我总结了一个简单的决策树:
嗯,这张图基本概括了四种算法的适用场景。但我要提醒你——实际交易中很少只用一种算法。我经常把 VWAP 和 IS 结合起来:先用 VWAP 打底,遇到极端行情再切换到 IS 模式。
避坑指南:我曾经犯过一个错误——在 A 股开盘集合竞价阶段用 TWAP。结果因为集合竞价成交量极小,TWAP 的切片根本成交不了,白白浪费了时间。后来我改成开盘后 5 分钟才开始执行,效果就好多了。
最后说一句:这些算法只是基础工具。真正的高手会根据市场微观结构、订单簿深度、甚至对手盘行为来动态调整。但万丈高楼平地起,先把这四种算法吃透,你就能应付 80% 的交易场景了。