强化学习工具及优化方法
1 说明
在量化交易或金融强化学习项目中,很多人会好奇到底需要关注算法本身,还是环境建模和数据处理。实际上,绝大多数场景下,重点是如何设计环境和构造特征,而不是修改 RL 算法。只有在算法研究、论文复现或特殊需求时,才需要动手改算法。
本文将以 stable-baselines + gym 为例,介绍强化学习在股票策略训练中的实践重点和流程。
2 stable-baselines
stable-baselines3(简称 SB3)是一个基于 PyTorch 的强化学习库,专注于实现和优化主流深度强化学习算法。它的目标是让用户能够方便地训练、评估和部署 RL 智能体。
2.1 主要特点
- 易用性:API 设计简洁,类似 scikit-learn,便于上手。
- 主流算法:内置 PPO、A2C、DQN、SAC、TD3 等常用算法。
- 可扩展性:支持自定义环境(如 gym 环境)、网络结构和回调。
- 社区活跃:文档完善,支持良好。
2.2 适用场景
- 股票/量化交易
- 游戏智能体
- 机器人控制
- 其他序列决策问题 ### 2.3 基本用法
- 定义环境(如 gym 或自定义环境)
- 选择算法并初始化模型
- 训练模型
- 评估或保存模型
3 gym 环境
实现自定义的 gym.Env 环境,至少需要实现以下核心方法:
__init__
:初始化环境状态、动作空间、观测空间等。step
:执行动作,返回观测、奖励、是否结束、截断标记及额外信息。reset
:重置环境,返回初始观测。render
(可选):可视化环境状态,便于调试。close
(可选):释放资源。
step
是核心方法,它执行动作、推进环境状态、计算奖励,并返回下一步观测。智能体与环境的交互循环主要通过不断调用
step
实现。
当环境定义完成后,除了测试 RL
算法,还可以用于回测和评价个人操作,只需将不同的 action 输入
step
即可。
4 训练流程
4.1 基本流程
- 定义 状态空间(state space) 和 动作空间(action space)
- 每个 episode(回合)包含多个 step
- 每个 step,智能体执行动作,环境返回即时 reward;所有 step 的 reward 之和为 累计奖励(cumulative reward)
- 训练目标:通过不断交互优化策略参数,使累计奖励最大化
4.2 优化 action 的过程
- 训练初期,action 多为随机(策略未收敛)
- 随着训练进行,算法(如 PPO)根据奖励信号更新策略,逐步减少无效动作,使决策趋于最优
5 可优化项
无论是机器学习、深度学习还是强化学习,核心都是构造出重要特征,让模型判断其重要性、适用场景和组合方式。例如,将 MACD 构造成特征,如果认为布林指标不重要,则可省略,或者将所有特征都提供给模型让其自行选择。甚至已有策略也可转化为特征供强化学习模型使用。
环境构造重点:
- 状态空间(observation)
- 输入特征:当前市场数据(开盘价、收盘价、最高/最低价、成交量、技术指标)、用户账户情况(持仓、现金余额)、历史市场序列(滑动窗口)
- 决定 window_size,是否包含多天数据
- 动作空间(action)
- 动作类型:买/卖/持有,或买卖比例
- 离散或连续
- 奖励函数(reward)
- 通常为策略产生的收益(每日利润/损失或资产净值变化、风险惩罚、手续费)
- 可为单步收益或回合总收益
- 回合
- 从固定起点到终点(如一年、一季度、一个月或整个回测期)
- 每回合内智能体每日根据状态操作
- 数据集
- 选择训练用股票(单只/多只/不同市场)
- 数据预处理、归一化
5.1 注意事项
特征信息不足,导致不同市场状态映射到相同 observation,会出现“同态不同果”——智能体在相同 observation 下采取相同策略,但实际环境不同,强化学习难以收敛。
5.2 示例
6 回题与解答
6.1 问题一
问:reward 是优化整段时间收益还是每日收益?
答:通常优化整个周期的累计收益,而非每日收益。
6.2 问题二
问:训练 100 回合时,参数是每回合调整一次还是每 step 调整?
答:参数更新有两种主流方式: -
按回合更新:策略梯度类算法(如 REINFORCE、部分 PPO) -
按 step/batch 更新:Q-learning(如 DQN)、A2C、PPO
等。Stable-baselines 默认先收集一批“经验”,组成
batch,再进行一次或多次参数更新。可通过 n_steps
设置收集步数。