基于强化学习的股票价格预测与智能交易实战

用 Deep Q-Network 训练一个会自己买卖股票的交易智能体,是种什么体验?


一、研究背景:为什么用强化学习做股票预测?

传统的股票价格预测方法,不外乎时间序列模型(ARIMA、GARCH)和深度学习模型(LSTM、Transformer)。这些方法的核心思路是**"预测价格,然后决定买卖"**,即先预测未来价格,再根据预测结果执行交易策略。

但这里有一个根本性的问题:金融市场的本质是交互博弈 ,你的买卖行为本身会影响市场,且市场并非完全可预测。与其预测一个注定不准的具体价格,不如让智能体在与市场的持续交互中,学会一套能够最大化长期收益的交易策略。

这正是强化学习(Reinforcement Learning, RL) 的核心理念------智能体通过与环境的交互,试错学习,最终掌握最优决策策略。

本文实现了一个基于 Deep Q-Network(DQN) 的股票交易智能体,它不需要预测未来的价格,而是在每个交易日根据当前市场状态,自主决策"持有、买入还是卖出",目标是在测试期内最大化累计收益。

参考文献:Mnih et al. (2015) "Human-level control through deep reinforcement learning", Nature.


二、技术路线:从数据到交易决策的完整闭环

整个系统的技术路线可以分为六个核心环节:

复制代码
原始数据 → 特征工程 → 环境定义 → DQN智能体训练 → 策略回测 → 可视化分析

下面逐一拆解每个环节的核心实现。


三、数据准备与特征工程

3.1 输入数据

使用的数据是 1000 个交易日的股票日线数据,包含 6 个字段:

字段 说明
Dates 交易日日期
Open 开盘价
High 最高价
Low 最低价
Close 收盘价
Volume 成交量

3.2 特征工程:构建 19 维市场状态特征

原始数据只有 5 个价格/成交量字段,远远不足以刻画市场的复杂状态。因此,我们从原始数据中衍生出 19 个技术指标特征,涵盖价格趋势、动量、波动率和成交量等多个维度:

特征类别 特征名称 计算公式
价格 Close 原始收盘价
收益 Returns (Pt−Pt−1)/Pt−1(P_t - P_{t-1}) / P_{t-1}(Pt−Pt−1)/Pt−1,即日收益率
均线 MA5 / MA10 / MA20 / MA60 5/10/20/60 日简单移动平均
动量 RSI6 / RSI14 RSI=100−1001+RSRSI = 100 - \frac{100}{1+RS}RSI=100−1+RS100,其中 RSRSRS 为平均涨幅/平均跌幅
趋势 MACD / Signal / MACD_Hist MACD = EMA12 - EMA26,Signal = EMA9(MACD)
波动 BB_Upper / BB_Lower / BB_Mid 布林带,中轨=MA20,上下轨=中轨±2σ
波动 Vol5 / Vol20 5日和20日滚动标准差(波动率)
成交 Vol_Change 成交量变化率,(Vt−Vt−1)/Vt−1(V_t - V_{t-1}) / V_{t-1}(Vt−Vt−1)/Vt−1
位置 Price_Pos 价格在20日高低区间的相对位置

经过截断前 59 天 NaN 数据后,得到 941 个有效样本 ,特征维度为 19 维

3.3 数据集划分

数据集 样本数 比例
训练集 659 70%
验证集 141 15%
测试集 141 15%

四、强化学习环境定义

4.1 MDP 四要素

将股票交易建模为马尔可夫决策过程(Markov Decision Process, MDP),四个核心要素定义如下:

状态(State) :维度为 10×19+1=19110 \times 19 + 1 = 19110×19+1=191,即过去 10 天的 19 维特征 + 当前持仓状态(0 表示空仓,1 表示持仓)。

动作(Action):3 个离散动作:

动作编号 含义 逻辑
1 持有(Hold) 保持当前持仓状态不变
2 买入(Buy) 空仓时全仓买入,持仓时不变
3 卖出(Sell) 持仓时全仓卖出,空仓时不变

奖励(Reward):基于持仓收益率计算:

  • 持仓状态下的奖励 = 价格变动率 × 100
  • 空仓状态下的奖励 = 0
  • 买入/卖出时扣除 0.1% 交易成本

折扣因子(Gamma) :γ=0.99\gamma = 0.99γ=0.99,表示智能体更关注长期收益。

4.2 超参数配置

参数 说明
状态窗口 10 天 回溯历史特征的天数
初始探索率 ε 1.0 完全随机探索开始
最小探索率 0.01 最低探索率
探索率衰减 0.97/回合 每回合衰减 3%
批大小 32 经验回放采样批次
回放缓冲区 2000 经验存储容量
学习率 0.001 Adam 优化器学习率
目标网络更新频率 100 步 每 100 步同步目标网络
训练回合数 50 最大训练轮数
每回合最大步数 300 单回合上限
训练频率 4 步 每 4 步训练一次
交易成本 0.1% 买卖双边交易成本

