TradingGym · TROUBLESHOOTING

TradingGym 报错排查:先定阶段,再改一处变量

TradingGym 的报错大多没有提示信息(四个 AssertionError 都不带消息),所以排错靠的是确定失败阶段:是 make() 的列断言、reset() 的取数、step() 的运行,还是结果口径算错。这页把四类问题的报错原文、定位命令与修法都列出来。

  • 最常见两条as_matrix 缺失(3/4 环境)与 backtest 属性缺失(README 示例)
  • 本机实测原文:两条 AttributeError、两条模块路径错误都逐字记录
  • 结果类问题:收益异常高、reward 上升净值下降,根源都在账本口径

TradingGym 报错怎么定位?五步路径

记录原文与堆栈完整报错是唯一可靠线索
判断失败阶段make / reset / step / 结果
最小复现只改一个变量
修法 + 验证用同一脚本复跑
依据本机实测报错记录(_verify/as_is_result.txt)与源码断言位置绘制的排查流程示意(非官方流程图)。先定阶段能过滤掉大部分无效尝试。

TradingGym · 安装类

TradingGym 安装与环境类报错:为什么「照教程装」会失败

这一类的共同点是:命令本身没问题,但装的东西不是你想的那个。下表每行都给出本机实测的命令与结果。

安装与环境类报错(报错原文为实测记录) 报错 / 现象原因怎么定位修法注意点 ERROR: Could not find a version that satisfies the requirement trading_envPyPI 上没有 trading_env 这个包(实测 404)pip index versions trading_env 或查 PyPI 页面改用源码安装:git clone + python setup.py install网上教程里的 pip install trading_env 无法执行 装上了但 import 报 ModuleNotFoundError: No module named 'trading_env'装到了另一个项目(如 PyPI 的 trading-gym,属 mymusise/Trading-Gympip show trading-gym 看 Home-page卸载后按官方源码安装同名不同项目,是最容易混淆的一类 ModuleNotFoundError: No module named 'colour'colour 是 v1 两个环境的 import 依赖,未装时 import trading_env 直接失败python -c "import colour"pip install coloursetup.py 的 install_requires 已列)只在 import 阶段暴露 No module named trading_env/test官方 CI 用的是 python -m trading_env/test(斜杠写法)直接跑一次看报错改成 python -m trading_env.test本机实测:斜杠写法 exit 1,点号写法 exit 0(0.2658s) ImportError: Missing optional dependency 'tables'README 示例用 pd.read_hdf,需要 PyTables,但不在 install_requires看报错里的 dependency 名pip install tables,或改用 read_csv 读同一份样例示例代码路径也写作 dataset/SGXTW.h5,仓库实际文件名是 SGXTWsample.h5 多解释器混用(装了但跑不到)pip 与 python 不属于同一个解释器/虚拟环境python -c "import sys;print(sys.executable)"pip -V 对比统一用 python -m pip install ...Windows 上尤其常见

TradingGym · 数据类

TradingGym 数据类报错是什么?四个断言都不告诉你哪里错了

make() 的断言失败时只抛一个空消息的 AssertionError。所以定位方式是自己把四个条件逐项打印出来。

一行代码定位四个断言

import trading_env
print('1 env_id 合法 :', env_id in trading_env.available_envs())
print('2 价格列存在  :', deal_col_name in df.columns)
print('3 有序列号列  :', 'serial_number' in df.columns)
print('4 特征列齐全  :', set(feature_names) <= set(df.columns), sorted(set(feature_names) - set(df.columns)))

四项里哪一项为 False,问题就在哪一行;第 4 项还会打印出缺失的列名。

预期输出:四行全部为 True;否则按对应行修数据或改参数名。

数据类报错速查 报错 / 现象原因定位修法注意点 AssertionError(无消息)四个断言之一失败上面那段四行打印补列或改参数断言不带提示,必须自己查 AttributeError: 'Series' object has no attribute 'as_matrix'环境用了 pandas 1.0 起移除的 as_matrix()(training_v0 / backtest_v0 / backtest_v1)看堆栈落在哪个环境的 reset()加两行兼容补丁,或改用 training_v1本机实测原文,3/4 环境都会遇到 TypeErroriloc 相关)索引不是整数(如时间戳)type(df.index)df = df.reset_index(drop=True)用 1 起或非连续整数时不报错但取错行 回测只跑了一天serial_number 未按交易日重置(df['serial_number']==0).sum() 与交易日数对比按交易日起点重新编号夜盘品种不能按日历日期切(官方样例 11 个日历日期只对应 8 个交易日) episode 立刻结束当日 tick 数少于 obs_data_len + step_len打印每日行数分布调小窗口或改多日窗口设定停牌/半日市/夜盘尾巴都会触发 观测出现 NaN特征列含缺失(rolling 头部)df[feature_names].isna().sum()裁掉头部或填充本站双均线实验直接切掉 MA 未定义的前 20 行 结果明显不合理时间未排序 / 多标的混表 / tick 与 OHLC 混用检查时间单调性与标的一致性排序、拆表、统一频率多标的混表不报错但结果无意义

