跳转到内容

最优执行与交易成本

信号给出目标仓位,从目标仓位到真实成交的每一分损耗都是策略成本。执行的三大成本:

总成本=价差⏟即时性+冲击⏟自己的订单+时机风险⏟等待的代价.\text{总成本} = \underbrace{\text{价差}}_{\text{即时性}} + \underbrace{\text{冲击}}_{\text{自己的订单}} + \underbrace{\text{时机风险}}_{\text{等待的代价}}.

三者此消彼长:执行越快(吃价差),冲击与时机风险越小;执行越慢(挂限价单),价差省下但承担时机风险。最优执行就是在三者间权衡。

算法做法适用
TWAP把订单按时间均匀切开简单、低冲击,适合小单
VWAP按历史成交量分布切单与市场节奏同步,最常用
POV(参与率)按市场实时成交量的一定比例下单大单,控制冲击
IS(Implementation Shortfall)以到达时刻的中间价为基准,权衡冲击与时机风险学术标准的执行框架

IS 框架(Almgren–Chriss)把执行问题写为冲击与时机风险的凸优化:给定风险厌恶系数,求解最优的执行轨迹——订单不是均匀切开,而是前重后轻(先快后慢),见凸优化速览。

订单对价格的影响随成交量占比非线性增长,常用平方根律:

冲击≈c σ QADV,\text{冲击} \approx c\, \sigma\, \sqrt{\frac{Q}{\mathrm{ADV}}},

QQ 为订单量,ADV\mathrm{ADV} 为日均成交量,σ\sigma 为日内波动率,cc 为经验系数(约 0.5–1)。要点:

  • 冲击与 Q/ADV\sqrt{Q/\mathrm{ADV}} 成正比——容量上限由此而来:成交量占比超过 1–5%,冲击进入非线性区间;
  • 回测引擎的成本模型应包含冲击项,见回测引擎设计;
  • 策略容量 = 在"冲击吃掉一半期望收益"处的规模。

限价单(挂单)与市价单(吃单)的选择:

  • 挂单:赚价差,但承担逆向选择——你的限价单被成交,往往是因为价格正向不利于你的方向移动(知情交易者优先成交于你),见限价订单簿;
  • 吃单:付价差,但即时成交、无逆向选择;
  • 执行中两者的混合比例,决定实际的"价差 + 逆向选择"总成本。
execution-check.py
import numpy as np
def execution_shortfall(side: str, arrival_mid: float, fills: list[tuple[float, float]]) -> float:
"""IS(实现落差):成交均价 vs 到达时刻中间价。fills: [(价格, 数量)]"""
avg = np.average([p for p, _ in fills], weights=[q for _, q in fills])
sign = 1 if side == "buy" else -1
return sign * (avg - arrival_mid) / arrival_mid # 买入为正成本
  • 每笔执行记录 IS(实现落差),作为执行质量的统一度量,见监控与事故复盘;
  • 大单用 VWAP/POV 切单,小单直接吃单;
  • 挂单策略(逆向选择敏感)只在流动性好的标的与时段使用。
  • 大单按 VWAP/POV 切单,执行轨迹按 IS 优化(前重后轻);
  • 冲击用平方根律估算,容量按"冲击吃掉一半收益"设定;
  • 每笔执行记录 IS,纳入每日对账。
  • 执行的三大成本:价差、冲击、时机风险,三者此消彼长
  • 冲击成本随成交量占比按平方根律增长,容量上限由此而来
  • 执行质量用实现落差(IS)统一度量