← 返回模块
4.5.2.3beta 可读 · 未来付费校验通过内容版本 2026-05-28

Almgren-Chriss 成本模型

4.5.2 · 交易成本与市场冲击 · 量化全流程

中信 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 (终点,卖单清掉 / 买单建满) 锚定问题。决策变量是交易计划 (x0,x1,,xN)(x_0, x_1, \ldots, x_N)。TWAP / 线性 计划 是 xk=X×(1k/N)x_k = X \times (1 - k/N),即 nk=X/Nn_k = X/N 等大笔。问题是能不能比 TWAP 做得更好,如果能,什么计划最小化均值-方差成本。

成本泛函

Almgren-Chriss 把执行成本拆成三个可加部分。每个对应交易员为执行的不同维度付出的代价。

(1) 永久冲击

永久冲击按每笔交易线性偏移未受影响的市场价。第 k 步后价格:

Sk=S0γjknjS_k = S_0 - \gamma \sum_{j \leq k} n_j

(卖单;买单翻号)。永久冲击系数 γ\gamma 单位 bps / 股。整笔清仓结束时累计永久冲击是 γ×X\gamma \times X与计划无关。这意味着永久冲击是交易员无法用换计划规避的固定成本——只有少交易才能少付。

(2) 临时冲击

临时冲击在每笔交易瞬间收取每股额外成本。第 k 步每股临时成本:

h(nk/Δt)=ηnkΔth(n_k / \Delta t) = \eta \cdot \frac{n_k}{\Delta t}

与参与率 nk/Δtn_k / \Delta t 线性。临时冲击总成本:

knkηnkΔt=ηΔtknk2\sum_k n_k \cdot \eta \cdot \frac{n_k}{\Delta t} = \frac{\eta}{\Delta t} \sum_k n_k^2

临时冲击在交易后反转——你在执行期间付给订单簿,停止交易后价格回归预交易水平。这是交易员通过把计划摊得更长来最小化的成本。

(3) 时间风险 (价格扩散)

未受影响的价格按算术布朗运动 dS=σdWdS = \sigma dW 演化。总执行成本带有来自交易间价格漂移的随机分量:

Var[cost]=σ2Δtkxk2\text{Var}[\text{cost}] = \sigma^2 \cdot \Delta t \cdot \sum_k x_k^2

成本方差是按每步时间加权的持仓平方之和。持有更多仓位更久就承受更多扩散风险。这是交易员通过快速交易——前置加权计划——来最小化的成本。

目标函数。选计划使下式最小:

U(x)=E[cost]+λVar[cost]U(\mathbf{x}) = \mathbb{E}[\text{cost}] + \lambda \cdot \text{Var}[\text{cost}]

其中 λ0\lambda \geq 0 是风险厌恶参数。λ=0\lambda = 0 只最小化期望成本(经理不在乎方差);λ\lambda \to \infty 只最小化方差(经理希望尽快完成)。期望成本是:

E[cost]=12γX2+ηΔtknk2\mathbb{E}[\text{cost}] = \frac{1}{2} \gamma X^2 + \frac{\eta}{\Delta t} \sum_k n_k^2

首项 γX2/2\gamma X^2 / 2永久冲击成本,与计划无关。只有临时冲击与时间风险两项取决于计划。

变量名一定要清楚:γ\gamma 是永久冲击系数 (单位:bps / 股),η\eta 是临时冲击系数 (单位:bps × time),σ\sigma 是价格扩散波动率,目标 U=E[cost]+λ×Var[cost]U = E[\text{cost}] + \lambda \times \text{Var}[\text{cost}] 是闭式解最小化的均值-方差泛函。

闭式轨迹

UUxkx_k 求偏导设为零,得二阶线性差分方程,连续时间极限的解是双曲余弦 (cosh) 轨迹:

xk=X×sinh(κ×(Ttk))sinh(κ×T)x_k = X \times \frac{\sinh(\kappa \times (T - t_k))}{\sinh(\kappa \times T)}

其中 tk=k×Δtt_k = k \times \Delta t,且

κ=λσ2η\kappa = \sqrt{\frac{\lambda \sigma^2}{\eta}}

紧迫度参数。κ\kappa 单位为时间倒数,决定计划前置加权的强度。两个极限:

  • lambda → 0 → κ → 0 → x_k = X × (1 - t_k/T) is TWAP.​ 风险中性的交易员把交易均匀分布到时间上。cosh 表达式在 κT0\kappa T \to 0 时退化为线性 ramp。
  • lambda → ∞ → κ → ∞ → x_k front-loads to near-instant liquidation.​ 无限风险厌恶的交易员付无界冲击成本立即完成。真实经理在两个极端之间。

第 k 步的交易率 (连续时间近似):

nk/ΔtXκcosh(κ(Ttk))sinh(κT)n_k / \Delta t \approx X \cdot \kappa \cdot \frac{\cosh(\kappa \cdot (T - t_k))}{\sinh(\kappa \cdot T)}

