TradingGym
受OpenAI Gym启发的交易强化学习训练与回测环境,支持tickdata和OHLC格式数据
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
受OpenAI Gym启发的交易强化学习训练与回测环境,支持tickdata和OHLC格式数据
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2017年,台湾东华大学的研究者 Yvictor 在研究强化学习算法时遇到了一个独特的瓶颈:当时的强化学习研究大多聚焦于 Atari 游戏、围棋这类封闭的模拟环境,而金融交易——这个同样具备"状态-动作-奖励"闭环的领域——却没有一个足够好用的训练工具。
这直接催生了 TradingGym。这个项目的灵感来源于 OpenAI Gym,核心目标是为强化学习算法提供一个可复现、可对比、有真实数据支撑的交易环境。和单纯回测不同,TradingGym 的设计哲学是将"训练"和"回测"作为两个独立的流程:训练环境(training_v1)模拟连续的价格流供 agent 学习;回测环境(backtest_v1)则基于完整历史数据评估策略的真实表现。
项目在 GitHub 上积累至今已有 1882 stars,在量化交易 + 强化学习交叉领域属于起步较早、影响力较大的开源项目。虽然最近一次代码更新停在数年前,但其设计思路和代码结构对后续量化回测框架仍有重要参考价值。
TradingGym 的架构遵循 OpenAI Gym 标准接口,这是它最聪明的选择。强化学习研究者不需要学习新的 API,直接用熟悉的 env.reset()、env.step()、env.render() 就能操作交易环境。
核心依赖栈:
环境类型: 项目内置 4 个环境,分布在 training 和 backtest 两条产品线:
| 环境 ID | 用途 | 步长控制 |
|---|---|---|
| training_v0 | 训练(基础版) | obs_data_len=256, step_len=128 |
| training_v1 | 训练(优化版) | 同上,代码更精简 |
| backtest_v0 | 回测(基础版) | obs_data_len=1024, step_len=512 |
| backtest_v1 | 回测(优化版) | 同上,代码更精简 |
动作空间设计非常简洁,只有 3 个离散动作:0 = 持有不动(do nothing)、1 = 做多(long)、2 = 做空(short)。这种设计适合入门级 RL 算法(如 DQN、Policy Gradient),但对于需要调整仓位大小的复杂策略则显得力不从心。
观察空间(Observation Space) 是一个长度为 obs_data_len * feature_len 的一维向量。feature_names 参数支持自定义传入的特征列,如 Price(价格)、Volume(成交量)、Bid_price(买价)、Ask_price(卖价)、Bid_deal_vol(买入成交量)、Bid/Ask_deal(买卖成交量比)、Updown(涨跌)等。
奖励函数基于 deal_col_name 指定的价格列计算利润。当调用 env.step() 时,框架内部完成:价格变动 → 收益计算 → 扣除手续费(fee 参数)→ 返回奖励值的完整链路,并将每笔交易记录存储在 transaction_details 属性中供后续分析。
backtest_v1.py(20866 字节)是整个项目代码量最大的模块,核心逻辑通过 matplotlib 的 patches 实现复杂的行情图表渲染。
交易约束模拟:
max_position=5:最大持仓限制,防止无限加仓gameover_limit=5:连续亏损达阈值时触发 episode 终止(防止 agent 在极端行情中持续亏损)fluc_div=100.0:价格波动归一化参数,用于奖励缩放日结机制是项目的一个精妙设计。数据格式要求包含 serial_number 列,用于标识每个交易日的起始位置。这意味着训练/回测时会自动在每个交易日结束时进行结算重置,而不是等数据全部跑完才结算——这更接近真实交易场景(日内仓位管理)。
交易记录通过 return_transaction=True 参数控制是否记录详细交易流水。回测完成后,开发者可以拿到每一步的状态、动作、奖励,以及最终汇总的交易统计(胜率、盈亏比、最大回撤等)。
主要局限:
数据依赖外部:项目本身不提供数据源,用户必须自行准备 HDF5 格式的交易数据。虽然示例数据(SGXTWsample.h5,12MB)包含真实tick数据,但缺少说明文档,新手上手门槛不低。
功能长期停滞:项目的 Training 部分标注了大量 WIP(Work In Progress),包括 DQN、Policy Gradient、Actor-Critic、A3C with RNN 等训练示例均为"占位"状态,实际没有完整的 RL 算法实现。项目更像一个"环境",而不是"完整的训练框架"。
API 稳定性问题:作者用 colour 库做颜色处理,但该库在 Python 3 环境下有时存在版本兼容性问题,导致渲染失败。
缺乏现代量化框架特性:没有滑点模拟、没有订单簿模拟、不支持多周期数据融合、无法模拟市价单/限价单区分。对于严肃的量化研究,这些是致命短板。
更新断更:最后一次活跃更新是数年前(截至2026年6月),项目已处于维护停滞状态,不适合作为生产环境依赖。
演进方向(社区潜力):
TradingGym 是标准的纯 Python 包,安装方式二选一:
# 方式1: pip
pip install .
# 方式2: setuptools
python setup.py install
安装依赖:pandas、numpy、matplotlib、colour —— 全是主流库,一键安装无障碍。不需要 GPU,任何能跑 Python 的机器均可。无需容器化,整个库体积不大(不含数据约数百KB)。
对于想要将 TradingGym 集成到更大量化系统的开发者而言,最佳实践是将其作为独立的数据环境模块,在外层封装自己的 RL 训练循环或策略回测框架。
TradingGym 的出现填补了2017年前后"强化学习 × 量化交易"领域的工具空白。它证明了一个核心观点:金融市场的价格序列本质上是一个序贯决策问题,可以用 RL 框架来建模。
尽管后续出现了更成熟的替代方案(如 FinRL、Trading environments 等),TradingGym 的历史地位在于:它是最早将 Gym 接口范式引入金融交易环境的开源尝试之一,为后来的量化 RL 研究者提供了可参考的架构原型。它证明了用离散动作空间(做多/做空/不动)简化连续仓位管理的可行性,这一设计选择被后续多个量化 RL 项目沿用。
截至目前,该项目仍被不少研究论文引用,是强化学习交易领域的一个经典教学案例。