3. 数学基础:随机最优控制与HJB方程
好,咱们进入第三讲。说实话,这一讲是整门课最硬核的数学基础。你可能会觉得有点枯燥,但相信我——没有这个基础,后面那些看起来炫酷的策略,其实都是空中楼阁。
我自己刚入行时,也试图跳过这些数学推导,直接写代码。结果呢?策略回测漂亮,实盘一跑就崩。后来我才明白,高频交易本质上就是一个随机最优控制问题。你不理解HJB方程,就永远不知道你的策略到底在优化什么。
3.1 为什么高频交易需要随机控制?
先问个问题:你在做高频交易时,面临的最大挑战是什么?
我个人觉得,是不确定性。订单流随机、价格波动随机、对手行为随机。你没法预测下一秒会发生什么,但你必须做出决策——报单还是不报?撤单还是不撤?
这其实就是随机最优控制的标准场景:
- 状态变量:当前持仓、订单簿状态、市场微观结构
- 控制变量:报价价格、报单数量、撤单时机
- 随机扰动:外来订单流、价格跳跃、信息事件
- 目标函数:最大化期望收益、最小化风险、控制库存
说白了,你就是在做一个带随机性的动态优化。而HJB方程,就是解决这类问题的核心工具。
3.2 从确定性到随机性:一个直观的跳跃
如果你学过经典最优控制,应该记得确定性系统的HJB方程长这样:
-∂V/∂t = max_u { F(x,u) + (∂V/∂x) · f(x,u) }
其中V是值函数,x是状态,u是控制,f是系统动力学。
但到了高频交易里,系统是随机的。价格不是平滑变化的,而是带扩散项的。所以我们需要引入伊藤微积分。
我记得第一次接触伊藤引理时,整个人是懵的。为什么多了一个二阶项?后来做了一次模拟才明白——随机过程的二阶项不是小量,它贡献了方差。在高频交易里,方差就是风险,就是成本。
随机HJB方程的标准形式:
-∂V/∂t = max_u { F(x,u) + (∂V/∂x) · μ(x,u) + ½ tr( σ(x,u)σᵀ(x,u) · ∂²V/∂x² ) }
注意那个½ tr(...)项,这就是伊藤修正项。它捕捉了随机性对值函数的影响。
3.3 高频交易中的典型HJB问题
咱们来看一个具体的例子——最优做市商问题。这是我在项目中实际做过的。
假设你是一个做市商,在订单簿两边同时报价。你的状态变量是:
- 库存 q:当前持有的资产数量
- 现金 x:当前现金余额
- 时间 t:剩余交易时间
你的控制变量是:
- 买价 p_b:你愿意买入的价格
- 卖价 p_a:你愿意卖出的价格
随机扰动来自:
- 外来订单到达(泊松过程)
- 价格波动(布朗运动)
目标函数:最大化终端财富的期望效用,同时惩罚库存风险。
对应的HJB方程:
-∂V/∂t = max_{p_b, p_a} {
λ_b(p_b) · [ V(x+p_b, q-1, t) - V(x,q,t) ] +
λ_a(p_a) · [ V(x+p_a, q+1, t) - V(x,q,t) ] +
μ · ∂V/∂x + ½ σ² · ∂²V/∂x²
}
其中λ_b和λ_a是到达率,依赖于你的报价。
嗯,这里要注意:这个方程看起来复杂,但它的结构其实很清晰——左边是时间衰减,右边是控制带来的跳跃收益加上扩散项。
3.4 求解HJB方程的实用方法
说实话,解析解很少见。大多数情况下,你需要数值求解。我常用的方法有:
| 方法 | 适用场景 | 精度 | 速度 |
|---|---|---|---|
| 有限差分法 | 低维状态空间(1-2维) | 高 | 中等 |
| 策略迭代 | 控制空间离散 | 高 | 慢 |
| 深度强化学习 | 高维状态空间 | 中等 | 快(推理时) |
| 近似动态规划 | 大规模问题 | 中等 | 快 |
我个人习惯先用有限差分法在小规模问题上验证模型,再切换到深度强化学习做大规模部署。
3.5 避坑指南:HJB方程应用的常见错误
我踩过的坑不少,挑几个典型的说说:
- 忽略二阶项:有些人为了简化,直接去掉伊藤修正项。结果策略对波动率完全不敏感,一遇到高波动行情就崩。
- 时间离散化太粗:高频交易的时间尺度是微秒级的。如果你用秒级离散化,HJB方程的解会严重失真。
- 假设参数恒定:市场微观结构是时变的。波动率、到达率都在变。你需要在线估计这些参数,或者用鲁棒控制。
- 忽略执行成本:HJB方程假设你可以瞬间调整控制。但实际中,撤单、改单都有延迟和成本。
我曾经在一个项目中,用固定参数的HJB方程做做市策略。回测漂亮,实盘第一天就亏了。后来发现,那天市场波动率突然翻倍,而我的策略还在用旧参数。从那以后,我所有策略都加了在线参数估计模块。
3.6 知识体系总览
下面这张图,是我自己总结的HJB方程在高频交易中的应用框架。你把它存下来,后面每一讲都会用到。
3.7 一个简单的代码示例
最后,给你一个用有限差分法求解一维HJB方程的Python代码片段。这是做市商问题的简化版:
import numpy as np
def solve_hjb_one_dim(S, T, Nx, Nt, r, sigma, gamma):
"""
求解一维HJB方程(简化做市商问题)
S: 价格网格
T: 时间horizon
Nx: 空间网格数
Nt: 时间网格数
r: 无风险利率
sigma: 波动率
gamma: 风险厌恶系数
"""
dx = (S[-1] - S[0]) / (Nx - 1)
dt = T / Nt
# 初始化值函数
V = np.zeros((Nt+1, Nx))
V[-1, :] = 0 # 终端条件
# 向后迭代
for n in range(Nt-1, -1, -1):
# 空间导数(中心差分)
dVdx = np.gradient(V[n+1], dx)
d2Vdx2 = np.gradient(dVdx, dx)
# HJB方程更新(简化版,忽略控制优化)
V[n] = V[n+1] + dt * (
r * S * dVdx +
0.5 * sigma**2 * S**2 * d2Vdx2 -
gamma * V[n+1] # 风险惩罚项
)
return V
# 使用示例
S = np.linspace(90, 110, 101)
V = solve_hjb_one_dim(S, T=1.0, Nx=101, Nt=1000,
r=0.05, sigma=0.2, gamma=0.1)
这个代码很粗糙,但展示了核心逻辑。实际项目中,你需要在每个时间步求解一个优化问题,找到最优控制u*。
好了,这一讲就到这里。HJB方程是高频交易策略的理论基石。你花时间把它吃透,后面每一讲都会轻松很多。
公众号:蓝海资料掘金营,微信deep3321