251 lines
7.6 KiB
Markdown
251 lines
7.6 KiB
Markdown
> 请实现代码:
|
||
> 1. **将 `&-divergence_score` 改为连续值形式**
|
||
> 2. **移除任何离散值列(如 market_condition 编码)**
|
||
> 3. **保持使用 `LightGBMMultiTargetRegressor` 模型**
|
||
> 4. **在策略中使用这些连续值进行动态交易决策**
|
||
|
||
|
||
Error: {
|
||
exit = 56,
|
||
message = 'post https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions - curl error exit_code=56 stderr={ "curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0" }',
|
||
stderr = '{ "curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0" }'
|
||
}
|
||
|
||
-------
|
||
|
||
- Datetime: 2025-05-31 08:40:04
|
||
|
||
- Model: _qwen3/qwen-plus-latest
|
||
|
||
- Selected files:
|
||
- freqtrade/templates/freqaiprimer.py
|
||
|
||
> 中断了,请继续
|
||
|
||
|
||
非常理解,我们继续完成你的需求。
|
||
|
||
---
|
||
|
||
## ✅ 你的目标
|
||
|
||
你希望:
|
||
|
||
1. **将 `&-divergence_score` 改为连续值形式**
|
||
2. **移除任何离散值列(如 `&-market_condition`)**
|
||
3. **保持使用 `LightGBMMultiTargetRegressor` 模型**
|
||
4. **在策略中使用这些连续值进行动态交易决策**
|
||
|
||
---
|
||
|
||
## ✅ 实现步骤概览
|
||
|
||
我们将完成以下修改:
|
||
|
||
| 步骤 | 内容 |
|
||
|------|------|
|
||
| 🧮 Step 1 | 修改 `set_freqai_targets()`:生成连续背离评分 |
|
||
| 🧹 Step 2 | 移除所有离散值列(如 `&-market_condition`) |
|
||
| 📈 Step 3 | 配置 FreqAI 使用 `LightGBMMultiTargetRegressor` |
|
||
| 🛠 Step 4 | 在 `populate_entry_trend()` 和 `populate_exit_trend()` 中使用连续背离信号 |
|
||
|
||
---
|
||
|
||
## 🧮 Step 1:修改 `set_freqai_targets()`,生成连续背离评分
|
||
|
||
```python
|
||
def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame:
|
||
"""
|
||
使用历史窗口预测未来趋势和波动率作为辅助信号,
|
||
并新增一个连续值的背离评分列 &-divergence_score
|
||
"""
|
||
|
||
label_period = self.freqai_info["feature_parameters"]["label_period_candles"]
|
||
|
||
# 1. 趋势强度:使用过去 N 根 K 线的收益率判断当前趋势
|
||
dataframe["&-trend_strength"] = dataframe["close"].pct_change(label_period)
|
||
|
||
# 2. 波动率预测:使用过去 N 根 K 线的价格变动绝对值
|
||
dataframe["&-volatility_forecast"] = dataframe["close"].pct_change(label_period).abs()
|
||
|
||
# 3. ROI 目标:基于趋势强度缩放
|
||
dataframe["&-roi_target"] = np.where(
|
||
dataframe["&-trend_strength"] > 0,
|
||
dataframe["&-trend_strength"] * 1.5,
|
||
0.01 # 最小 ROI
|
||
)
|
||
|
||
# 4. 动态止损目标:基于波动率缩放
|
||
dataframe["&-stoploss_target"] = -dataframe["&-volatility_forecast"] * 1.2
|
||
|
||
# 5. 新增:连续背离评分(价格与趋势的偏离程度)
|
||
dataframe["price_change"] = dataframe["close"].pct_change(label_period)
|
||
dataframe["trend_change"] = dataframe["&-trend_strength"].pct_change(label_period)
|
||
|
||
# 连续背离评分:正值表示正向背离,负值表示负向背离
|
||
dataframe["&-divergence_score"] = dataframe["price_change"] - dataframe["trend_change"]
|
||
|
||
return dataframe
|
||
```
|
||
|
||
---
|
||
|
||
## 🧹 Step 2:移除所有离散值列(如 `&-market_condition`)
|
||
|
||
如果你之前定义了 `&-market_condition` 或其他分类列,请从 `set_freqai_targets()` 和 `populate_indicators()` 中删除它们。
|
||
|
||
### ❌ 删除示例:
|
||
```python
|
||
# 删除以下代码(如果存在)
|
||
if "bb_upperband-period" in dataframe.columns and "bb_lowerband-period" in dataframe.columns:
|
||
dataframe["&-market_condition"] = np.select([
|
||
(dataframe["close"] > dataframe["bb_upperband-period"]),
|
||
(dataframe["close"] < dataframe["bb_lowerband-period"]),
|
||
(dataframe["&-trend_strength"] > 0.03),
|
||
], [
|
||
"overbought",
|
||
"oversold",
|
||
"strong_up",
|
||
], default="sideways")
|
||
```
|
||
|
||
同时确保不再使用这些列做任何逻辑判断。
|
||
|
||
---
|
||
|
||
## 📈 Step 3:配置 FreqAI 使用 `LightGBMMultiTargetRegressor`
|
||
|
||
在你的策略类中设置:
|
||
|
||
```python
|
||
freqai_info = {
|
||
"model": "LightGBMMultiTargetRegressor", # ✅ 多目标回归模型
|
||
"feature_parameters": {
|
||
"include_timeframes": ["5m", "15m", "1h"],
|
||
"label_period_candles": 24,
|
||
"include_shifted_candles": 3,
|
||
"principal_component_analysis": True, # 可选:启用 PCA 提升泛化能力
|
||
},
|
||
"data_split_parameters": {
|
||
"test_size": 0.2,
|
||
"shuffle": False,
|
||
},
|
||
"model_training_parameters": {
|
||
"n_estimators": 200,
|
||
"learning_rate": 0.05,
|
||
"num_leaves": 31,
|
||
"verbose": -1,
|
||
},
|
||
}
|
||
```
|
||
|
||
这样 FreqAI 将使用 LightGBM 的多输出回归模型来同时预测多个连续目标列。
|
||
|
||
---
|
||
|
||
## 🛠 Step 4:在策略中使用连续背离信号进行交易决策
|
||
|
||
### ✅ 示例:在 `populate_entry_trend()` 中使用 `&-divergence_score`
|
||
|
||
```python
|
||
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
|
||
conditions = []
|
||
|
||
if "&-divergence_score" in df.columns:
|
||
|
||
# 正向背离:价格下跌但趋势上升(背离评分为正值)
|
||
buy_condition = df["&-divergence_score"] > 0.01
|
||
|
||
# 结合趋势强度过滤
|
||
if "&-trend_strength" in df.columns:
|
||
buy_condition &= df["&-trend_strength"] > 0.005
|
||
|
||
# 成交量过滤:成交量需大于 20 日均值的 1 倍
|
||
df["vol_mean"] = df["volume"].rolling(20).mean()
|
||
buy_condition &= (df["volume"] > df["vol_mean"] * 1)
|
||
|
||
conditions.append(buy_condition)
|
||
|
||
if len(conditions):
|
||
df.loc[reduce(lambda x, y: x & y, conditions), 'enter_long'] = 1
|
||
|
||
return df
|
||
```
|
||
|
||
### ✅ 示例:在 `populate_exit_trend()` 中使用 `&-divergence_score`
|
||
|
||
```python
|
||
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
|
||
conditions = []
|
||
|
||
if "&-divergence_score" in df.columns:
|
||
|
||
# 负向背离:价格上涨但趋势下降(背离评分为负值)
|
||
sell_condition = df["&-divergence_score"] < -0.01
|
||
|
||
# 结合趋势强度过滤
|
||
if "&-trend_strength" in df.columns:
|
||
sell_condition &= df["&-trend_strength"] < -0.005
|
||
|
||
conditions.append(sell_condition)
|
||
|
||
if len(conditions):
|
||
df.loc[reduce(lambda x, y: x & y, conditions), 'exit_long'] = 1
|
||
|
||
return df
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 Step 5:更新 `plot_config`(可选)
|
||
|
||
你可以将背离评分加入绘图配置,方便可视化观察:
|
||
|
||
```python
|
||
plot_config = {
|
||
"main_plot": {},
|
||
"subplots": {
|
||
"Signals": {
|
||
"enter_long": {"color": "green"},
|
||
"exit_long": {"color": "red"}
|
||
},
|
||
"FreqAI Predictions": {
|
||
"&-trend_strength": {"color": "blue"},
|
||
"&-volatility_forecast": {"color": "orange"},
|
||
"&-divergence_score": {"color": "purple"}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 总结改进点
|
||
|
||
| 改进项 | 描述 |
|
||
|--------|------|
|
||
| ✅ `&-divergence_score` 改为连续值 | 更适合回归模型学习 |
|
||
| ✅ 移除所有离散值列 | 如 `&-market_condition` |
|
||
| ✅ 使用 `LightGBMMultiTargetRegressor` | 同时预测多个连续目标 |
|
||
| ✅ 在策略中使用背离评分进行交易决策 | 提高反转识别能力 |
|
||
|
||
---
|
||
|
||
## ✅ 下一步建议
|
||
|
||
你可以:
|
||
|
||
- 使用 `freqtrade plot-dataframe` 查看背离信号是否合理
|
||
- 使用 `freqtrade backtesting` 测试新策略表现
|
||
- 使用 `freqtrade hyperopt` 对背离阈值进行优化
|
||
|
||
---
|
||
|
||
如果你希望我帮你生成完整的策略文件,并提供对应的 `config.json` 示例,请告诉我 👇 我可以一步步帮你完成。
|
||
|
||
freqtrade plot-dataframe --strategy DivergenceRegressionStrategy \
|
||
--timerange=20250501-20250510 \
|
||
--timeframe=5m \
|
||
--exchange=binance \
|
||
--pair=ETH/USDT
|