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 会出问题。我当年第一次试的时候,训练曲线抖得像心电图,完全收敛不了。原因有两个:
- 样本相关性太强——连续几步的状态高度相关,神经网络会「记住」而不是「学习」
- 目标不稳定——每次更新都改变 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 值」那一列——这是区分它们的关键。
3.6 怎么选?我的实战建议
嗯,这里要注意。没有银弹。我做了这么多年,总结出三条经验:
- 状态空间小(比如 < 1000 种):用 Q-Learning。简单、快速、好调试。我早期做 ETF 轮动就用它,效果不错。
- 需要严格控制风险:用 SARSA。它学出来的策略天然保守。我在做期权对冲策略时,SARSA 比 Q-Learning 少亏了 30% 的最大回撤。
- 状态是连续值(比如价格序列):用 DQN。但要做好数据预处理和超参数调优。我建议先用小网络(2-3 层)试水,别一上来就搞 ResNet。
一句话总结:Q-Learning 是理想主义者,SARSA 是现实主义者,DQN 是理想主义者但带了深度学习这个「外挂」。
下节课我们会用 Python 手撸这三个算法,在真实的股票数据上跑一遍。到时候你会发现——理论懂了,代码写起来其实没那么难。
公众号:蓝海资料掘金营,微信deep3321