跳转至

Almgren-Chriss 最优交易执行

背景

清仓大额头寸时存在时间上的权衡:快速卖出可以减少未来价格波动带来的风险敞口,但集中交易会增大临时市场冲击。连续时间 Almgren-Chriss 基准模型用二次代价描述这一权衡,并且具有闭式最优计划。

本例在一个交易日内卖出 100,000 股。持仓、交易速度和成本系数都经过归一化,因此目标值只是无量纲数值基准,而不是货币成本估计。

问题定义

\(x(t)\) 为尚未卖出的初始订单比例,\(v(t)\) 为以“初始持仓比例/天”表示的卖出速率。持仓动力学为

\[ \dot x(t)=-v(t), \qquad 0\le t\le T=1. \]

完全清仓要求

\[ x(0)=1, \qquad x(T)=0. \]

归一化均值-方差目标为

\[ \min_{x,v}\;J=\int_0^T \left[\eta v(t)^2+\rho x(t)^2\right]\,\mathrm dt, \]

其中 \(\eta=0.05\) 是临时市场冲击权重,\(\rho=0.20\) 是持仓风险权重。路径约束为

\[ 0\le x(t)\le1, \qquad 0\le v(t)\le3. \]

对于 \(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 方程为

\[ \ddot x-\kappa^2x=0, \qquad \kappa=\sqrt{\frac{\rho}{\eta}}=2. \]

代入两个持仓端点可得

\[ x^*(t)=\frac{\sinh\!\left(\kappa(T-t)\right)}{\sinh(\kappa T)}, \]
\[ v^*(t)= \frac{\kappa\cosh\!\left(\kappa(T-t)\right)}{\sinh(\kappa T)}. \]

无约束解析成本为

\[ J^*=\eta\kappa\coth(\kappa T)\approx0.1037314721. \]

最大卖出速率出现在初始时刻:

\[ v^*(0)=\kappa\coth(\kappa T)\approx2.074629<3. \]

因此当前速率上限是特意设置为不激活的。若进一步降低上限,无约束闭式轨迹将不再是最优解。

建模选择

该基准的基础假设是价格期望漂移为零。价格不确定性产生正比于 \(\int x^2\,\mathrm dt\) 的均值-方差惩罚,临时市场冲击则产生 \(\int v^2\,\mathrm dt\) 项。

线性永久冲击被省略,是因为在完整、单调清仓条件下,它对路径无关:

\[ \int_0^T \gamma X(t)V(t)\,\mathrm dt =\frac{\gamma Q^2}{2}. \]

它只会给总期望成本增加一个常数,不会改变本例的最优计划。脚本采用 \(48\times4\) Lobatto 网格表示平滑解,并使用解析轨迹作为初始猜测。

独立验证

脚本在 4,001 个时刻重构持仓和卖出速率,分别与闭式解直接比较。脚本还用密集梯形积分重新计算解析目标,并检查全部路径边界。因此验证覆盖完整轨迹,而不仅是终端持仓。

验证结果

指标 验证值
数值目标 \(0.1037314721\)
密集积分解析目标 \(0.1037314807\)
最大持仓误差 \(6.656\times10^{-9}\)
最大卖出速率误差 \(1.206\times10^{-6}\) 天⁻¹
数值初始卖出速率 \(207{,}462.824\) 股/天
卖出速率上限 \(300{,}000\) 股/天

前置卖出的计划先快速降低持仓风险,再随剩余头寸减少逐渐放慢。数值轨迹与解析轨迹的差异远低于脚本设置的验证容差。

剩余持仓、卖出速率、临时冲击成本与持仓风险成本

适用边界

模型假设连续交易、零漂移、常数系数、二次临时冲击和确定执行时域。它未包含买卖价差、费用、离散交易单位、成交量变化、收益预测信号、随机流动性、非线性或瞬态冲击以及成交风险。由于参数和目标均已归一化,输出不是实盘交易建议,也不能直接估计货币计价的执行缺口。

运行示例

python -m examples.optimal_trade_execution

无界面运行并保存图片:

python -m examples.optimal_trade_execution --save optimal-trade-execution.png --no-show
system, phase = build_problem()
guess = initial_guess(phase)
solution = solve_problem(system, guess)
plot_solution(solution)

源代码

完整可运行示例见: examples/optimal_trade_execution.py