myTestFreqAI/chat/result13.md
2025-05-31 16:04:05 +00:00

7.6 KiB
Raw Permalink Blame History

请实现代码:

  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(),生成连续背离评分

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