TradingGym实战:把回测包装成Gym环境,MA20规则策略22笔交易全盈利
一个把你拉进 Gym 训练场做交易的 RL 环境
TradingGym 和 FinRL 都属于"强化学习做交易"这个品类,但两者的设计思路完全不同。FinRL 是一个完整的框架——从数据管道到模型训练到回测评估,每个环节都有专门的模块。TradingGym 更轻量,它只做一件事:把一个回测任务包装成标准的 OpenAI Gym 环境。obs 是一个 9 列的矩阵,action 只有三个值(持仓、做多、做空),reward 是每步的盈亏。
这种设计的优势在于你可以用任何标准的 RL 算法来训练交易策略——PPO、DQN、A2C,理论上都能往里套。但这篇文章先不训练模型,先用一个简单的规则策略(MA20 交叉)演示 TradingGym 的完整回测流程——22 笔交易、全部盈利(胜率 100%)、最终收益 +26.96%。
起步
从 EasyClaw 官网下载安装。不需要装 Gym、不需要配 RL 训练环境。
打开后左侧找「Skill」→「Skill Creator」。灰显的话去「设置 → 通用」打开「开发者模式」重启。
创建 Skill
在 Skill Creator 里告诉 EasyClaw:
帮我把 GitHub 上的 TradingGym(https://github.com/Yvictor/TradingGym)做成一个回测 Skill。我希望输入股票代码和起止日期,自动搭建 backtest_v1 Gym 环境,用 MA20 交叉规则策略跑回测,输出 render() 四面板图表和完整 transaction_details。
Skill 创建好后:
用 TradingGym 回测 AAPL,backtest_v1 模式,MA20 交叉策略,最大持仓 10 股,从 2024 年中到现在

回测结果:22 笔交易全部盈利
| 指标 | 值 |
|---|---|
| 初始资金 | $10,000 |
| 最终净值 | $12,696(+26.96%) |
| 夏普比率 | 0.832 |
| 最大回撤 | -21.33% |
| 交易次数 | 22 |
| 胜率 | 100% |
22 笔交易全部盈利——这个结果看起来好得不太真实。仔细看回测模式的设置会发现原因:TradingGym 的 backtest_v1 是顺序遍历模式,最大持仓 10 股、观察窗口 60 步,策略在每步根据过去 60 天的数据决定买卖。MA20 交叉在苹果 2024-2026 的单边上涨行情中恰好比较有效——在一个趋势向上的市场里,一个简单趋势跟踪策略看起来就是完美的。

observation 矩阵——RL 环境怎么看市场
这是 TradingGym 最独特的地方。每执行一次 env.step(action),环境会返回一个 observation 矩阵。这个矩阵有 9 列,每一列是 RL 模型"看市场"的一个维度:
| 列 | 内容 | RL 模型怎么用 |
|---|---|---|
| 0-2 | 价格、成交量、MA20 | 原始特征——模型的基础输入 |
| 3 | 当前持仓 | 模型知道自己手里有多少仓位 |
| 4 | 持仓变化 | 上一次动作是买入还是卖出 |
| 5 | 开/平仓标记 | 当前是否处于开仓状态 |
| 6 | 当前价格 | 实时行情 |
| 7 | 持仓均价 | 账户的平均成本 |
| 8 | 浮动盈亏 | 当前持仓是赚是亏 |
| 9 | 已实现盈亏 | 已经平仓的累计盈亏 |
| 10 | 总回报 | 账户的总收益率 |
这 9 列本质上是一个"交易员的决策面板"的数字化版本——一个人类交易员做决策时看的东西(价格、持仓、盈亏、成本),被压缩成了 RL 模型可以直接读取的数值矩阵。如果用 DQN 或 PPO 来训练这个环境,模型会在几万次 trial-and-error 中自己发现"什么时候该买、什么时候该卖"。
action_space——只有三个按钮
TradingGym 的动作空间极其精简:
| 动作 | 值 | 含义 |
|---|---|---|
| HOLD | 0 | 什么都不做 |
| LONG | 1 | 做多 |
| SHORT | 2 | 做空 |
只有三个动作。RL 模型的输出层只需要 3 个神经元——它不需要预测价格、不需要预测涨跌幅,只需要在每个时间步选择"持仓、做多、做空"中的一个。这种极简设计让 TradingGym 可以快速验证一个 RL 思路是否可行,不需要在复杂的动作空间和状态空间上浪费时间。
但这也意味着TradingGym 不适合需要仓位管理的策略——你不能告诉它"这次买入 30% 仓位而不是 100%",动作只有"买"和"卖"两个开关,没有中间档。
常见报错
| 错误 | 原因 | 解决方法 |
|---|---|---|
| "Observation shape mismatch" | 数据列数不符合 9 列要求 | 检查数据源是否完整加载 |
| env.step 返回 done 后无法继续 | 数据回测完毕 | 调用 env.reset() 重新开始 |
下一步
- 用 Stable-Baselines3 的 PPO 或 DQN 来训练这个环境——看 RL 模型能否学会比 MA20 交叉更好的策略
- 对比同一环境上规则策略(MA20)和 RL 训练策略的夏普和回撤差异
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=747
- TradingGym GitHub:https://github.com/Yvictor/TradingGym
你试过用 RL 做交易吗?觉得 RL 训练出来的策略和规则策略最大的区别是什么?欢迎聊聊。

浙公网安备 33010602011771号