3. 随机最优控制入门:HJB方程、随机微分方程、动态规划原理

各位同学,今天咱们聊点硬核的——随机最优控制。说实话,我刚入行做算法交易那会儿,觉得这东西就是数学家的玩具。直到有一次我在做高频做市策略,发现传统的最优控制根本扛不住市场噪音,才真正意识到随机性的威力。

这一章,我会带你从三个核心概念入手:随机微分方程(SDE)动态规划原理、以及HJB方程。它们就像三根柱子,撑起了整个随机最优控制的大厦。你想想看,没有这些工具,你怎么在充满随机性的市场中做决策?

3.1 随机微分方程:市场噪声的数学建模

先说说随机微分方程。说白了,它就是描述「带噪声的演化过程」的数学工具。在量化交易里,我们常用它来建模资产价格。

最经典的例子是几何布朗运动:

dS(t) = μ S(t) dt + σ S(t) dW(t)

这里:

  • μ 是漂移项,代表预期收益率
  • σ 是波动率,代表不确定性
  • dW(t) 是维纳过程的增量,也就是白噪声

嗯,这里要注意:dW(t) 不是普通的微分。它不可预测,方差随时间线性增长。我在项目中遇到过不少新手,直接把 dW(t) 当成 dt 来处理,结果模型全崩了。

避坑指南: 我曾经在回测一个期权做市策略时,把 SDE 的离散化步长设得太大,导致模拟出的价格路径严重失真。后来改用 Milstein 方法才解决问题。记住,SDE 的数值解法不是随便找个欧拉格式就能糊弄过去的。

3.2 动态规划原理:从后往前推的智慧

动态规划原理,说白了就是「从终点往回推」。你想想看,在随机环境中做决策,最怕的是什么?是信息不对称。你不知道未来会发生什么,但你知道当前的状态。

核心思想很简单:

  1. 把时间离散化成多个阶段
  2. 在每个阶段,根据当前状态做最优决策
  3. 从最后一个阶段开始,逆向递推

用数学语言表达,就是贝尔曼最优性原理:

V(t, x) = sup_{u} { f(t, x, u) dt + E[ V(t+dt, x+dx) ] }

这个公式看着吓人,其实意思很直白:当前的最优价值,等于立即回报加上未来价值的最优期望

个人经验: 我在做限价单簿的做市策略时,就用动态规划来优化报价深度。把订单簿的状态离散化成网格,然后从收盘时刻往前推。虽然计算量大了点,但效果比那些启发式算法好太多了。

3.3 HJB方程:连续时间的动态规划

好,现在我们把动态规划从离散时间推广到连续时间。这就引出了HJB方程——随机最优控制的核心工具。

HJB方程的全称是 Hamilton-Jacobi-Bellman 方程。它长这样:

∂V/∂t + sup_{u} { f(t, x, u) + (∂V/∂x) μ(t, x, u) + (1/2) σ²(t, x, u) (∂²V/∂x²) } = 0

别被这一堆偏导数吓到。我来拆解一下:

  • ∂V/∂t:价值函数随时间的变化
  • f(t, x, u):立即回报函数
  • (∂V/∂x) μ:状态变化带来的价值变化
  • (1/2) σ² (∂²V/∂x²):随机性带来的二阶效应——这是最关键的一项

为什么会多出这个二阶项?因为随机过程不像确定性过程那样平滑。你想想看,布朗运动的路径是处处不可导的,所以我们需要用伊藤引理来处理。

小技巧: 我个人习惯在求解HJB方程时,先猜一个解析解的形式,比如指数函数或二次函数。很多经典问题(如LQG控制)都有闭式解。实在不行再用数值方法,比如有限差分法。

3.4 三者之间的关系:一张图说清楚

这三个概念不是孤立的。它们的关系是这样的:

随机微分方程 (SDE) 描述状态演化 动态规划原理 逆向递推决策 HJB方程 连续时间最优控制 提供随机演化模型 连续极限推广 求解得到最优控制,反馈回SDE 三者闭环:SDE描述世界 → 动态规划提供框架 → HJB给出解析工具

你看这张图就明白了:SDE 描述世界怎么动,动态规划告诉我们怎么决策,HJB 则给出了连续时间下的解析工具。三者形成一个闭环。

3.5 实战案例:一个简单的做市策略

光说不练假把式。咱们来看一个简化版的做市策略,感受一下这些工具怎么用。

假设你是一个做市商,只交易一只股票。你的库存是 q(t),股票价格服从几何布朗运动。你的目标是最大化期望收益,同时惩罚过大的库存风险。

这个问题可以建模成:

dS = μ S dt + σ S dW
dq = u dt   (u 是你的交易速率)
目标:max E[ ∫ (p u - λ q²) dt ]

其中 p 是买卖价差,λ 是风险厌恶系数。

对应的HJB方程是:

∂V/∂t + sup_u { p u - λ q² + (∂V/∂q) u + μ S (∂V/∂S) + (1/2) σ² S² (∂²V/∂S²) } = 0

求解这个方程,你会得到最优交易速率:

u* = (p + ∂V/∂q) / (2λ)

这个结果很直观:价差越大,你越应该积极交易;库存风险越大,你越应该收敛

我的经验: 在实际项目中,我通常会把 λ 设成随时间变化的函数。比如在收盘前加大风险惩罚,避免隔夜持仓。这个调整虽然简单,但能显著提升夏普比率。

3.6 数值求解:有限差分法

大多数HJB方程没有解析解,得靠数值方法。我个人最常用的是有限差分法。

基本思路:

  1. 把状态空间离散成网格
  2. 用差分近似代替偏导数
  3. 从终端时刻开始逆向迭代

一个简单的Python伪代码:

# 初始化网格
S_grid = np.linspace(S_min, S_max, N_S)
q_grid = np.linspace(q_min, q_max, N_q)
V = np.zeros((N_T, N_S, N_q))

# 终端条件
V[-1, :, :] = 0

# 逆向迭代
for t in range(N_T-2, -1, -1):
    for i in range(N_S):
        for j in range(N_q):
            # 计算偏导数(差分近似)
            dV_dq = (V[t+1, i, j+1] - V[t+1, i, j-1]) / (2 * dq)
            dV_dS = (V[t+1, i+1, j] - V[t+1, i-1, j]) / (2 * dS)
            d2V_dS2 = (V[t+1, i+1, j] - 2*V[t+1, i, j] + V[t+1, i-1, j]) / (dS**2)
            
            # 求解最优控制
            u_opt = (p + dV_dq) / (2 * λ)
            
            # 更新价值函数
            V[t, i, j] = (p*u_opt - λ*q_grid[j]**2) * dt + V[t+1, i, j]
注意: 这个代码只是教学演示。实际应用中,你还需要处理边界条件、稳定性检查、以及更高效的迭代算法(比如策略迭代)。我曾经因为边界条件没处理好,导致价值函数在边界处发散,浪费了两天调试时间。

3.7 本章小结

咱们这一章聊了不少东西。来捋一捋:

  • SDE 是描述随机世界的语言,做量化交易离不开它
  • 动态规划 是决策的骨架,从后往前推的思路永不过时
  • HJB方程 是连续时间下的利器,把动态规划升华到了新高度

说实话,这三个概念我当年学的时候也觉得抽象。但当你真正在项目中用它们解决过问题之后,就会发现它们其实很自然。就像骑自行车,一开始觉得平衡难,学会了就再也忘不掉。

下一章,我们会把这些工具应用到 Mean Field Game 中,看看当无数个做市商同时博弈时,会发生什么有趣的现象。


公众号:蓝海资料掘金营,微信deep3321