myTestFreqAI/chat/result7.md
zhangkun9038@dingtalk.com 6730a560fd log
2025-05-06 12:43:53 +08:00

8.4 KiB
Raw Blame History

根据当前提供的策略文件 OKXRegressionStrategy.py、配置文件 config_freqai.okx.json 和回测日志 output_filted.log,结合 Freqtrade 官方文档和实际运行逻辑,我进行了以下分析:


1. 策略是否正常工作?

结论:策略未按预期工作。

尽管代码结构基本符合 FreqAI 的要求,但存在几个关键问题导致模型预测未被正确使用,最终交易信号仅依赖 RSI。


🧨 2. 主要问题分析

🔴 2.1 模型未加载成功

日志证据:

2025-05-06 03:03:03,093 - OKXRegressionStrategy - WARNING - ⚠️ 模型文件未找到,请确认是否训练完成
2025-05-06 03:04:29,843 - freqtrade.plot.plotting - INFO - Stored plot as /freqtrade/user_data/models/test175/sub-train-OKB_1743465600/cb_okb_1743465600--s_close.html
2025-05-06 03:05:53,910 - OKXRegressionStrategy - WARNING - ⚠️ pred_upper 列全为 NaN可能模型未加载成功

原因:

  • 日志显示模型路径 /freqtrade/user_data/models/test175/ 下没有 .pkl 文件;
  • 虽然回测过程中重新训练了模型(生成了 HTML 图表),但这些模型未被保存或加载到策略中用于预测;
  • 回测结束后,pred_upper, pred_lower 列仍为 NaN,说明模型输出未生效。

官方文档参考:

  • FreqAI Running:需确保模型在训练后保存,并在回测时通过 load_trained_model: true 加载;
  • FreqAI Configuration:检查 model_filename 是否指向正确的模型路径。

🔴 2.2 预测列缺失或无效

日志证据:

2025-05-06 03:05:53,910 - OKXRegressionStrategy - WARNING - ⚠️ pred_upper 列全为 NaN可能模型未加载成功
2025-05-06 03:05:53,917 - OKXRegressionStrategy - DEBUG -    &-s_close  pred_upper  pred_lower
0        0.0         NaN         NaN
1        0.0         NaN         NaN
2        0.0         NaN         NaN
3        0.0         NaN         NaN
4        0.0         NaN         NaN

后果:

  • populate_entry_trend() 中的 valid_prediction = (~dataframe['&-s_close'].isna()) & (dataframe['&-s_close'] > 0.005) 实际上只依赖常量 0.0
  • 所有做多信号仅由 RSI < 30 触发,与模型无关。

官方文档参考:


🔴 2.3 模型训练未持久化

日志证据:

2025-05-06 03:04:43,510 - freqtrade.freqai.freqai_interface - INFO - Could not find model at /freqtrade/user_data/models/test175/sub-train-OKB_1744329600/cb_okb_1744329600

后果:

  • 每次回测都重新训练模型,且未保存模型供后续使用;
  • 导致无法复用已有模型进行稳定回测。

建议:

  • 使用 freqtrade train 显式训练模型并保存;
  • 在回测前确保模型已存在;
  • 设置 "purge_old_models": false 保留历史模型。

🛠️ 3. 解决方案与代码修复

3.1 修改策略类名以匹配文件名

问题:

  • 当前策略类名为 OKXRegressionStrategy,但文件名也为 OKXRegressionStrategy.py
  • 若从模板导入,需确保类名一致。

修改建议:

Filepath: freqtrade/templates/OKXRegressionStrategy.py Replace lines: 18-18

class OKXRegressionStrategy(IStrategy):

无需更改,当前命名已正确。


3.2 强制启用模型保存与加载

问题:

  • 回测时未加载已有模型;
  • 每次都重新训练,影响可重复性。

修改建议:

Filepath: config_examples/config_freqai.okx.json Replace lines: 62-68

