交易执行算法基础:四大核心算法详解

做量化交易这些年,我见过太多人一上来就研究高频策略,结果连最基本的执行算法都没搞明白。说实话,交易执行算法就像是开车时的方向盘——策略告诉你往哪开,执行算法决定你怎么打方向盘。今天我就把这四种最基础的算法掰开揉碎了讲给你听。

核心观点:交易执行算法的本质,是在「市场冲击成本」和「时间风险」之间找平衡。你想想看,大单子一次性砸进去,价格肯定被打飞;慢慢拆单吧,又怕市场突然转向。这四种算法就是解决这个矛盾的不同思路。

一、时间加权平均价格算法(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% 开始试,根据市场流动性动态调整。

四种算法的选择逻辑

说了这么多,到底该用哪个?我总结了一个简单的决策树:

交易执行算法选择 流动性好? 流动性差? 波动小 → TWAP 有规律 → VWAP 趋势明显 → IS 需隐形 → POV 核心原则 市场冲击成本 vs 时间风险 没有最好的算法,只有最合适的场景 实际交易中经常组合使用多种算法

嗯,这张图基本概括了四种算法的适用场景。但我要提醒你——实际交易中很少只用一种算法。我经常把 VWAP 和 IS 结合起来:先用 VWAP 打底,遇到极端行情再切换到 IS 模式。

避坑指南:我曾经犯过一个错误——在 A 股开盘集合竞价阶段用 TWAP。结果因为集合竞价成交量极小,TWAP 的切片根本成交不了,白白浪费了时间。后来我改成开盘后 5 分钟才开始执行,效果就好多了。

最后说一句:这些算法只是基础工具。真正的高手会根据市场微观结构、订单簿深度、甚至对手盘行为来动态调整。但万丈高楼平地起,先把这四种算法吃透,你就能应付 80% 的交易场景了。

专注资料整理