TradingGym · 运行期

TradingGym 运行期会报什么错?README 示例与属性缺失

这一类的报错原文最有用——它直接指出你用的写法在当前版本不存在。

运行期报错速查(前两条为本机实测原文) 报错原文 / 现象原因定位修法注意点 AttributeError: 'trading_env' object has no attribute 'backtest'README 的回测示例调用了只存在于 training_v0.py:442 的方法hasattr(env, 'backtest') 为 False改用 reset() + step() 循环,用 backtest_done 判断收尾别照 README 的 while 循环抄 AttributeError: 'Series' object has no attribute 'as_matrix'v0 系取数实现过时堆栈落在 reset()打补丁或改用 v1与安装无关,是兼容性问题 动作没有效果(策略像没响应)持仓已达 max_position,同向动作被环境改写为 0打印 env.info['position'].max()在策略里先判断上限环境不会报错,只静默改写 设了 gameover_limit 却不提前终止该参数只在 v0 系的 step() 生效确认环境 id 是否为 backtest_v1自己在外层加终止条件v1 的 step 里没有该判定 循环无法进入下一天忘记在单日结束后再调 reset()打印 env.backtest_donedate_record单日跑完后 if not env.backtest_done: env.reset()reset() 是「换一天」而非「重跑」

TradingGym · 结果异常

TradingGym 结果不对劲?先别怀疑模型,八成是口径

下面六种现象在本站实测里都能复现,且全部有明确的成因与一行定位命令。

结果异常诊断表(含本站实测数值) 现象最可能原因一行定位修法注意点 收益异常高(数十倍)把 reward_fluctuant(水平值 + 每 tick 持仓费)累加了对比 det['reward'].sum()det['reward_fluctuant'].sum()只用 reward 或独立重算单日实测 +28.1 vs -0.5,差 56 倍 step 累加 ≠ 账本step() 返回观测窗口内求和,窗口重叠同时打印 step 返回值与 info['reward'].sum()净值只用账本5 天实测 -19.500 vs -9.300 交易次数异常多窗口/步长过小(64/32 下一天 250–480 步)(det['position_variation']!=0).sum()加大窗口或加动作过滤实测 5 天 802 笔,成本项随之主导 reward 上升但净值下降训练 reward 与回测账本口径不同确认训练用的是 v0 还是 v1评估统一走账本v0 才有 fluc_div 缩放 长期只买不卖 / 停在上限达到 max_position 后同向被改写det['position'].max()策略内判断上限v1 的 gameover 不生效,也不会自动平仓 只持有一天就结束每日 tick 数不足或 serial_number 只识别出一天打印每日行数与该列 0 值数量修正分日或调小窗口见「数据契约」页 同一策略两次结果不同环境内部用全局 np.random 抽日(v0/v1 训练环境)同一脚本跑两次看日期是否相同用 backtest_v1 做可复现实验,或自行固定全局种子training_v1_random_choice_section,无 seed 参数

TradingGym · 排查流程

TradingGym 跑不通怎么排查?五步定位流程

顺序很重要:先确定阶段,再最小复现。直接改代码会同时引入多个变量,最后不知道是哪一处起了作用。

第 1 步 · 记录完整报错与堆栈

