4. 数学基础:动态规划与庞特里亚金极大值原理

好,咱们进入第四讲。这一章是数学基础,但你别觉得枯燥。动态规划和庞特里亚金极大值原理,说白了就是高频交易里“找最优路径”的两把刷子。我个人习惯把动态规划看作“向后看”的智慧,而庞特里亚金极大值原理是“向前看”的勇气。今天咱们就把这两把刷子怎么用,掰扯清楚。

4.1 动态规划:从后往前推的决策艺术

动态规划(DP)这个名字听起来高大上,其实核心就一句话:最优决策的子结构也是最优的。你想想看,如果你要找到从北京到上海的最短路径,那路径上的每一个中间点到上海的最短路径,也一定是全局最优的一部分。这就是贝尔曼最优性原理。

在高频交易里,我们经常遇到这样的问题:

  • 当前持仓多少?
  • 接下来1秒内,我该下多大的单?
  • 怎么在控制冲击成本的同时,把订单执行完?

这些问题都可以建模成一个多阶段决策过程。我早期做算法交易时,就踩过这个坑——直接用贪心算法,结果冲击成本高得吓人。后来换成动态规划,效果立竿见影。

4.1.1 贝尔曼方程

动态规划的核心是贝尔曼方程。它长这样:

V(s) = max_{a} [ R(s, a) + γ * V(s') ]

解释一下:

  • V(s):在状态s下的最优价值
  • a:你采取的动作(比如下单量)
  • R(s, a):立即回报(比如成交的收益)
  • γ:折扣因子(未来的钱不如现在的钱值钱)
  • V(s'):下一个状态s'的最优价值

说白了,就是“当前动作的收益 + 未来最优收益的折现”。

核心要点:动态规划要求你知道所有未来的状态转移概率。这在高频交易里很难,因为市场是随机的。但如果你能建模出一个马尔可夫决策过程(MDP),DP就是你的利器。

4.1.2 一个简单的交易例子

假设你只有1秒的时间窗口,要把1000股卖掉。市场深度只有3档。你可以选择:

  • 一次性全砸(冲击成本大)
  • 分几次卖(时间风险大)

用动态规划,我们这样建模:

状态:剩余时间 t,剩余股票数 q
动作:本次卖出的股数 a
回报:成交价格 × a - 冲击成本
转移:t-1, q-a

代码实现(伪代码):

def dp_trade(T, Q, price_func, impact_func):
    # T: 剩余时间步
    # Q: 剩余股票数
    V = [[0] * (Q+1) for _ in range(T+1)]
    action = [[0] * (Q+1) for _ in range(T+1)]
    
    for t in range(1, T+1):
        for q in range(1, Q+1):
            best_val = -inf
            best_a = 0
            for a in range(0, q+1):
                reward = price_func(a) * a - impact_func(a)
                future_val = V[t-1][q-a]
                val = reward + future_val
                if val > best_val:
                    best_val = val
                    best_a = a
            V[t][q] = best_val
            action[t][q] = best_a
    return V, action

嗯,这里要注意:状态空间爆炸。如果时间步是100,股票数量是10000,那状态就是100×10000=100万个。再算上动作空间,计算量就上去了。我在项目中遇到过这种情况,最后用了近似动态规划(ADP)才搞定。

4.2 庞特里亚金极大值原理:连续时间的利器

动态规划适合离散时间、离散状态。但高频交易里,时间几乎是连续的。这时候,庞特里亚金极大值原理(PMP)就登场了。

PMP是俄罗斯数学家庞特里亚金在1956年提出的。它的核心思想是:最优控制路径上,存在一个“协态变量”,它像影子一样跟着状态走,告诉你每一步该怎么调整。

4.2.1 数学形式

假设我们有一个连续时间系统:

dx/dt = f(x, u, t)
目标:最大化 J = ∫ L(x, u, t) dt + φ(x(T))

其中:

  • x:状态变量(比如持仓量)
  • u:控制变量(比如下单速率)
  • L:运行收益(比如成交收益)
  • φ:终端收益(比如清仓后的剩余价值)

PMP告诉我们:

  1. 定义哈密顿函数:H = L + λ * f
  2. 最优控制u*必须最大化H
  3. 协态变量λ满足:dλ/dt = -∂H/∂x
  4. 边界条件:λ(T) = ∂φ/∂x(T)

我的经验:PMP在理论推导上非常优雅,但实际应用时,你需要解一个两点边值问题。这通常需要数值方法,比如打靶法或有限差分法。我曾经用PMP设计过一个VWAP策略,效果比传统的时间切片法好15%以上。

4.2.2 高频交易中的应用:最优执行

咱们看一个经典的最优执行问题。假设你要在时间[0, T]内卖出Q股股票。市场价格受你的交易影响:

dS = -κ * u dt + σ dW
dx/dt = u
x(0) = Q, x(T) = 0

其中:

  • S:市场价格
  • κ:永久冲击系数
  • u:卖出速率(控制变量)
  • x:剩余持仓

目标是最小化执行成本:

J = E[ ∫ (S * u + η * u²) dt ]

这里η是临时冲击系数。用PMP求解,得到最优控制律:

u*(t) = (λ(t) - S(t)) / (2η)

其中λ(t)是协态变量,满足:

dλ/dt = κ * u

这个结果很有意思:最优下单速率取决于市场价格与“影子价格”λ的差值。当市场价格高于影子价格时,你加快卖出;低于时,你放慢速度。

避坑指南:我曾经在实盘中直接用这个公式,结果发现参数κ和η很难准确估计。市场冲击是非线性的,而且不同时间尺度下参数会变。建议先用历史数据做参数校准,再上线。另外,PMP假设模型是确定性的,但实际市场有随机性。你可以结合随机控制理论,比如HJB方程,来处理随机性。

4.3 动态规划 vs 庞特里亚金极大值原理

咱们做个对比,方便你理解什么时候用哪个:

维度 动态规划(DP) 庞特里亚金极大值原理(PMP)
时间 离散时间 连续时间
状态空间 有限或离散化 连续
求解方法 逆向递推 解两点边值问题
计算复杂度 状态空间指数增长 依赖于ODE求解器
适用场景 订单簿离散事件、限价单策略 连续下单、最优执行、做市商策略
随机性处理 容易(通过转移概率) 较难(需要随机控制扩展)

我个人习惯是:如果问题可以离散化,且状态空间不大,优先用DP。因为DP直观,容易调试。如果问题需要连续时间建模,或者状态空间太大,那就上PMP。但PMP的数学推导要小心,我见过不少同行在边界条件上栽跟头。

4.4 知识体系框架图

下面这张图总结了本章的核心逻辑。我建议你把它打印出来,贴在工位上。

最优控制理论:高频交易中的两大支柱 动态规划(DP) 庞特里亚金极大值原理(PMP) 贝尔曼方程 状态空间离散化 逆向递推求解 近似动态规划(ADP) 哈密顿函数 协态变量 两点边值问题 数值求解(打靶法) 高频交易应用场景 最优执行(VWAP/TWAP) 做市商策略 订单簿动态管理 统计套利对冲

这张图把DP和PMP的关系、子方法、以及应用场景都串起来了。你从顶部往下看,先选DP还是PMP,再选具体方法,最后落到应用场景。我在做策略设计时,经常用这张图来快速定位问题属于哪一类。

4.5 小结

这一章我们聊了动态规划和庞特里亚金极大值原理。说白了,DP适合离散、有限状态的问题,PMP适合连续、无限状态的问题。两者没有绝对的好坏,关键看你的交易场景。

我记得刚入行时,总觉得数学工具越复杂越好。后来发现,简单的东西往往更可靠。如果你能用DP解决,就别硬上PMP。如果你需要连续时间建模,PMP是绕不开的。

最后提醒一句:理论再漂亮,也要落地到代码和实盘。下一章我们会讲随机控制与HJB方程,那是处理市场随机性的利器。但今天,先把DP和PMP吃透。

课后练习:用动态规划实现一个简单的TWAP策略,时间步长1秒,总时间10秒,总股数1000股。假设市场冲击成本为0.01元/股²。对比一下,如果改用PMP求解连续版本,结果有什么不同?


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