形状:早期时窗交易率最高 (cosh 自变量大),沿时窗衰减,在 tk=Tt_k = T 处为零。前置加权付更多冲击成本以吸收更少时间风险方差。

有效前沿

E[cost]\mathbb{E}[\text{cost}] 放 x 轴,σ[cost]\sigma[\text{cost}] 放 y 轴,参数化 λ\lambda 的最优计划族构成曲线:

  • λ=0\lambda = 0:低 E[cost]\mathbb{E}[\text{cost}] (TWAP),高 σ[cost]\sigma[\text{cost}]
  • λ\lambda \to \infty:高 E[cost]\mathbb{E}[\text{cost}] (瞬时清仓),低 σ[cost]\sigma[\text{cost}]
  • 中间 λ\lambda:凸前沿;每一点都是 Pareto 最优计划。

经理按风险承受力选 λ\lambda。VaR 预算紧的对冲基金偏好高 λ\lambda。资本耐心的养老金偏好低 λ\lambda。实务中 λ\lambda 直接征询——而是通过目标参与率或最大成本回撤分位(如「95% 的时候执行成本 < 30 bp」) 校准。

Fenced Python:闭式轨迹代码

25 行 Python 函数返回 AC 闭式 shares-remaining 计划。这是塞进每一个执行管理系统的生产级构件。AC 把 市场冲击 (market impact) 的两个分量——临时 冲击 和 永久 冲击——加上 滑点 / 时间 风险 (slippage / timing risk),统一在一个均值-方差泛函下。TWAP (时间加权平均价) 和 VWAP (成交量加权平均价) 是 AC 计划的两个边界——TWAP 是 λ=0\lambda = 0 风险中性极限,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 经验事实:每笔冲击 Y×σ×Q/V\approx Y \times \sigma \times \sqrt{Q/V}。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) λ\lambda 难征询。经理不知道自己的 λ\lambda。变通:按参与率(「每 bar 成交量 10%」)或最大成本分位(「95% 时间 30\leq 30 bp」) 参数化计划,反解 λ\lambda。AC 闭式给出 λ\lambda 与参与率的显式关系,使转换良好定义。

第四个实务点:永久冲击 γ\gamma 不直接可观测。必须从后续收益对累积自身有方向成交量的横截面回归估计。实务者用 L2 的交易后反转估计永久 / 临时 分配比例,从季度 TCA 数据重新拟合 γ\gammaη\eta

算例:600519 100 万股清仓

CN A 股买入 1M600519 贵州茅台,时窗 T = 30 minN = 30 1-min bars,Δt=1\Delta t = 1 min)。CN 特定参数(典型为 US 大盘股的 ~2 倍,因为 A 股价差更宽 + 深度较浅):日 σ=250\sigma = 250 bp,η=5×106\eta = 5 \times 10^{-6} bp·day·share,γ=5×107\gamma = 5 \times 10^{-7} bp·share,λ=1×106\lambda = 1 \times 10^{-6}。(作者注:在极端 κT\kappa T 值下 cosh 退化为 TWAP 或瞬时清仓;为了教学,κT1\kappa T \approx 1 清晰显示中度前置加权形状。)

在每分钟单位下计算 κ\kappa。在上述参数 + 中度 λ\lambda 调到 κT1\kappa T \approx 1 后,在 tk=0,7.5,15,22.5,30t_k = 0, 7.5, 15, 22.5, 30 min 评估 cosh 轨迹(Markdown 表):

tkt_k (min)xkx_k (TWAP, λ=0\lambda = 0)xkx_k (AC, κT1\kappa T \approx 1)
01,000,0001,000,000
7.5750,000~704,000
15500,000~443,000
22.5250,000~215,000
3000

AC 计划相对 TWAP 在早期时片前置加权 ~50K-60K 股——一个温和的前置加权,反映经理的轻度风险厌恶。在更高 λ=105\lambda = 10^{-5} (κT4.9\kappa T \approx 4.9) 上轨迹显著前置加权——超过 60% 的交易在时窗的前三分之一内完成。

定性观察:AC 计划相对 TWAP 在早期时片前置加权 ~5-10%。具体百分比取决于 κT\kappa T形状在合理参数选择下稳健。

CN 微结构调整

CN 市场对线性 AC 的额外调整。AC 连续时间模型假设扩散价 dS = σ dW;CN 10% 日内涨跌停截断扩散尾,AC 方差项 σ2×Δt×xk2\sigma^2 \times \Delta t \times \sum x_k^2 在正常 regime(涨跌停远离当前价)下略微高估时间风险,在压力 regime(限价位逼近——方差是给定限价条件方差)下低估。实务调整:把 σ\sigma 在日涨跌停距离截断,或按前一交易日 close-to-limit 距离条件化 σ\sigma。CN T+1 结算约束也影响 AC:session 内开仓的交易只能下一 session 平仓;这对跨多 session 的 AC 计划有意义(这时 session 内 AC 是多个级联优化中的一个)。

