245 lines
8.4 KiB
Markdown
245 lines
8.4 KiB
Markdown
根据当前提供的策略文件 `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](https://www.freqtrade.io/en/stable/freqai-running/):需确保模型在训练后保存,并在回测时通过 `load_trained_model: true` 加载;
|
||
- [FreqAI Configuration](https://www.freqtrade.io/en/stable/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](https://www.freqtrade.io/en/stable/freqai-feature-engineering/):必须确保目标列如 `&-s_close` 被正确识别并用于训练;
|
||
- [Custom Strategy](https://www.freqtrade.io/en/stable/strategy-customization/):交易信号应基于有效预测值。
|
||
|
||
---
|
||
|
||
### 🔴 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
|
||
```python
|
||
class OKXRegressionStrategy(IStrategy):
|
||
```
|
||
|
||
✅ 无需更改,当前命名已正确。
|
||
|
||
---
|
||
|
||
### ✅ **3.2 强制启用模型保存与加载**
|
||
|
||
**问题:**
|
||
- 回测时未加载已有模型;
|
||
- 每次都重新训练,影响可重复性。
|
||
|
||
**修改建议:**
|
||
|
||
Filepath: config_examples/config_freqai.okx.json
|
||
Replace lines: 62-68
|
||
```json
|
||
"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` 文件**
|
||
|
||
**问题:**
|
||
- 当前直接运行回测会触发训练,但不会持久化模型;
|
||
- 应先显式训练模型再进行回测。
|
||
|
||
**解决方案:**
|
||
|
||
```bash
|
||
# 先训练模型
|
||
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
|
||
```python
|
||
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
|
||
```python
|
||
valid_prediction = (~dataframe['&-s_close'].isna()) & (dataframe['&-s_close'] > 0.005) & (dataframe['&-s_close'].abs() > 0.001)
|
||
```
|
||
|
||
📌 **说明:**
|
||
- 添加 `abs() > 0.001` 过滤掉恒定为零的预测值;
|
||
- 确保只有当模型真正输出有意义数值时才生成信号。
|
||
|
||
---
|
||
|
||
## 📊 **4. 验证建议**
|
||
|
||
请执行以下操作验证模型是否加载成功并参与预测:
|
||
|
||
1. **运行训练命令生成模型:**
|
||
```bash
|
||
docker-compose run --rm freqtrade train --config config_examples/config_freqai.okx.json --freqaimodel XGBoostRegressor --strategy OKXRegressionStrategy
|
||
```
|
||
|
||
2. **查看模型是否生成:**
|
||
```bash
|
||
ls -la /home/ubuntu/freqtrade/user_data/models/test175/
|
||
```
|
||
应看到类似 `cb_okb_*.pkl` 的模型文件。
|
||
|
||
3. **运行回测并检查预测列:**
|
||
```bash
|
||
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.
|
||
|