7.6 KiB
请实现代码:
- 将
&-divergence_score改为连续值形式- 移除任何离散值列(如 market_condition 编码)
- 保持使用
LightGBMMultiTargetRegressor模型- 在策略中使用这些连续值进行动态交易决策
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
中断了,请继续
非常理解,我们继续完成你的需求。
✅ 你的目标
你希望:
- 将
&-divergence_score改为连续值形式 - 移除任何离散值列(如
&-market_condition) - 保持使用
LightGBMMultiTargetRegressor模型 - 在策略中使用这些连续值进行动态交易决策
✅ 实现步骤概览
我们将完成以下修改:
| 步骤 | 内容 |
|---|---|
| 🧮 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(),生成连续背离评分
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() 中删除它们。
❌ 删除示例:
# 删除以下代码(如果存在)
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
在你的策略类中设置:
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
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
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(可选)
你可以将背离评分加入绘图配置,方便可视化观察:
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