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 基本用法
  1. 定义环境(如 gym 或自定义环境)
  2. 选择算法并初始化模型
  3. 训练模型
  4. 评估或保存模型

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 设置收集步数。