TradingGym · TROUBLESHOOTING
TradingGym 报错排查:先定阶段,再改一处变量
TradingGym 的报错大多没有提示信息(四个 AssertionError 都不带消息),所以排错靠的是确定失败阶段:是 make() 的列断言、reset() 的取数、step() 的运行,还是结果口径算错。这页把四类问题的报错原文、定位命令与修法都列出来。
- 最常见两条:
as_matrix缺失(3/4 环境)与backtest属性缺失(README 示例) - 本机实测原文:两条
AttributeError、两条模块路径错误都逐字记录 - 结果类问题:收益异常高、reward 上升净值下降,根源都在账本口径
TradingGym 报错怎么定位?五步路径
_verify/as_is_result.txt)与源码断言位置绘制的排查流程示意(非官方流程图)。先定阶段能过滤掉大部分无效尝试。TradingGym · 安装类
TradingGym 安装与环境类报错:为什么「照教程装」会失败
这一类的共同点是:命令本身没问题,但装的东西不是你想的那个。下表每行都给出本机实测的命令与结果。
ERROR: Could not find a version that satisfies the requirement trading_envtrading_env 这个包(实测 404)pip index versions trading_env 或查 PyPI 页面git clone + python setup.py installpip install trading_env 无法执行ModuleNotFoundError: No module named 'trading_env'trading-gym,属 mymusise/Trading-Gym)pip show trading-gym 看 Home-pageModuleNotFoundError: No module named 'colour'colour 是 v1 两个环境的 import 依赖,未装时 import trading_env 直接失败python -c "import colour"pip install colour(setup.py 的 install_requires 已列)No module named trading_env/testpython -m trading_env/test(斜杠写法)python -m trading_env.testImportError: Missing optional dependency 'tables'pd.read_hdf,需要 PyTables,但不在 install_requirespip install tables,或改用 read_csv 读同一份样例dataset/SGXTW.h5,仓库实际文件名是 SGXTWsample.h5python -c "import sys;print(sys.executable)" 与 pip -V 对比python -m pip install ...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'as_matrix()(training_v0 / backtest_v0 / backtest_v1)reset()training_v1TypeError(iloc 相关)type(df.index)df = df.reset_index(drop=True)serial_number 未按交易日重置(df['serial_number']==0).sum() 与交易日数对比obs_data_len + step_lenNaNdf[feature_names].isna().sum()TradingGym · 运行期
TradingGym 运行期会报什么错?README 示例与属性缺失
这一类的报错原文最有用——它直接指出你用的写法在当前版本不存在。
AttributeError: 'trading_env' object has no attribute 'backtest'training_v0.py:442 的方法hasattr(env, 'backtest') 为 Falsereset() + step() 循环,用 backtest_done 判断收尾AttributeError: 'Series' object has no attribute 'as_matrix'reset()max_position,同向动作被环境改写为 0env.info['position'].max()gameover_limit 却不提前终止step() 生效backtest_v1reset()env.backtest_done 与 date_recordif not env.backtest_done: env.reset()reset() 是「换一天」而非「重跑」TradingGym · 结果异常
TradingGym 结果不对劲?先别怀疑模型,八成是口径
下面六种现象在本站实测里都能复现,且全部有明确的成因与一行定位命令。
reward_fluctuant(水平值 + 每 tick 持仓费)累加了det['reward'].sum() 与 det['reward_fluctuant'].sum()reward 或独立重算step() 返回观测窗口内求和,窗口重叠info['reward'].sum()(det['position_variation']!=0).sum()fluc_div 缩放max_position 后同向被改写det['position'].max()serial_number 只识别出一天np.random 抽日(v0/v1 训练环境)backtest_v1 做可复现实验,或自行固定全局种子training_v1 有 _random_choice_section,无 seed 参数TradingGym · 排查流程
TradingGym 跑不通怎么排查?五步定位流程
顺序很重要:先确定阶段,再最小复现。直接改代码会同时引入多个变量,最后不知道是哪一处起了作用。
第 1 步 · 记录完整报错与堆栈
连 Traceback 一起复制,注意最后一行的异常类型与报错文件。TradingGym 的报错常见于 __init__.py(make 断言)与 envs/*.py 的 reset()/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_matrixhas no attribute 'backtest'serial_numberAssertionErrorNo module named trading_env/testreward_fluctuantobservation_spaceTradingGym · FAQ
TradingGym 报错排查常见问题是什么?
AttributeError: 'Series' object has no attribute 'as_matrix' 怎么修?
这是 pandas 1.0 起移除了 Series.as_matrix(),而 training_v0、backtest_v0、backtest_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 区。