"freqai": {
    "enabled": true,
    "identifier": "test175",
    "freqaimodel": "XGBoostRegressor",
    "save_backtesting_prediction": true,
    "purge_old_models": false,
    "load_trained_model": true,
    "model_filename": "/freqtrade/user_data/models/test175/cb_okb_*.pkl"

📌 说明:

  • 增加 model_filename 字段,明确指定模型路径;
  • 确保模型能被正确加载用于预测。

3.3 补充模型训练命令以生成 .pkl 文件

问题:

  • 当前直接运行回测会触发训练,但不会持久化模型;
  • 应先显式训练模型再进行回测。

解决方案:

# 先训练模型
docker-compose run --rm freqtrade train --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy

# 再运行回测
docker-compose run --rm freqtrade backtesting --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy

📌 说明:

  • 训练完成后会在 /freqtrade/user_data/models/test175/ 下生成 .pkl 模型文件;
  • 回测时将加载该模型进行预测。

3.4 确保 set_freqai_targets() 正确设置目标列

问题:

  • 目标列 &-s_close, &-roi_0_pred 已定义;
  • 但在某些情况下未被 FreqAI 正确识别。

修改建议:

Filepath: freqtrade/templates/OKXRegressionStrategy.py Replace lines: 0-0

def set_freqai_targets(self, dataframe: DataFrame, metadata: Dict) -> DataFrame:
    # 设置回归目标
    label_period = self.freqai_config["feature_parameters"]["label_period_candles"]
    dataframe["&-s_close"] = (dataframe["close"].shift(-label_period) - dataframe["close"]) / dataframe["close"]

    # 设置动态 ROI 和止损阈值
    dataframe["&-roi_0_pred"] = 0.03  # 默认值,防止空值
    dataframe["&-stoploss_pred"] = -0.05

    return dataframe

📌 说明:

  • 提供默认值避免空列;
  • 确保列名与 feature_engineering_expand_all() 中的特征一致;
  • 可进一步扩展为基于 ADX 的动态设定。

3.5 确保 populate_entry_trend() 使用模型预测值

问题:

  • 当前 valid_prediction 条件过于宽松,仅判断 &-s_close > 0.005
  • 若模型未加载,此条件始终成立,导致信号仅由 RSI 控制。

修改建议:

Filepath: freqtrade/templates/OKXRegressionStrategy.py Replace lines: 365-365

valid_prediction = (~dataframe['&-s_close'].isna()) & (dataframe['&-s_close'] > 0.005) & (dataframe['&-s_close'].abs() > 0.001)

📌 说明:

  • 添加 abs() > 0.001 过滤掉恒定为零的预测值;
  • 确保只有当模型真正输出有意义数值时才生成信号。

📊 4. 验证建议

请执行以下操作验证模型是否加载成功并参与预测:

  1. 运行训练命令生成模型:

    docker-compose run --rm freqtrade train --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy
    
  2. 查看模型是否生成:

    ls -la /home/ubuntu/freqtrade/user_data/models/test175/
    

    应看到类似 cb_okb_*.pkl 的模型文件。

  3. 运行回测并检查预测列:

    docker-compose run --rm freqtrade backtesting --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy
    
  4. 打开 result/backtest-result-*.json 查看预测列:

    • 检查 &-s_close, pred_upper, pred_lower 是否随时间变化;
    • 若仍为恒定值或全为 NaN则说明模型仍未加载成功。

5. 总结

问题 是否解决 说明
模型未加载 缺少 .pkl 模型文件
预测列为 NaN 模型未加载导致预测失败
交易信号仅由 RSI 触发 &-s_close 恒定为 0
模型未持久化 每次回测都重新训练
策略类名不一致 类名与文件名一致

📌 下一步建议

请优先执行以下任意一项操作以继续诊断:

  1. 提供 result/backtest-result-*.json 中部分预测数据片段;
  2. 提供 output_filted.log 中关于模型加载和预测值的关键日志;
  3. 告知是否可以运行新的训练 + 回测流程并启用 save_backtesting_prediction: true

这将帮助我们进一步确认模型是否加载成功以及预测值是否合理。

Generation complete! Please review the code suggestions above.