生产 EMS 集成

执行管理系统 (EMS) 把 AC 实现为它的一个调度选项(「AC 调度」、「IS 算法」、「实施差额」)。中信 CITIC、中信建投、国泰君安、海通、华泰的算法交易框架以「智能拆单」、「最优执行」、「IS 算法」等名字提供 AC 变体。实务者对线性-AC 闭式的标准调整:(a) regime 感知 σ\sigma(压力 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 轨迹。把 κT\kappa T 从 0 到 5 变化:κT=0\kappa T = 0 是线性 TWAP ramp;κT1\kappa T \approx 1 看到温和前置加权;κT\kappa T \to \infty 近似瞬时清仓。形状随 λ\lambda 升高连续从 TWAP 移到瞬时清仓。

练习

Exercise

你需要在 T = 30 分钟内清仓 1,000,000600519 贵州茅台(N = 30 1-min bars,Δt=1\Delta t = 1 min)。用 Almgren-Chriss 闭式 xk=X×sinh(κ×(Ttk))/sinh(κ×T)x_k = X \times \sinh(\kappa \times (T - t_k)) / \sinh(\kappa \times T),其中 κ=λ×σ2/η\kappa = \sqrt{\lambda \times \sigma^2 / \eta}。做四个计算并报告。

(i) 取 λ=0\lambda = 0 (风险中性);计算 tk=0,7.5,15,22.5,30t_k = 0, 7.5, 15, 22.5, 30 min 的计划,确认它退化为 TWAP;报告每个时片的 shares-remaining。

(ii) 取 λ=1×106\lambda = 1 \times 10^{-6} (轻度风险厌恶);用 σ=5\sigma = 5 bp / sqrt(min)、η=2.5×107\eta = 2.5 \times 10^{-7} bp / 股 / min;计算 κ\kappa、然后计划在相同五个时片;报告 shares-remaining 与相对 TWAP 的前置加权。

(iii) 取 λ=1×105\lambda = 1 \times 10^{-5} (10 倍高);重新算 κ\kappa 和计划;报告并与 (ii) 对比。

(iv) 对三个 λ\lambda 设置分别计算 linear-AC 泛函下的期望总冲击成本 (bp):(η/Δt)×nk2+γ×X2/2(\eta / \Delta t) \times \sum n_k^2 + \gamma \times X^2 / 2(用 γ=2.5×108\gamma = 2.5 \times 10^{-8} bp / 股);说明哪个计划 E[cost]\mathbb{E}[\text{cost}] 低,哪个 Var[cost]\text{Var}[\text{cost}] 低,确认 AC 有效前沿的直觉。

把所有四个答案放在一张表里。

提示
(i):λ=0κ=0\lambda = 0 \to \kappa = 0。cosh 表达式 sinh(κ(Tt))/sinh(κT)(Tt)/T\sinh(\kappa(T-t)) / \sinh(\kappa T) \to (T - t)/Tκ0\kappa \to 0。所以 xk=X×(1tk/T)x_k = X \times (1 - t_k/T)t=0t = 0:1,000,000;7.5:750,000;15:500,000;22.5:250,000;30:0。
提示
(ii):κ=106×25/2.5e7=10\kappa = \sqrt{10^{-6} \times 25 / 2.5\text{e}{-7}} = 10 /sqrt(min);κT=300\kappa T = 300——瞬时清仓。缩参数到 κT1\kappa T \approx 1。(iv):E[cost] 随 λ\lambda 升;Var[cost] 缩小。

衔接 L4

L3 给你 AC 成本泛函、闭式 cosh 轨迹、有效前沿、三个生产偏离(平方根 vs 线性、U 型成交量、λ\lambda 征询)。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 块:永久冲击 Sk=S0γnjS_k = S_0 - \gamma \sum n_j、临时成本 (η/Δt)nk2(\eta / \Delta t) \sum n_k^2、时间风险方差 σ2Δtxk2\sigma^2 \Delta t \sum x_k^2;目标 U=E[cost]+λ×Var[cost]U = E[\text{cost}] + \lambda \times \text{Var}[\text{cost}]
  • 闭式 cosh 轨迹 KaTeX 块 xk=X×sinh(κ(Ttk))/sinh(κT)x_k = X \times \sinh(\kappa (T - t_k)) / \sinh(\kappa T)κ=λσ2/η\kappa = \sqrt{\lambda \sigma^2 / \eta};两个极限 (TWAP at λ0\lambda \to 0, 瞬时清仓 at λ\lambda \to \infty)。
  • 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 (κT1\kappa T \approx 1) shares-remaining。
  • 三个实务偏离的内联代码列表(real impact is square-root, not linearintraday volume is U-shapedlambda is hard to elicit),含跨引用 Almgren 2003VWAP-tracking4.5.3
  • FormulaExplorer——闭式 cosh 轨迹。
  • 练习——600519 100 万股 30 分钟清仓在三个 λ\lambda 上的四个子任务。
  • 两条递进 Hint。