把这四个项目的 README 一字排开,功能清单几乎一致:Gymnasium 环境、OHLCV 摄入、开箱即用的 PPO/SAC/A2C/DQN、一条回测曲线。可真正决定哪一个能在严肃的研究或生产循环里扛下去的那一点,在那张清单上根本看不见:谁来掌控仿真契约——动作形态、成本模型、滑点假设、奖励、一段 episode 在哪儿结束。FinRL 把带立场的金融假设硬编进环境,让你用控制力换便利。TensorTrade 让环境与数据源无关,要求你用插件自行拼装契约。ABIDES-Gym 让契约从一台离散事件 LOB 仿真器里长出来,别的智能体在同一本订单簿里交易。ElegantRL 是一个 RL 工程库,把交易当作众多应用之一——环境是你的事,训练器的职责是跑得快。先按这条轴选;其余一切随之而定。
速览
四款面向交易的 RL 项目,对同一个问题给出四种答案——环境替你决定了什么,又把什么留给你自己带。下表先列基本信息;其下的矩阵呈现各自在真正存在差异的那几条轴上最用力的方向。
| 项目 |
发布时间 / 维护方 |
主打场景 |
运行位置 |
| FinRL |
2020 年,AI4Finance Foundation |
把金融假设烤进环境的端到端金融 RL 框架 |
本地 Python / notebook;云 GPU 有示例 |
| TensorTrade |
2019 年,tensortrade-org(社区维护) |
由动作 / 奖励 / 交易所插件拼装而成的可组合 Gymnasium 环境 |
本地 Python;Ray Tune 做扩展 |
| ABIDES-Gym |
2021 年,J.P. Morgan AI Research |
给 ABIDES 多智能体 LOB 仿真器套上 Gym 外壳 |
本地 Python;单线程仿真进程 |
| ElegantRL |
2021 年,AI4Finance Foundation |
云原生、大规模并行的深度 RL 库(金融只是其中一个应用) |
单 GPU;通过 Podracer 扩展到多 pod 集群 |
快照:2026-06-02。综述论文里偶尔出现的 "MarketGym" 并不对应某个单一的、按这个名字活跃维护的项目——我们以 ABIDES-Gym 作为 LOB / 微观结构那一档的替代,因为它是该方向上活跃维护的参考实现。框架演进很快,请对照最新文档核实。
每个项目最用力的方向。表面看处处趋同,差异出现在仿真契约由谁拍板的那一刻。
FinRL — 架构详解
FinRL 是一套垂直整合的栈:数据 → 带立场的环境 → DRLAgent 门面 → 回测,仿真契约就烤在环境那一层里。
仿真契约
FinRL 提供 StockTradingEnv、PortfolioOptimizationEnv,以及一小批加密 / 模拟交易环境,它们的默认值并不中立——这是写进代码里的金融立场。动作空间是 Box([-1, 1], n_stocks),解释为按 hmax 缩放后的仓位比例;奖励是组合价值的变化减掉 bps 级的交易费;成交发生在 bar 的收盘价;episode 在现金耗尽或价格序列走完时结束;还有一个可选的 turbulence index 会在波动激增时强制平仓。这些都不能仅凭配置项调整——要改你得继承环境、重写相应方法。这就是 FinRL 的交易条件:那份契约就是框架给"一个组合智能体在日频上交易一篮子美股"这一问题的答案,多数活已经替你做完。
智能体与训练器
智能体层是一个薄薄的 DRLAgent 门面,按你的 import 路径把调用转发给 Stable-Baselines3(PPO、A2C、SAC、TD3、DDPG)、RLlib 或 ElegantRL。一对 agent.train(...) / agent.predict(...) 隐去了训练器的具体 API——这正是 FinRL 成为热门入门通道的原因:照抄 notebook、把你的股票代码塞进去,一个能跑通的 PPO 组合智能体一小时之内就能端到端跑起来。这条入门通道的代价是训练器是别人的——SB3 弃用某个参数、RLlib 调整 config 形态时,那份变动你照单全收。FinRL-Meta 与较新的 FinRL-X 仓库更新了数据层与部署故事,但核心仍是同一个"基于带立场环境的智能体"模式。
运行时让什么变难
两件事。第一,一旦你不满足于现有契约,逃离它就成了难事。如果你想要日内成交、带真实滑点、带市场冲击,或者一个非 Box 的动作空间(在某价位挂限价单、撤已挂的工作单),要么继承环境、要么基本上重写它——你偏离得越远,框架帮你的就越少。第二,验证训练出来的策略能不能扛住真实交易所的微观结构。默认的"以收盘价成交"是一份大方的假设;FinRL 回测里的 PnL 曲线相对于任何一本真实订单簿都可能偏乐观,而 FinRL 不会主动提醒你——这份警觉得你自己有。务实做法是:用 FinRL 做数据准备和基线,把最终评估搬到 ABIDES-Gym 这类 LOB 仿真器上做。
TensorTrade — 架构详解
TensorTrade 是可组合的:环境只是一层薄薄的外壳,把你传入的插件接起来,仿真契约就等于你拼装的样子。
仿真契约
TensorTrade 的 TradingEnv 是故意"空"的。动作契约来自你传入的 ActionScheme(自带的是 BSH——二元买卖持有,以及面向止盈止损的 ManagedRiskOrders;其余都靠自定义)。奖励契约来自 RewardScheme(SimpleProfit、近似 Sharpe 的 RiskAdjustedReturns,或者你自己写)。交易所契约来自 Exchange,它定义滑点与佣金模型。资产范围和币种是你在传入前实例化的类型化对象。换句话说,TensorTrade 里没有 FinRL 意义上的"默认交易环境"——环境就是你在构造时做出的那一组选择,两个用同一个库的 TensorTrade 用户,跑的通常是两份本质不同的仿真。
智能体与训练器
TensorTrade 不内置 RL 实现。环境是一个 Gymnasium 兼容对象,因此任何外部训练器都能直接接上:项目教程主要走 Ray RLlib 配合 Ray Tune 做超参搜索,但 Stable-Baselines3 与 CleanRL 也能无改动地用,因为契约就是 step / reset / observation_space / action_space。这是一种刻意的分工——TensorTrade 是环境库,不是智能体库,于是 SB3 出新版 PPO、CleanRL 修了一个递归策略的 bug,你都白白享受;想把 PPO 换成 SAC,改一行 import 就行,不用动框架。
运行时让什么变难
可组合性是一项税。和 FinRL 比,TensorTrade 的"第一份能跑的环境"要明显多写不少代码,因为没有带立场的默认值——你得自己选动作方案、奖励形态、滑点模型与数据源,环境才能跑。对清楚自己要什么的团队,这是优点;对还没明确想法的新手,这就是一张推迟首条学习曲线的白纸。另一个尖角是:保真度被插件托住。默认 Exchange 用百分比佣金加 OHLCV 数据源;想要队列位置与真实延迟,就得自己写一台仿真器藏到 Exchange 接口背后,做得到但不是库直接送你的。诚实一句:TensorTrade 给你的,是你想要的契约,而不是市场强加给你的契约。
ABIDES-Gym — 架构详解
ABIDES-Gym 给一台离散事件多智能体 LOB 仿真器套上 Gym 外壳:智能体在一个由其他智能体填出真实订单流的合成交易所里交易。
仿真契约
ABIDES-Gym 严格说不是 FinRL 或 TensorTrade 意义上的"RL 框架"——它是把 Gym 外壳安在 ABIDES 离散事件仿真器上的薄壳。仿真契约就是仿真器决定的那一套:交易所 agent 维护一本真正的限价订单簿,遵循价格-时间优先和离散最小价位;背景交易者(噪声、价值、动量、参考做市商)各自按到达时刻发真实的 LIMIT / MARKET / CANCEL 消息推动盘口;每一跳都有延迟模型;部分成交与队列位置不是近似而是内核里算出来的。你的 RL 智能体不过是内核里又一个 agent——那个"实验"agent——由一个 Gymnasium step() 推动:每次调用 step,仿真器继续走,直到这个智能体的下一个决策时点。动作是真实订单类型(下、撤、改);观测是 LOB 快照;奖励是已实现 PnL 切片,或诸如 Almgren-Chriss 之类的执行质量基准。
智能体与训练器
仓库里附带两个 benchmark 环境——一个日频投资者环境、一个执行 / 清算环境——再加上仿真器本体和示例训练脚本。智能体和训练器本身要你自己来:ABIDES-Gym 暴露的是 Gym 接口,SB3 的 PPO、RLlib 或自定义 PyTorch 全都能直接接上。原始论文用的是带 APEX 架构的 Deep Dueling Double Q-learning;近期的 ABIDES-MARL 扩展把内核改造为支持多智能体 RL——多个自适应智能体在同一本订单簿里同时学习。训练器一侧故意做得很薄:这里的价值在仿真器,不在策略代码。
运行时让什么变难
吞吐。ABIDES 是单线程的离散事件 Python——消息总线一次处理一个事件,按到达时间戳排队。仿真一天的 NASDAQ 交易需要不小的实际墙钟时间,而且你没法像对待无状态的 OHLCV 环境那样轻易把它向量化。标准变通是进程级并行(通过 SubprocVecEnv 起多个仿真进程),它能随 CPU 数线性扩展,但与 GPU 数无关。第二个尖角是标定:背景交易者群体有各自的参数(噪声交易者到达率、价值交易者信号噪声、做市商点差),你得调它们才能让订单流像某个真实场所,而"像"是个需要判断的词。一句实话:在这套对比里 ABIDES-Gym 给你最真实的仿真契约,代价是单进程吞吐外加一份标定工程。
ElegantRL — 架构详解
ElegantRL 是 RL 工程优先:单 GPU 上大规模并行环境 rollout、干净的 Actor/Critic PyTorch 原语,以及把金融视作众多任务之一的环境插槽。
仿真契约
ElegantRL 是这里的异类:它是一个 RL 库,不是一个交易框架。仿真契约取决于你接上的环境。仓库内置的金融演示用的是一份 FinRL-Meta 的 StockTradingEnv,被改造成驻 GPU 的向量化张量——把股价当作 batch 里的一个维度,就像替换掉机器人状态一样——于是契约仍然是 OHLCV 形状的,从 FinRL-Meta 那边继承下来。这个库的真正重心在别处:一个 Isaac-Gym 风格的向量化环境循环,能在一张 GPU 上跑 4 k–16 k 个并行环境且不走 CPU 拷贝;一套清爽的 Actor/Critic 分离;以及一套云原生 Podracer 层,靠"pod 锦标赛集成"把同一份代码扩到上百张 GPU。
智能体与训练器
这是 ElegantRL 最用力的一半。仓库内置干净的 PyTorch 自实现:DQN、Double DQN、D3QN、REDQ、A2C、PPO、DDPG、TD3、SAC——都遵循同一份 Agent.update_net(buffer) 契约,附带 twin-Q target、GAE、KL 牵绳等工程原语。重点不在"我们又写了一版 PPO"——而在"我们重写的 PPO 让 rollout 能驻在设备上、buffer 直接是 GPU 张量、而非 CPU 队列"。与 SB3(重算法清晰度,吞吐次要)和 RLlib(重集群扩展,单 GPU 效率次要)相比,ElegantRL 把单 GPU 吞吐选作设计原点。
运行时让什么变难
两件事。第一,你拿到的那个金融环境并非这个库的重心——它是 FinRL-Meta 跑成 vec-env 的移植,仿真契约仍是 OHLCV,仍带着 FinRL 那种"以收盘价成交"的同款局限。ElegantRL 不改善交易仿真的真实度;它改善的是你能多快地针对环境提供的那点真实度训练。第二,当环境不能在设备上向量化时,这套并行环境的故事就立刻复杂起来——ABIDES 风格的 LOB 仿真器在 GPU 上根本不可向量化,于是 ElegantRL 的吞吐优势在高保真仿真器面前坍塌。选 ElegantRL 的场合是训练器是瓶颈、且环境向量化便宜;当昂贵的那部分是环境时,应另选他物。
横向对比
谁来掌控仿真契约
功能清单藏起来的那条头条轴。"动作形态、成交模型、滑点、奖励、episode 边界"到底从哪里来?四种答案。
把其余一切都剥掉,这就是决定"你最初选中的项目是不是对的那一个"的轴。FinRL 替你写好契约——动作空间是仓位向量、成交在收盘价、成本走 bps、episode 是按天数——在"日频交易一篮子美股"恰好就是你的真实任务时这正合适,否则就正不合适。TensorTrade 把契约当作一份插件清单交给你:选 ActionScheme、选 RewardScheme、选 Exchange,环境就是你拼出来的样子——知道自己想要什么时这令人解放,事先没有强主见时这反而推迟开始。ABIDES-Gym 不让你选契约;仿真器替你选了,而它选的是"订单簿真正会做的事",于是你的动作空间是真实订单类型、成交来自队列位置。ElegantRL 是元位置:契约由你传给它的训练器的那个环境插件决定,所以 ElegantRL 用户该问的是"你接了谁的环境",而不是"ElegantRL 本身相信什么"。如果你的研究问题是算法(更好的信用分配、更好的探索),ElegantRL 的中立就是优点;如果你的研究问题是市场,那么契约必须来自某个有立场的地方。
RL 机制——哪些算法是一等公民
智能体循环由谁实现——以及那套实现在为什么而调优。
名义上,四个项目都支持同一批正典算法(PPO、SAC、A2C、DQN,常常还有 DDPG 和 TD3)——差异在于由谁实现、那套实现又在为什么调优。FinRL 一个都没自实现;DRLAgent 是个门面,按你 import 的方式把调用转发到 SB3、RLlib 或 ElegantRL 之一,所以你的算法其实是他们的算法,他们的变动你照单全收。TensorTrade 同样不实现——环境是 Gymnasium 契约,你自带 SB3、Ray RLlib 或 CleanRL——这让项目保持小巧,但升级在框架之外发生。ABIDES-Gym 又是个 Gym 外壳,常规搭配 SB3 或 RLlib;原始论文用的是定制的 Deep Dueling Double Q-learning 配 APEX 优先回放,因为这一组合贴近执行质量任务。ElegantRL 是唯一一个端到端写了自家实现的:刻意让 rollout 留在 GPU 上、buffer 是设备张量,而非 CPU 队列——当环境能在设备上向量化时,吞吐相对 SB3 的领先很大,反之则毫无意义。如果训练器是瓶颈,答案是 ElegantRL;如果与团队既有栈集成更重要,那么由 SB3 撑腰的(FinRL、TensorTrade、ABIDES-Gym 都支持)是更稳的选择。
真实度 vs 吞吐
取舍是真实的:每个项目都要在这条曲线上以保真度换吞吐或反过来。
这里每一种选择都是同一条 trade-off 曲线上的一个位置。FinRL 接受"以收盘价成交"的不真实,换来日频仿真"秒级跑完"——做组合配置研究还行,做短周期交易就危险,因为滑点在那里几乎就是故事的全部。TensorTrade 把选择交到你手里:保真度等于你写的 Exchange 插件能给的程度,要真实就要真做工程。ABIDES-Gym 接受仿真器是单线程离散事件 Python 的代价,换来按队列位置成交、有延迟建模、带由背景交易者自发产生的市场冲击——做执行类研究时,"唯一诚实的答案是与一本订单簿对交易",这套里没有第二个能与之比肩。ElegantRL 整体翻转了问题:假设环境很便宜,问一张 GPU 能撑住多少并行 rollout,然后跨 pod 扩展。结果是当环境能在设备上向量化时(Isaac Gym、OHLCV 股票环境)训练吞吐惊艳;不能时(ABIDES、任何消息驱动的环境)则撞上硬墙。务实的两阶段模式:用一个快但低保真的环境做超参搜索和策略类选择,再在高保真环境上验证选中的策略后才相信结果——这套对比里的四个项目正好覆盖了这两个阶段。
该选哪一个
| 使用场景 |
选 FinRL,当…… |
选 TensorTrade,当…… |
选 ABIDES-Gym,当…… |
选 ElegantRL,当…… |
| 日频组合研究 |
选——默认环境就是这个;一份 notebook 就能跑。 |
可行,但要自己拼装契约。 |
大材小用——LOB 仿真器在日频上被浪费了。 |
当作训练器配 FinRL-Meta 的向量化股票任务来用。 |
| 定制动作 / 奖励 / 成本模型 |
得继承环境——可行但与框架别扭。 |
选——直接插入自家 ActionScheme / RewardScheme / Exchange。 |
动作形状由仿真器拍板;奖励由你来定。 |
环境由你设计;训练器不挑。 |
| 执行 / 做市研究 |
抽象不对——以收盘价成交把问题藏了起来。 |
用自定义 LOB Exchange 插件可行,但需要真功夫。 |
选——为此而设计;队列位置与延迟都被建模。 |
单独不够;ElegantRL 训练器没问题,但需要一个 LOB 环境。 |
| 训练器吞吐是瓶颈 |
把 FinRL 后端切到 ElegantRL——它支持。 |
SB3 + SubprocVecEnv;受限于 CPU。 |
瓶颈在单线程仿真器,不在训练器。 |
选——向量化 GPU rollout 正是设计原点。 |
| 新手想最快跑出第一个智能体 |
选——四者中入门通道最短。 |
入门稍长;要先拼装才能训练。 |
学习曲线最陡——还要学 ABIDES。 |
默认你有 RL 工程基础;不是最温柔的入门。 |
常见问题
既然 FinRL 已经包了 ElegantRL,为什么还要直接用 ElegantRL?
FinRL 的 DRLAgent 门面便利,但有损——要在 SB3 / RLlib / ElegantRL 之间共享一套接口,它只能暴露三者 API 的最小公约数。直接走 ElegantRL,你才能拿到向量化环境训练循环、驻 GPU 的回放缓冲,以及 Podracer 多 pod 扩展——这些通过门面都够不着。正确的规则是:当问题是"这个策略类到底学没学到东西",从 FinRL 开始;当问题是"我能多快扫完超参",下降到 ElegantRL。
"MarketGym" 是真项目吗?为什么这篇用 ABIDES-Gym 代替?
"MarketGym" 在一些综述论文里被当作"Gym 风格市场环境"的统称出现,但 2026 年并没有一个以这个名字活跃维护的单一正典项目——最接近的几位 Yvictor/TradingGym、thedimlebowski/Trading-Gym、hackthemarket/gym-trading已多年不动。在同一范式下可接受的替补,是 LOB / 微观结构那一档,那里 ABIDES-Gym(J.P. Morgan AI Research,基于 ABIDES 仿真器)是仍在跟进且被广泛引用的参考实现。我们显式地做这次替换,而不是悄悄做,是为了让对比保持诚实。如果你在 2022 年前后的论文里看到 "MarketGym" 想跟进同一个想法,你真正要找的就是 ABIDES-Gym。
我能不能直接用 Stable-Baselines3 配一个自写的交易环境,绕过这四个?
能,很多团队就是这么干——一旦你想清楚仿真契约应该长什么样,"SB3 + 你的环境"在这套里依赖最少。这四个项目之所以存在,是因为写一个好的交易环境很难,每个都替你前置了不同的一块工作:FinRL 替你写环境,TensorTrade 替你写环境的管道,ABIDES-Gym 替你写仿真器,ElegantRL 替你写训练器。你完全可以跳过它们,只是要自己多写一些罢了。
面向交易的 RL 与本站其他文章谈的"面向工具调用的 RL"是什么关系?
它们共享底层机制(策略梯度、价值函数、探索),在信用分配的故事上分得很开。面向交易的 RL 奖励相对稠密——每一步都有一个 PnL 增量——难的是环境的滑点和成本假设到底匹不匹配真实场所。面向智能体工具调用的 RL 奖励稀疏、常常只在终止时给出,难的是你用来打分的核验器是否可信。面向工具调用的 RL 和奖励设计与奖励黑客里的直觉可以直接迁移过来——而"策略因为滑点模型太宽容而'赢'了"那种交易里的失败模式,正是奖励黑客披了金融马甲的同一种。
这四个里哪一个最接近"真实"的生产交易智能体?
它们没有一个本身就是生产交易系统——都是研究与原型平台。诚实的流水线是:用 FinRL 或 TensorTrade 做原型、验证策略类是否有效;环境能向量化后,用 ElegantRL 上大规模训练;在相信任何回测之前,先在 ABIDES-Gym 的背景交易者群体里验证执行行为;再把选中的策略移植到所交易场所对应的执行网关上。把其中任何单一一个当作整个栈,正是这篇文章想反对的失败模式。
FinRL 和 ElegantRL 都是 AI4Finance 的项目,这要紧吗?
这件事的影响是正向的:它们就是奔着可组合去设计的。FinRL 把 ElegantRL 当作后端选项之一,FinRL-Meta 提供向量化环境让 ElegantRL 高效训练,FinRL-Podracer 的论文把云原生扩展端到端讲了一遍。坏处也显然——如果你押注一个组织,你就是在跨两个库押注同一个组织。要在栈的一半上做上游分散,TensorTrade(社区维护)和 ABIDES-Gym(J.P. Morgan)就是答案。
延伸阅读
本站相关内容:
- 智能体循环——任何 Gymnasium 交易环境都在实现的"观察→决策→行动→奖励"循环,与智能体 AI 在另一时间尺度上跑的是同一个循环。
- 工具、动作与环境——为何环境契约是任何 RL 系统里最有后果的设计选择,以及一份契约比另一份更诚实在哪儿。
- 提示、微调,还是 RL?——把 RL 放回上下文的决策树:选能闭合差距的最便宜的杠杆,只有当其他都用尽了才动 RL。
- 面向工具使用与多步任务的 RL——多步轨迹上的 RL 为何难,以及为何一个可信的核验器(或滑点模型、或 LOB 仿真器)才是整个博弈。
- 奖励设计与奖励黑客——奖励永远是代理;在交易里,滑点与成本假设就是那份代理,回测看起来太好正是金融马甲下的奖励黑客。
- RLHF 与 RLAIF——这几个交易库也共享的那族算法(PPO、GRPO、DPO),以及为何同样的工程原语会在不同领域里再次出现。
- AI 在交易栈中的位置——把信号、仓位、执行、风控四层摆开后,可以看到这几个 RL 库几乎完全住在执行层。
- 智能体 AI 用于交易研究——配套文章,写的是 RL 执行层之上 LLM 智能体公司那一层;两篇放在一起,把「LLM 与 RL」如何切分这套智能体交易栈讲清楚。
项目来源: