PPO模型TensorBoard表现与实际推理结果不符问题咨询
股票交易强化学习模型训练与推理表现不一致问题
环境与模型设置
- 自定义多股票交易环境,每个episode固定11步
- 观测数据格式:
[[price_tminus2,price_diff_tminus3_&_tminus2],[price_tminus1,price_diff_tminus2_&_tminus1], [price_t,price_diff_tminus1_&_t]] - 调用
env.reset()时生成由[action, volume]对组成的离散动作列表(后续计划转为连续动作),模型通过选择索引执行对应行为
问题现象
TensorBoard显示训练阶段平均episode奖励已收敛至该episode的最大可能值,但使用model.predict()单步推理验证单episode时,表现极差,奖励结果与训练时完全不符。
推理验证代码
eval_env = gym.make('stockbuyselln-v0', df=df_sin, frame_bound=(5,16), window_size=3, initCash=1) obs = np.array(eval_env.reset()) while True: obs = eval_env.get_observation() action, _states = PPO_model.predict(obs) obs, rewards, done, truncated, info = eval_env.step(action) if done: # print("info", info) break plt.figure(figsize=(15,6)) eval_env.render_all() plt.show()
可能的原因及排查方向
- 观测数据预处理不匹配:训练时若对观测数据做了归一化、标准化或其他预处理,推理时必须执行完全相同的操作。如果推理时直接使用原始观测值,模型输入分布与训练时差异过大,会导致表现暴跌。检查训练 pipeline 中是否有对
obs的缩放、归一化步骤,推理代码是否遗漏。 - 环境初始化参数不一致:训练环境与推理环境的核心参数(如
frame_bound、window_size、初始资金initCash)必须完全一致。代码中推理环境用了frame_bound=(5,16),需确认训练时是否使用了相同的数据区间,避免因数据分布不同导致模型失效。 - 推理模式错误:PPO模型训练时会通过随机采样动作进行探索,但推理时需切换到确定性模式。调用
model.predict()时需传入deterministic=True参数(即PPO_model.predict(obs, deterministic=True)),否则推理时模型仍会随机选择动作,导致表现不稳定。 - 步序逻辑错误:当前推理代码中,
reset()返回的初始观测被丢弃,转而调用eval_env.get_observation()获取观测,这可能导致第一步动作基于错误的初始状态。正确流程应为:obs = eval_env.reset()后直接用该obs预测动作,无需额外调用get_observation()。 - 奖励计算逻辑不一致:确认训练环境与推理环境的奖励计算函数完全相同,是否存在训练时使用了奖励 shaping 但推理时未同步的情况。
- 离散动作列表生成差异:检查
env.reset()生成的离散动作列表在训练和推理时是否完全一致,避免模型选择的索引对应不同的[action, volume]对,导致执行错误行为。
内容的提问来源于stack exchange,提问作者José Luis Neves
相关产品推荐
相关产品推荐

