中信 CITIC 算法交易部一位资深执行交易员,正在与一家中型量化私募的投资经理通电话。私募需要在收盘前 30 分钟清掉 100 万股 600519 贵州茅台。到达价 RMB 1800.00;距离收盘 30 分钟。投资经理要求订单完成。交易员冷静地解释:「直接打盘口市价单,意味着接下来 30 秒 100% 参与率,~250 bp 冲击。30 分钟内做 TWAP,每分钟 ~5% 参与率,~50 bp 冲击,但反向漂移可能让价格往不利方向走 ~120 bp。还有第三个方案——Almgren-Chriss——前置加权,把约 60% 的订单放在头 10 分钟内。这个计划付 ~70 bp 冲击吸收 ~50 bp 的时间风险方差。综合:~120 bp 期望成本,方差是纯 TWAP 的三分之一。」投资经理选 AC。这就是标准的执行成本优化问题,交易员的三计划对比是标准的实务回答。Almgren & Chriss 2000("Optimal execution of portfolio transactions",Journal of Risk 3(2): 5-39)把它定义为带约束的均值-方差优化,在线性冲击模型下闭式求解。这个闭式解是应用 quant 金融里少见的干净分析解;它已经成为所有主要买方和卖方交易台的执行成本优化通用语言。本课讲 AC 推导、闭式 cosh 轨迹、有效前沿可视化,以及把 AC 与 L2 经验平方根冲击曲线调和的实务调整。
离散时间设置
交易员需要在时窗 T 内清仓 (或建仓) X 股,把 T 分成 N 个等长时间步。六个设置变量,按此严格顺序:
1. X — total shares to liquidate / accumulate
2. T — total horizon
3. N — number of time steps
4. Δt = T/N — per-step duration
5. x_k — shares remaining at end of step k; x_0 = X, x_N = 0
6. n_k = x_{k-1} - x_k — trade at step k
边界条件 x_0 = X (起点,满仓) 和 x_N = 0 (终点,卖单清掉 / 买单建满) 锚定问题。决策变量是交易计划 。TWAP / 线性 计划 是 ,即 等大笔。问题是能不能比 TWAP 做得更好,如果能,什么计划最小化均值-方差成本。
成本泛函
Almgren-Chriss 把执行成本拆成三个可加部分。每个对应交易员为执行的不同维度付出的代价。
(1) 永久冲击
永久冲击按每笔交易线性偏移未受影响的市场价。第 k 步后价格:
(卖单;买单翻号)。永久冲击系数 单位 bps / 股。整笔清仓结束时累计永久冲击是 ,与计划无关。这意味着永久冲击是交易员无法用换计划规避的固定成本——只有少交易才能少付。
(2) 临时冲击
临时冲击在每笔交易瞬间收取每股额外成本。第 k 步每股临时成本:
与参与率 线性。临时冲击总成本:
临时冲击在交易后反转——你在执行期间付给订单簿,停止交易后价格回归预交易水平。这是交易员通过把计划摊得更长来最小化的成本。
(3) 时间风险 (价格扩散)
未受影响的价格按算术布朗运动 演化。总执行成本带有来自交易间价格漂移的随机分量:
成本方差是按每步时间加权的持仓平方之和。持有更多仓位更久就承受更多扩散风险。这是交易员通过快速交易——前置加权计划——来最小化的成本。
目标函数。选计划使下式最小:
其中 是风险厌恶参数。 只最小化期望成本(经理不在乎方差); 只最小化方差(经理希望尽快完成)。期望成本是:
首项 是永久冲击成本,与计划无关。只有临时冲击与时间风险两项取决于计划。
变量名一定要清楚: 是永久冲击系数 (单位:bps / 股), 是临时冲击系数 (单位:bps × time), 是价格扩散波动率,目标 是闭式解最小化的均值-方差泛函。
闭式轨迹
把 对 求偏导设为零,得二阶线性差分方程,连续时间极限的解是双曲余弦 (cosh) 轨迹:
其中 ,且
是紧迫度参数。 单位为时间倒数,决定计划前置加权的强度。两个极限:
lambda → 0 → κ → 0 → x_k = X × (1 - t_k/T)is TWAP. 风险中性的交易员把交易均匀分布到时间上。cosh 表达式在 时退化为线性 ramp。lambda → ∞ → κ → ∞ → x_kfront-loads to near-instant liquidation. 无限风险厌恶的交易员付无界冲击成本立即完成。真实经理在两个极端之间。
第 k 步的交易率 (连续时间近似):
形状:早期时窗交易率最高 (cosh 自变量大),沿时窗衰减,在 处为零。前置加权付更多冲击成本以吸收更少时间风险方差。
有效前沿
把 放 x 轴, 放 y 轴,参数化 的最优计划族构成曲线:
- :低 (TWAP),高 。
- :高 (瞬时清仓),低 。
- 中间 :凸前沿;每一点都是 Pareto 最优计划。
经理按风险承受力选 。VaR 预算紧的对冲基金偏好高 。资本耐心的养老金偏好低 。实务中 不直接征询——而是通过目标参与率或最大成本回撤分位(如「95% 的时候执行成本 < 30 bp」) 校准。
Fenced Python:闭式轨迹代码
25 行 Python 函数返回 AC 闭式 shares-remaining 计划。这是塞进每一个执行管理系统的生产级构件。AC 把 市场冲击 (market impact) 的两个分量——临时 冲击 和 永久 冲击——加上 滑点 / 时间 风险 (slippage / timing risk),统一在一个均值-方差泛函下。TWAP (时间加权平均价) 和 VWAP (成交量加权平均价) 是 AC 计划的两个边界——TWAP 是 风险中性极限,VWAP-tracking 是 AC 加上 U 型成交量调整后的实际生产形式。
import numpy as np
# Almgren-Chriss closed-form cosh trajectory; lambda=0 -> TWAP
def ac_trajectory(X, T, N, sigma, eta, gamma, lam):
"""离散 时间 AC 最优 执行 计划
返回 shares-remaining 数组 x 长度 N+1
边界 条件:x[0] = X, x[N] = 0
"""
dt = T / N
# 紧迫度 参数;AC 极限:lam -> 0 → kappa -> 0 → TWAP
if lam <= 0 or eta <= 0:
# 风险 中性 TWAP 计划(线性 ramp)
t = np.linspace(0.0, T, N + 1)
return X * (1.0 - t / T)
kappa = np.sqrt(lam * sigma**2 / eta)
t = np.linspace(0.0, T, N + 1)
# 闭式 cosh 轨迹
if kappa * T > 700.0:
# 防 lambda 大时 kappa*T 溢出
x = X * np.where(t < T, np.exp(-kappa * t), 0.0)
x[N] = 0.0
return x
denom = np.sinh(kappa * T)
x = X * np.sinh(kappa * (T - t)) / denom
x[N] = 0.0
return x
线性 AC 的实务偏离 (Inline-code 列表)
生产端执行系统很少直接 ship 原始线性-AC 闭式解。Inline-code 列表:三个标准偏离,按此顺序:
1. real impact is square-root, not linear — linear-eta-gamma model is empirically wrong;
AC closed form is a defensible starting trajectory
and a language; cite Almgren 2003 nonlinear extension
2. intraday volume is U-shaped — peaks at open + close; production schedules
modify AC to track realized volume profile
(VWAP-tracking, 4.5.3)
3. lambda is hard to elicit — practitioners pin lambda via target participation
rate or max-cost-drawdown rather than directly
(1) 真实冲击是平方根,不是线性。L2 经验事实:每笔冲击 。Almgren 2003 后续文章把 AC 扩展到非线性冲击 (Almgren 2003 "Optimal execution with nonlinear impact functions and trading-enhanced risk",Applied Mathematical Finance 10(1): 1-18);平方根冲击的最优计划定性相似(前置加权 + 轻微 U 型调整)但没有闭式解。生产系统要么数值求解平方根 AC,要么用线性-AC 闭式作为可辩护的起点轨迹加事后调整。定性结论——前置加权以平衡冲击与时间风险——在冲击函数形式变化下稳健;精确计划不稳健。
(2) 日内成交量是 U 型。成交量在开盘高峰(典型头 30 分钟占日成交量 15-20%)、盘中低谷、收盘高峰(典型最后 30 分钟占 20-25%)。AC 推导假设全日均匀成交量。生产系统用 VWAP-tracking 计划替代 AC——目标每分钟实际成交量占比预测的当日份额,被 AC 紧迫度参数调制。4.5.3 编目这个和其他执行算法变体。
(3) 难征询。经理不知道自己的 。变通:按参与率(「每 bar 成交量 10%」)或最大成本分位(「95% 时间 bp」) 参数化计划,反解 。AC 闭式给出 与参与率的显式关系,使转换良好定义。
第四个实务点:永久冲击 不直接可观测。必须从后续收益对累积自身有方向成交量的横截面回归估计。实务者用 L2 的交易后反转估计永久 / 临时 分配比例,从季度 TCA 数据重新拟合 和 。
算例:600519 100 万股清仓
CN A 股买入 1M 股 600519 贵州茅台,时窗 T = 30 min(N = 30 1-min bars, min)。CN 特定参数(典型为 US 大盘股的 ~2 倍,因为 A 股价差更宽 + 深度较浅):日 bp, bp·day·share, bp·share,。(作者注:在极端 值下 cosh 退化为 TWAP 或瞬时清仓;为了教学, 清晰显示中度前置加权形状。)
在每分钟单位下计算 。在上述参数 + 中度 调到 后,在 min 评估 cosh 轨迹(Markdown 表):
| (min) | (TWAP, ) | (AC, ) |
|---|---|---|
| 0 | 1,000,000 | 1,000,000 |
| 7.5 | 750,000 | ~704,000 |
| 15 | 500,000 | ~443,000 |
| 22.5 | 250,000 | ~215,000 |
| 30 | 0 | 0 |
AC 计划相对 TWAP 在早期时片前置加权 ~50K-60K 股——一个温和的前置加权,反映经理的轻度风险厌恶。在更高 () 上轨迹显著前置加权——超过 60% 的交易在时窗的前三分之一内完成。
定性观察:AC 计划相对 TWAP 在早期时片前置加权 ~5-10%。具体百分比取决于 ;形状在合理参数选择下稳健。
CN 微结构调整
CN 市场对线性 AC 的额外调整。AC 连续时间模型假设扩散价 dS = σ dW;CN 10% 日内涨跌停截断扩散尾,AC 方差项 在正常 regime(涨跌停远离当前价)下略微高估时间风险,在压力 regime(限价位逼近——方差是给定限价条件方差)下低估。实务调整:把 在日涨跌停距离截断,或按前一交易日 close-to-limit 距离条件化 。CN T+1 结算约束也影响 AC:session 内开仓的交易只能下一 session 平仓;这对跨多 session 的 AC 计划有意义(这时 session 内 AC 是多个级联优化中的一个)。
生产 EMS 集成
执行管理系统 (EMS) 把 AC 实现为它的一个调度选项(「AC 调度」、「IS 算法」、「实施差额」)。中信 CITIC、中信建投、国泰君安、海通、华泰的算法交易框架以「智能拆单」、「最优执行」、「IS 算法」等名字提供 AC 变体。实务者对线性-AC 闭式的标准调整:(a) regime 感知 (压力 regime 高,calm regime 低);(b) U 型日内成交量 profile(15-20% 开盘 + 10-15% 收盘高峰);(c) 参与率上限 15% 单 bar 成交量;(d) 程序化交易监管框架要求 AC-计划参数可审计;标为 AC 调度的订单通常生成单 bar 日志记录。
4.5.3 编目算法家族 (TWAP / VWAP / IS / POV / AC) 和选择标准。
Formula Explorer
x_k = X \cdot \frac{\sinh(\kappa \cdot (T - t_k))}{\sinh(\kappa \cdot T)}闭式 cosh 轨迹。把 从 0 到 5 变化: 是线性 TWAP ramp; 看到温和前置加权; 近似瞬时清仓。形状随 升高连续从 TWAP 移到瞬时清仓。
练习
Exercise
你需要在 T = 30 分钟内清仓 1,000,000 股 600519 贵州茅台(N = 30 1-min bars, min)。用 Almgren-Chriss 闭式 ,其中 。做四个计算并报告。
(i) 取 (风险中性);计算 min 的计划,确认它退化为 TWAP;报告每个时片的 shares-remaining。
(ii) 取 (轻度风险厌恶);用 bp / sqrt(min)、 bp / 股 / min;计算 、然后计划在相同五个时片;报告 shares-remaining 与相对 TWAP 的前置加权。
(iii) 取 (10 倍高);重新算 和计划;报告并与 (ii) 对比。
(iv) 对三个 设置分别计算 linear-AC 泛函下的期望总冲击成本 (bp):(用 bp / 股);说明哪个计划 低,哪个 低,确认 AC 有效前沿的直觉。
把所有四个答案放在一张表里。
提示
提示
衔接 L4
L3 给你 AC 成本泛函、闭式 cosh 轨迹、有效前沿、三个生产偏离(平方根 vs 线性、U 型成交量、 征询)。L4 把 L1 + L2 + L3 的成本栈插入 4.5.1 五层回测引擎。4.5.1 L2 的撮合模拟器函数 simulate_fills(orders, bar) 用了 ~10 bp round-trip 占位;L4 用 L1 + L2 + L3 的全成本栈替代占位。交付物:在拟上线 AUM 下的成本感知 Sharpe (而不是纸面 Sharpe)、容量数字(成本感知 Sharpe 降到纸面 Sharpe 一半的 AUM 阈值)、量化实盘执行质量对回测成本预测匹配度的六节交易成本分析 (TCA) 报告。L4 是本模块的集成压轴——也是投资经理在上线评审会上呈交的工件。
已涵盖组件
- 六个 Almgren-Chriss 设置变量内联代码列表 (
X,T,N,Δt = T/N,x_k,n_k = x_{k-1} - x_k),边界条件x_0 = X,x_N = 0。 - AC 成本泛函三个 KaTeX 块:永久冲击 、临时成本 、时间风险方差 ;目标 。
- 闭式 cosh 轨迹 KaTeX 块 ,;两个极限 (TWAP at , 瞬时清仓 at )。
- Python
ac_trajectory(X, T, N, sigma, eta, gamma, lam)返回 shares-remaining 数组。 - 五个时片
t_k = 0, 7.5, 15, 22.5, 30 min的算例 markdown 表,TWAP vs AC () shares-remaining。 - 三个实务偏离的内联代码列表(
real impact is square-root, not linear、intraday volume is U-shaped、lambda is hard to elicit),含跨引用Almgren 2003、VWAP-tracking、4.5.3。 - FormulaExplorer——闭式 cosh 轨迹。
- 练习——
600519100 万股 30 分钟清仓在三个 上的四个子任务。 - 两条递进 Hint。