8.4 KiB
根据当前提供的策略文件 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 触发,与模型无关。
官方文档参考:
- FreqAI Feature Engineering:必须确保目标列如
&-s_close被正确识别并用于训练; - Custom Strategy:交易信号应基于有效预测值。
🔴 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. 验证建议
请执行以下操作验证模型是否加载成功并参与预测:
-
运行训练命令生成模型:
docker-compose run --rm freqtrade train --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy -
查看模型是否生成:
ls -la /home/ubuntu/freqtrade/user_data/models/test175/应看到类似
cb_okb_*.pkl的模型文件。 -
运行回测并检查预测列:
docker-compose run --rm freqtrade backtesting --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy -
打开
result/backtest-result-*.json查看预测列:- 检查
&-s_close,pred_upper,pred_lower是否随时间变化; - 若仍为恒定值或全为 NaN,则说明模型仍未加载成功。
- 检查
✅ 5. 总结
| 问题 | 是否解决 | 说明 |
|---|---|---|
| 模型未加载 | ❌ | 缺少 .pkl 模型文件 |
| 预测列为 NaN | ❌ | 模型未加载导致预测失败 |
| 交易信号仅由 RSI 触发 | ❌ | &-s_close 恒定为 0 |
| 模型未持久化 | ❌ | 每次回测都重新训练 |
| 策略类名不一致 | ✅ | 类名与文件名一致 |
📌 下一步建议
请优先执行以下任意一项操作以继续诊断:
- 提供
result/backtest-result-*.json中部分预测数据片段; - 提供
output_filted.log中关于模型加载和预测值的关键日志; - 告知是否可以运行新的训练 + 回测流程并启用
save_backtesting_prediction: true。
这将帮助我们进一步确认模型是否加载成功以及预测值是否合理。
Generation complete! Please review the code suggestions above.