Almgren-Chriss 最优交易执行¶
背景¶
清仓大额头寸时存在时间上的权衡:快速卖出可以减少未来价格波动带来的风险敞口,但集中交易会增大临时市场冲击。连续时间 Almgren-Chriss 基准模型用二次代价描述这一权衡,并且具有闭式最优计划。
本例在一个交易日内卖出 100,000 股。持仓、交易速度和成本系数都经过归一化,因此目标值只是无量纲数值基准,而不是货币成本估计。
问题定义¶
令 \(x(t)\) 为尚未卖出的初始订单比例,\(v(t)\) 为以“初始持仓比例/天”表示的卖出速率。持仓动力学为
完全清仓要求
归一化均值-方差目标为
其中 \(\eta=0.05\) 是临时市场冲击权重,\(\rho=0.20\) 是持仓风险权重。路径约束为
对于 \(Q=100{,}000\) 股的订单,图中显示的实际持仓和卖出速率分别是 \(X=Qx\) 与 \(V=Qv\)。
变量、参数与单位¶
| 符号 | 含义 | 数值或单位 |
|---|---|---|
| \(t\) | 执行窗口内的时间 | 交易日 |
| \(x\) | 剩余持仓比例 | 无量纲 |
| \(v\) | 除以初始持仓后的卖出速率 | 天⁻¹ |
| \(X=Qx\) | 剩余股数 | 股 |
| \(V=Qv\) | 实际卖出速率 | 股/天 |
| \(Q\) | 初始订单规模 | \(100{,}000\) 股 |
| \(T\) | 执行时域 | \(1\) 个交易日 |
| \(\eta\) | 归一化临时冲击权重 | \(0.05\) |
| \(\rho\) | 归一化持仓风险权重 | \(0.20\) |
| \(J\) | 归一化执行目标 | 无量纲 |
解析最优解¶
由于 \(v=-\dot x\),Euler-Lagrange 方程为
代入两个持仓端点可得
无约束解析成本为
最大卖出速率出现在初始时刻:
因此当前速率上限是特意设置为不激活的。若进一步降低上限,无约束闭式轨迹将不再是最优解。
建模选择¶
该基准的基础假设是价格期望漂移为零。价格不确定性产生正比于 \(\int x^2\,\mathrm dt\) 的均值-方差惩罚,临时市场冲击则产生 \(\int v^2\,\mathrm dt\) 项。
线性永久冲击被省略,是因为在完整、单调清仓条件下,它对路径无关:
它只会给总期望成本增加一个常数,不会改变本例的最优计划。脚本采用 \(48\times4\) Lobatto 网格表示平滑解,并使用解析轨迹作为初始猜测。
独立验证¶
脚本在 4,001 个时刻重构持仓和卖出速率,分别与闭式解直接比较。脚本还用密集梯形积分重新计算解析目标,并检查全部路径边界。因此验证覆盖完整轨迹,而不仅是终端持仓。
验证结果¶
| 指标 | 验证值 |
|---|---|
| 数值目标 | \(0.1037314721\) |
| 密集积分解析目标 | \(0.1037314807\) |
| 最大持仓误差 | \(6.656\times10^{-9}\) |
| 最大卖出速率误差 | \(1.206\times10^{-6}\) 天⁻¹ |
| 数值初始卖出速率 | \(207{,}462.824\) 股/天 |
| 卖出速率上限 | \(300{,}000\) 股/天 |
前置卖出的计划先快速降低持仓风险,再随剩余头寸减少逐渐放慢。数值轨迹与解析轨迹的差异远低于脚本设置的验证容差。

适用边界¶
模型假设连续交易、零漂移、常数系数、二次临时冲击和确定执行时域。它未包含买卖价差、费用、离散交易单位、成交量变化、收益预测信号、随机流动性、非线性或瞬态冲击以及成交风险。由于参数和目标均已归一化,输出不是实盘交易建议,也不能直接估计货币计价的执行缺口。
运行示例¶
无界面运行并保存图片:
system, phase = build_problem()
guess = initial_guess(phase)
solution = solve_problem(system, guess)
plot_solution(solution)
源代码¶
完整可运行示例见:
examples/optimal_trade_execution.py。