Traceback 一起复制,注意最后一行的异常类型与报错文件。TradingGym 的报错常见于 __init__.py(make 断言)与 envs/*.pyreset()/step()

预期输出:一张包含「文件:行号 + 异常类型 + 消息」的记录,用于对到本页表格。

第 2 步 · 判断失败阶段

import trading_env
print(trading_env.available_envs())          # 阶段 0:包是否可导入
env = trading_env.make(...)                  # 阶段 1:断言
obs = env.reset()                            # 阶段 2:取数(as_matrix / 索引)
obs, r, done, info = env.step(0)             # 阶段 3:运行
acc = env.info['reward'].sum()               # 阶段 4:结果口径

四个阶段对应四类原因,能把排查范围缩小到本页的一张表。

预期输出:明确知道卡在第几个 print 之前。

第 3 步 · 最小复现(只改一个变量)

df_small = df.iloc[:6000].copy()             # 用最小数据复现
env = trading_env.make('backtest_v1', 64, 32, df=df_small, fee=0.0,
                       max_position=1, deal_col_name='Price', feature_names=['Price'])

把特征降到 1 列、数据降到 6000 行,能在几秒内判断是环境问题还是数据问题。

预期输出:报错可稳定复现,或发现问题随数据规模出现(说明与分日/窗口有关)。

第 4 步 · 应用修法并复跑同一脚本

只改一处(例如加两行补丁),保持其他条件不变,重跑同一条命令。

预期输出:同一脚本从「报错」变为「通过」;若报错变化,说明触发了下一个阶段的检查。

第 5 步 · 记录结论,写清边界

记下:Python/pandas 版本、仓库 commit、命令、报错原文、修法。本站所有实测都按这个格式留档,这也是「下次不再踩」的唯一办法。

预期输出:一条可被别人复现的排查记录。

TradingGym · 速查

TradingGym 报错该搜什么关键字?速查表

遇到问题时,先用下面这些字符串在本页与搜索引擎里定位,比描述现象更快。

按报错关键字查(每条对应本页的处置) 关键字含义对应阶段去哪一页注意点 as_matrixpandas 1.0 起移除的方法被调用reset() 取数可运行性核验(含补丁)3/4 环境受此影响 has no attribute 'backtest'README 示例调用了不存在的方法回测循环回测循环页该方法只在 training_v0 serial_number分日依据缺失或未重置make() / reset()数据契约页夜盘品种的交易日跨午夜 AssertionError四个列断言之一失败make()数据契约页(四行定位)断言无消息 No module named trading_env/test官方 CI 的斜杠写法安装验证安装与验证页改用点号写法 reward_fluctuant水平值列被误当作可累加收益结果口径奖励与基准页单日差 56 倍 observation_space空间声明与实际形状不符接 SB3 时Gymnasium 适配页需重建 Box 空间

TradingGym · FAQ

TradingGym 报错排查常见问题是什么?

AttributeError: 'Series' object has no attribute 'as_matrix' 怎么修?

这是 pandas 1.0 起移除了 Series.as_matrix(),而 training_v0backtest_v0backtest_v1 仍在调用它。两种修法:①改用 training_v1(它用的是 to_numpy(),本机实测可直接 reset);②在导入 pandas 后加两行补丁 pd.Series.as_matrix = lambda self: self.to_numpy()(DataFrame 同理)。补丁只解决取数,不改变项目行为。以官方源码为准。

为什么会报没有 backtest 属性?

因为 README 的 Backtesting 示例用 env_id='backtest_v1' 调用 env.backtest(),而 def backtest(self) 只写在 training_v0.py:442。本机实测:hasattr(env,'backtest') 为 False、backtest_done 为 True。正确写法是 reset() 推进交易日、step() 跑当日、读 env.info

没有报错但结果很奇怪,从哪查起?

先查账本口径(三处 reward 数值不同),再查交易笔数是否异常,最后查分日与窗口。本站实测:把 reward_fluctuant 累加会得到比真实盈亏大 56 倍的数(单日 +28.1 vs -0.5);把 step() 返回值累加会得到 5 天 -19.5 而账本是 -9.3。两项都对了再看策略本身。

官方自测命令怎么跑?

.travis.yml 里写的是 python -m trading_env/test,本机实测报 No module named trading_env/test 并 exit 1;正确写法是 python -m trading_env.test,本机实测 exit 0、用时 0.2658 秒。它跑的是 training_v1 路径,因此不需要 as_matrix 补丁也能过。

报错里看不到任何提示信息怎么办?

make() 的四个断言都不带消息,只抛空 AssertionError。用本页第 2 节那段四行打印逐项检查:env_id 是否在 available_envs()deal_col_name 是否在列、是否有 serial_number、特征列是否齐全。第 4 项还会列出缺失列名。

我的报错不在这些表里,能确认是项目 bug 吗?

不能直接下定论。请先按五步流程确认:包能否导入、失败在哪一阶段、能否最小复现。项目 master HEAD 停在 2023-08-12,官方 CI 只覆盖 Python 3.4–3.6 且用的是已停服的 Travis,因此新环境下的问题大多属于「未维护」而不是「新 bug」。建议同时记录你的 Python/pandas 版本与复现脚本,再对照官方仓库的 issue 区。

下一步该怎么做?回到概览,确认路线与实验口径

首页汇总了四个环境的实测结论、已跑过的实验数字与三条路线;如果你的目标只是取数、指标或出图,首页也写明了另一条更省时间的走法。