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

245 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

根据当前提供的策略文件 `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.