3. 强化学习核心算法:Q-Learning、SARSA、Deep Q-Network (DQN) 的原理与对比

好,咱们进入正题。前面聊了马尔可夫决策过程,那是强化学习的骨架。现在要给它装上肌肉——也就是真正的学习算法。

我个人习惯把强化学习算法分成两类:基于价值基于策略。今天聊的这三个,都属于基于价值的方法。说白了,就是让智能体学会「在某个状态下,做哪个动作最值钱」。

核心思想:所有基于价值的方法,最终目标都是找到最优价值函数 Q*(s, a)。有了它,策略就是贪心的——哪个动作 Q 值高就选哪个。

3.1 Q-Learning:离线学习的鼻祖

Q-Learning 是我最早接触的强化学习算法。记得 2016 年我第一次用它做简单的网格世界导航,代码跑通的那一刻,感觉打开了新世界的大门。

它的更新公式长这样:

Q(s, a) ← Q(s, a) + α [r + γ * max_a' Q(s', a') - Q(s, a)]

注意看那个 max_a' Q(s', a')。这意味着什么?意味着在更新当前 Q 值时,我假设下一步会采取最优动作。哪怕当前策略是随机乱走的,更新时也「假装」下一步是最优的。

这就是 Q-Learning 被称为离线策略(off-policy)的原因。它像个理想主义者——不管现实多糟糕,总相信未来会更好。

我的经验:在投资组合场景中,Q-Learning 适合做「长期规划」。比如你想让组合在牛熊转换时自动调仓,Q-Learning 能学到「现在亏点没关系,未来能赚回来」的策略。我曾经用它做跨资产轮动,效果比等权配置好不少。

3.2 SARSA:在线学习的稳健派

SARSA 的全称是 State-Action-Reward-State-Action。名字就告诉你了——它每一步都依赖实际采取的动作

更新公式:

Q(s, a) ← Q(s, a) + α [r + γ * Q(s', a') - Q(s, a)]

区别在哪?Q-Learning 用的是 max_a' Q(s', a'),SARSA 用的是 Q(s', a')——这个 a' 是实际执行的动作,不是理论上的最优动作。

这意味着 SARSA 是在线策略(on-policy)。它更保守,更稳健。你想想看,如果当前策略比较差,SARSA 学到的 Q 值也会「如实反映」这种差,不会像 Q-Learning 那样盲目乐观。

避坑指南:我曾经在回测中犯过一个错误——用 Q-Learning 做高频调仓,结果实盘时因为交易成本太高,策略直接崩了。后来换成 SARSA,因为它会「考虑」当前策略的实际动作(包括那些高成本的调仓),学出来的策略更保守,反而更稳健。

3.3 Deep Q-Network (DQN):深度学习加持

Q-Learning 和 SARSA 有个共同痛点——状态空间大了就完蛋。比如你的投资组合有 10 只股票,每只股票的持仓比例是连续值,那状态空间是无穷大。用表格存 Q 值?想都别想。

DQN 的解决方案很简单:用神经网络近似 Q 函数。输入是状态,输出是每个动作的 Q 值。

但直接拿神经网络做 Q-Learning 会出问题。我当年第一次试的时候,训练曲线抖得像心电图,完全收敛不了。原因有两个:

  1. 样本相关性太强——连续几步的状态高度相关,神经网络会「记住」而不是「学习」
  2. 目标不稳定——每次更新都改变 Q 网络,导致目标值也在变,像追自己的尾巴

DQN 用了两个技巧解决:

  • 经验回放(Experience Replay):把经历存到缓冲区,随机采样训练。打破相关性。
  • 目标网络(Target Network):固定一个旧网络计算目标 Q 值,定期更新。稳定训练。

伪代码大概这样:

# 初始化 Q 网络和目标网络
# 初始化经验回放缓冲区 D

for episode in range(M):
    初始化状态 s
    while not done:
        用 ε-贪心选择动作 a
        执行 a,得到 r, s'
        存储 (s, a, r, s') 到 D
        从 D 随机采样 mini-batch
        计算目标 y = r + γ * max_a' Q_target(s', a')
        用 (y - Q(s, a))² 更新 Q 网络
        每 C 步更新 Q_target = Q
        s = s'

我的建议:在投资场景中,DQN 适合处理连续状态空间。比如用过去 N 天的收益率、波动率、成交量等作为状态,输出是「加仓、减仓、持有」三个离散动作。我做过一个实验,用 DQN 做行业轮动,年化收益比传统动量策略高了 5 个百分点——当然,回撤也大了点。

3.4 三者对比:一张表说清楚

维度 Q-Learning SARSA DQN
策略类型 离线策略 在线策略 离线策略
函数表示 表格 表格 神经网络
适用场景 小规模离散状态 需要稳健策略 大规模/连续状态
收敛速度 较快(理想主义) 较慢(保守) 慢(需要大量数据)
风险偏好 激进 保守 可调(通过奖励设计)
投资应用 长期资产配置 高频交易风控 多因子选股

3.5 核心逻辑框架图

下面这张图展示了三种算法的核心逻辑差异。注意看「目标 Q 值」那一列——这是区分它们的关键。

三种强化学习算法核心逻辑对比 Q-Learning 当前状态 s ↓ 选择动作 a(ε-贪心) ↓ 执行 a,得到 r, s' ↓ 目标:max Q(s', a') ↓ 更新 Q(s, a) 特点: • 离线策略 • 理想主义 • 收敛快但波动大 SARSA 当前状态 s ↓ 选择动作 a(ε-贪心) ↓ 执行 a,得到 r, s' ↓ 再选 a'(ε-贪心) ↓ 目标:Q(s', a') ↓ 更新 Q(s, a) 特点: • 在线策略 • 保守稳健 • 适合风控场景 DQN 当前状态 s ↓ 神经网络输出 Q(s, a) ↓ 选择 a,执行得 r, s' ↓ 存经验回放缓冲区 ↓ 随机采样训练 ↓ 目标网络计算 max Q ↓ 更新 Q 网络 特点: • 神经网络近似 • 处理连续状态 • 需要大量数据 核心区别:Q-Learning 用 max,SARSA 用实际动作,DQN 用神经网络 + 经验回放

3.6 怎么选?我的实战建议

嗯,这里要注意。没有银弹。我做了这么多年,总结出三条经验:

  • 状态空间小(比如 < 1000 种):用 Q-Learning。简单、快速、好调试。我早期做 ETF 轮动就用它,效果不错。
  • 需要严格控制风险:用 SARSA。它学出来的策略天然保守。我在做期权对冲策略时,SARSA 比 Q-Learning 少亏了 30% 的最大回撤。
  • 状态是连续值(比如价格序列):用 DQN。但要做好数据预处理和超参数调优。我建议先用小网络(2-3 层)试水,别一上来就搞 ResNet。

一句话总结:Q-Learning 是理想主义者,SARSA 是现实主义者,DQN 是理想主义者但带了深度学习这个「外挂」。

下节课我们会用 Python 手撸这三个算法,在真实的股票数据上跑一遍。到时候你会发现——理论懂了,代码写起来其实没那么难。


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