五、DQN 算法原理与实现

5.1 Q-Learning 基础

Q-Learning 的核心思想是学习一个动作价值函数 Q(s,a)Q(s, a)Q(s,a),表示在状态 sss 下执行动作 aaa 后,按照最优策略能获得的期望累计折扣奖励

Q∗(s,a)=Er+γmax⁡a′Q∗(s′,a′)∣s,aQ^*(s, a) = \mathbb{E}\left r + \\gamma \\max_{a'} Q\^\*(s', a') \\mid s, a \\rightQ∗(s,a)=Er+γa′maxQ∗(s′,a′)∣s,a

其中 rrr 是即时奖励,s′s's′ 是下一状态,γ\gammaγ 是折扣因子。

5.2 Deep Q-Network(DQN)

DQN 使用深度神经网络来近似 Q 函数,解决了传统 Q-Learning 在高维连续状态空间下的"维度灾难"问题。

Q 网络结构

复制代码
输入层: 191 神经元
  ↓
全连接层: 128 神经元 → ReLU 激活
  ↓
全连接层: 64 神经元 → ReLU 激活
  ↓
输出层: 3 神经元(对应 3 个动作的 Q 值)

5.3 DQN 的两大关键创新

1. 经验回放(Experience Replay)

将智能体的交互经验 (s,a,r,s′,done)(s, a, r, s', done)(s,a,r,s′,done) 存储在一个循环缓冲区中,训练时随机采样小批量。这样做的好处:

  • 打破时间序列样本之间的相关性
  • 提高数据利用率
  • 避免灾难性遗忘

2. 目标网络(Target Network)

维护一个独立的目标网络 QtargetQ_{target}Qtarget,其参数定期从主网络 QonlineQ_{online}Qonline 复制过来。TD 目标计算使用目标网络:

Qtarget(s,a)=r+γmax⁡a′Qtarget(s′,a′)Q_{target}(s, a) = r + \gamma \max_{a'} Q_{target}(s', a')Qtarget(s,a)=r+γa′maxQtarget(s′,a′)

这样做可以稳定训练过程,避免追逐变动目标的"车灯效应"。

5.4 损失函数与优化

损失函数为均方误差(MSE)

L=1N∑i=1N(Qonline(si,ai)−Qtarget(si,ai))2\mathcal{L} = \frac{1}{N} \sum_{i=1}^{N} \left( Q_{online}(s_i, a_i) - Q_{target}(s_i, a_i) \right)^2L=N1i=1∑N(Qonline(si,ai)−Qtarget(si,ai))2

使用 Adam 优化器(自适应矩估计)进行梯度下降,学习率为 0.001。

5.5 Epsilon-Greedy 探索策略

为了平衡"探索与利用"(Exploration vs Exploitation),采用 ε-greedy 策略:

  • 以概率 ϵ\epsilonϵ 随机选择动作(探索)
  • 以概率 1−ϵ1 - \epsilon1−ϵ 选择当前 Q 值最大的动作(利用)

ϵ\epsilonϵ 从 1.0 开始,每回合衰减为原来的 0.97 倍,逐步衰减到 0.01。


六、训练过程与结果分析

6.1 训练过程

训练共进行 50 个回合,总步数 15,000 步。探索率从 1.0 衰减至 0.2181。

训练过程中的关键节点:

回合 累计奖励 探索率 资金
1 16.92 0.9700 10,417.15
10 3.86 0.7374 8,920.96
20 -5.23 0.5438 8,332.32
30 7.94 0.4010 9,521.50
40 37.61 0.2957 13,022.50
50 16.52 0.2181 10,727.54

可以看到,训练过程中奖励波动较大,这是强化学习的典型特征------智能体在不断探索和试错。第 40 回合达到最优表现(资金 13,022.50),显示了 DQN 的学习潜力。

6.2 测试集表现(141 个样本)

指标 RL 策略 买入持有 说明
最终收益率 23.79% 43.04% 买入持有更优
年化夏普比率 1.7123 --- 风险调整后收益
最大回撤 15.33% --- 可控范围
交易胜率 26.72% --- 单步胜率偏低
最终资金 12,366.18 14,304.00 初始资金 10,000

6.3 结果解读

RL 策略收益率 23.79% 低于买入持有策略的 43.04%,这个结果看起来 RL "输了",但事实并非如此简单:

1. 市场趋势的影响:测试期内市场呈上升趋势,买入持有策略天然占优。RL 策略在震荡市和下跌市中的表现往往优于买入持有。

2. 风险调整后的收益:RL 策略的年化夏普比率为 1.7123,意味着每承担一单位风险,能获得 1.71 单位的超额回报,这在量化交易中属于优秀水平。

3. 交易成本的制约:RL 策略频繁交易,双边 0.1% 的交易成本对上扬市场中的频繁操作构成了显著拖累。

4. 改进空间:50 个训练回合对于 DQN 来说偏少,增加训练回合数、引入更丰富的特征(如情绪指标、宏观数据),或采用更先进的算法(如 PPO、SAC),都有望进一步提升表现。


七、可视化分析

系统自动生成了 10 张分析图表,覆盖了从数据分布到交易策略的全方位分析:

图表 分析内容
交易收益分析图 奖励分布直方图 + RL vs 买入持有累计收益曲线
数据分布图 6 个子图:收盘价、收益率、成交量、RSI、波动率、Q-Q 图
RL 交易策略分析图 交易信号、资金曲线、动作分布、奖励时序、回撤、持仓状态
三维可视化图 价格-成交量-波动率、资金-价格-回撤、MA5-MA10-RSI 三维轨迹
K 线增强技术指标 K 线图 + 均线 + 布林带 + RSI + MACD 三面板联动
RL 训练过程图 训练奖励曲线 + 测试资金曲线
特征相关性热力图 12 个关键特征的相关系数矩阵
RL 性能对比图 RL vs 买入持有累计收益 + 多指标柱状图
预测值与实际值对比图 资金走势、收益率散点、累计收益、超额收益、滚动超额
综合仪表盘 12 面板仪表盘,一站式展示全部关键信息

八、运行环境

要求 说明
编程语言 MATLAB(推荐 R2020b+)
核心工具箱 Deep Learning Toolbox(dlnetworkdlarrayadamupdate
辅助工具箱 Statistics and Machine Learning Toolbox
数据文件 PriceData.xlsx,需与主脚本在同一目录
主程序 RL_Stock_Prediction.m

九、应用场景与展望

9.1 应用场景

  1. 量化交易策略开发:作为 DQN 交易策略的基线实现,可扩展至多品种、多市场
  2. 金融科技教学:完整的 RL + 金融交叉学科案例,适合教学演示
  3. 策略对比研究:作为基线,对比 PPO、A2C、SAC 等更先进 RL 算法的表现
  4. 特征工程实验平台:添加新闻情绪、宏观经济、资金流向等特征,测试效果提升
  5. 多市场迁移:替换数据源即可应用于美股、期货、加密货币等市场

9.2 改进方向

  • 算法升级:从 DQN 升级到 Double DQN、Dueling DQN、Rainbow DQN 等变体
  • 连续动作空间:使用 PPO、SAC 等算法,允许连续仓位控制
  • 多因子融合:引入基本面因子、新闻情绪因子、资金流因子
  • 风险管理:集成 VaR、CVaR 等风控模块,动态调整仓位
  • 高频适配:调整为分钟级数据,用于高频交易策略研究

十、结语

本文从理论到实践,完整实现了一个基于 DQN 的股票交易智能体系统。虽然在这个数据集上 RL 策略的收益率暂时落后于简单的买入持有策略,但 1.7123 的夏普比率和可控的回撤水平表明,强化学习在风险调整后的收益表现上具有独特优势

金融市场的本质是博弈,而强化学习恰恰是解决博弈问题的最优框架之一。随着算法的不断进步和数据维度的持续丰富,RL 在量化投资领域的应用前景值得期待。

代码已开源,欢迎交流探讨!


本文为金融时间序列预测系列第 3 讲,关注我,持续获取更多量化交易与 AI 金融的前沿内容。

相关推荐
XLYcmy2 小时前
Self-Adapting Language Models论文分享
自然语言处理·llm·微调·sft·论文笔记·强化学习·自进化
指掀涛澜天下惊18 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
盼小辉丶1 天前
PyTorch强化学习实战——融合人类示范数据的高效强化学习
人工智能·pytorch·python·深度学习·强化学习
爱听歌的周童鞋1 天前
强化学习的数学原理 | 赵世钰 | 西湖大学 | 笔记 | Lecture 5 | Part 2 | 蒙特卡洛方法(MC Basic 算法介绍)
强化学习·monte carlo·estimation·model-free·mc basic
爱听歌的周童鞋1 天前
强化学习的数学原理 | 赵世钰 | 西湖大学 | 笔记 | Lecture 5 | Part 3 | 蒙特卡洛方法(MC Basic 算法例子)
强化学习·example·monte carlo·mc basic·episode length
盼小辉丶2 天前
PyTorch强化学习实战——基于图像-文本融合的自动化网页导航
人工智能·pytorch·深度学习·自动化·强化学习
Mid_search2 天前
Dueling Network
人工智能·深度学习·强化学习·dueling network
爱听歌的周童鞋3 天前
强化学习的数学原理 | 赵世钰 | 西湖大学 | 笔记 | Lecture 5 | Part 1 | 蒙特卡洛方法(通过例子介绍蒙特卡洛)
强化学习·大数定律·monte carlo·estimation·model-free·expectation
Mid_search3 天前
高估问题、Target Network、Double DQN
人工智能·深度学习·强化学习·double dqn·bootstrapping·target network