用 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+γmaxa′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+γmaxa′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(dlnetwork、dlarray、adamupdate) |
| 辅助工具箱 | Statistics and Machine Learning Toolbox |
| 数据文件 | PriceData.xlsx,需与主脚本在同一目录 |
| 主程序 | RL_Stock_Prediction.m |
九、应用场景与展望
9.1 应用场景
- 量化交易策略开发:作为 DQN 交易策略的基线实现,可扩展至多品种、多市场
- 金融科技教学:完整的 RL + 金融交叉学科案例,适合教学演示
- 策略对比研究:作为基线,对比 PPO、A2C、SAC 等更先进 RL 算法的表现
- 特征工程实验平台:添加新闻情绪、宏观经济、资金流向等特征,测试效果提升
- 多市场迁移:替换数据源即可应用于美股、期货、加密货币等市场
9.2 改进方向
- 算法升级:从 DQN 升级到 Double DQN、Dueling DQN、Rainbow DQN 等变体
- 连续动作空间:使用 PPO、SAC 等算法,允许连续仓位控制
- 多因子融合:引入基本面因子、新闻情绪因子、资金流因子
- 风险管理:集成 VaR、CVaR 等风控模块,动态调整仓位
- 高频适配:调整为分钟级数据,用于高频交易策略研究
十、结语
本文从理论到实践,完整实现了一个基于 DQN 的股票交易智能体系统。虽然在这个数据集上 RL 策略的收益率暂时落后于简单的买入持有策略,但 1.7123 的夏普比率和可控的回撤水平表明,强化学习在风险调整后的收益表现上具有独特优势。
金融市场的本质是博弈,而强化学习恰恰是解决博弈问题的最优框架之一。随着算法的不断进步和数据维度的持续丰富,RL 在量化投资领域的应用前景值得期待。
代码已开源,欢迎交流探讨!
本文为金融时间序列预测系列第 3 讲,关注我,持续获取更多量化交易与 AI 金融的前沿内容。