myTestFreqAI/chat/report3.md
zhangkun9038@dingtalk.com 6b365f3107 log
2025-05-05 21:33:46 +08:00

7.4 KiB
Raw Blame History

- Datetime: 2025-05-05 17:27:07 - Model: _qwen3/qwen-plus-latest - Selected files: - chat/report.md - chat/report2.md - freqtrade/templates/OKXRegressionStrategy.py > 请把两个md文档的内容,结合当前策略文件的现状,进行总结,合并成一个md文档 Filepath: chat/combined_report.md Replace lines: 1-0 ```markdown # 📈 Freqtrade AI 策略优化报告OKXRegressionStrategy ## 📅 日期 - Datetime: 2025-05-05 10:06:53 - Model: _qwen3/qwen-plus-latest

📁 分析文件

已选文件

  • result/backtest-result-2025-05-04_18-41-05.json
  • result/backtest-result-2025-05-04_18-41-05.meta.json
  • result/backtest-result-2025-05-04_18-41-05_OKXRegressionStrategy.py
  • result/backtest-result-2025-05-04_18-41-05_config.json
  • result/output_filted.log

📄 当前策略文件

  • freqtrade/templates/OKXRegressionStrategy.py

🧠 策略表现分析

📊 回测结果摘要OKB/USDT

指标 数值 分析
总交易数 38 笔 交易频率适中
胜率 (Win Rate) 50%19 胜 / 19 败) 虽然胜率较高,但总体仍为小幅亏损
平均盈利 -0.16% 即使在赢的情况下,盈利幅度也小于亏损
总亏损 -1.225 USDT 表明盈亏比失衡
最大回撤 (Max Drawdown) -2.52 USDT占账户的 0.25% 回撤过大说明模型对趋势反转反应迟钝

🔍 关键问题总结

问题 影响 建议
胜率虽为 50%,但总体仍亏损 盈亏比失衡 引入动态 ROI 或强化止盈逻辑
最大回撤过高 资金曲线不稳定 加强回调止损逻辑(如 Chandelier Exit
单一退出方式exit_signal 无法及时止损 恢复并优化 trailing stop loss
固定 ATR multiplier 不适应不同波动率 使用波动率百分位动态调整
无交叉验证 模型稳定性未知 加入 CV 验证防止过拟合

🛠️ 策略优化建议与实现

1. 动态 ATR MultiplierStop Loss / Take Profit

💡 实现思路:

根据历史 ATR 百分位动态调整止损倍数,避免固定值带来的滞后或过早平仓。

def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
                    current_rate: float, profit_percent: float,
                    after_fill: bool, **kwargs) -> Optional[float]:
    if trade.enter_tag != 'long':
        return None

    dataframe = self.dp.get_pair_dataframe(pair, timeframe=self.timeframe)
    atr_col = 'ATR_14'

    if atr_col not in dataframe.columns:
        dataframe[atr_col] = ta.ATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=14)

    latest_row = dataframe.iloc[-1]
    historical_atr = dataframe[atr_col].rolling(window=20).mean().dropna().values

    if len(historical_atr) < 20:
        return None

    current_atr = latest_row[atr_col]
    percentile = (np.sum(historical_atr < current_atr) / len(historical_atr)) * 100

    # 动态 ATR 乘数
    if percentile > 80:
        atr_multiplier = 1.5  # 高波动 → 更紧止损
    elif percentile < 20:
        atr_multiplier = 2.5  # 低波动 → 更松止损
    else:
        atr_multiplier = 2.0

    trailing_stop_price = current_rate - latest_row[atr_col] * atr_multiplier
    min_profit_ratio = 0.005  # 至少盈利 0.5%

    final_stop_price = max(trailing_stop_price, trade.open_rate * (1 + min_profit_ratio))
    return final_stop_price / current_rate - 1

2. 市场状态识别Market State Detection

💡 实现思路:

通过 ADX 判断市场处于趋势还是震荡状态,并据此调整 exit_signal 条件。

# 在 feature_engineering_expand_all 中添加 ADX
dataframe[f"%-%-adx-{period}"] = ta.ADX(dataframe["high"], dataframe["low"], dataframe["close"], timeperiod=period)

# 在 set_freqai_targets 中设置 market_state
dataframe["market_state"] = np.where(
    dataframe["adx"] > 25, "trend",
    np.where(dataframe["adx"] < 20, "oscillation", "neutral")
)

🛠️ populate_exit_trend 改进:

def populate_exit_trend(self, dataframe: DataFrame, metadata: Dict) -> DataFrame:
    pair = metadata['pair']
    dataframe['exit_signal'] = 0

    # 根据市场状态调整 exit 阈值
    trend_condition = (dataframe["&-s_close"] < 0.005) & (dataframe["%-%-rsi-14"] > 70)
    oscillation_condition = (dataframe["&-s_close"] < 0.01) & (dataframe["%-%-rsi-14"] > 65)

    dataframe.loc[
        ((dataframe["market_state"] == "trend") & trend_condition) |
        ((dataframe["market_state"] == "oscillation") & oscillation_condition),
        'exit_signal'
    ] = 1

    dataframe.loc[dataframe['exit_signal'] == 1, 'exit_long'] = 1
    return dataframe

3. 增强特征工程Feature Engineering

💡 实现建议:

启用 PCA 并加入更多高阶特征(如布林带宽度、成交量偏移、趋势线差值等)。

# 在 freqai_config 中启用 PCA
"feature_parameters": {
    "include_timeframes": ["5m", "15m", "1h"],
    "include_corr_pairlist": ["BTC/USDT", "ETH/USDT"],
    "label_period_candles": 12,
    "include_shifted_candles": 2,
    "principal_component_analysis": True,
    "DI_threshold": 0.5,
    "weight_factor": 0.9
}

新增特征示例:

def feature_engineering_expand_all(self, dataframe: DataFrame, period: int, metadata: Dict, **kwargs) -> DataFrame:
    # 布林带宽度
    upper, middle, lower = ta.BBANDS(dataframe["close"], timeperiod=period)
    dataframe[f"%-%-bb_width-{period}"] = (upper - lower) / middle

    # 成交量偏移
    dataframe[f"%-%-volume_change_{period}"] = dataframe["volume"].pct_change(period)

    # 趋势线差值
    dataframe[f"%-%-trend_diff_{period}"] = dataframe["close"] - ta.SMA(dataframe["close"], timeperiod=period)

    return dataframe

4. 启用 Time Series Cross Validation 提升泛化能力

💡 实现建议:

使用 time_series_split 替代简单划分,提升模型在时间序列上的稳定性。

{
  "data_split_parameters": {
    "test_size": 0.2,
    "shuffle": false,
    "stratify": false,
    "time_series_split": true,
    "n_splits": 5
  }
}

5. 加入模型预测置信度过滤

💡 实现建议:

利用模型输出的 pred_upperpred_lower 过滤低置信度信号。

def populate_entry_trend(self, dataframe: DataFrame, metadata: Dict) -> DataFrame:
    dataframe.loc[
        (
            (dataframe["&-s_close"] > 0.01) &
            (dataframe["do_predict"] == 1) &
            (dataframe["%-%-rsi-14"] < dataframe["&-buy_rsi_pred"]) &
            (dataframe["pred_upper"] - dataframe["pred_lower"] > 0.02)  # 置信区间大于 2%
        ),
        "enter_long"
    ] = 1
    return dataframe

📦 推荐修改文件结构

freqtrade/
├── templates/
│   └── OKXRegressionStrategy.py  # 主策略文件
├── user_data/
│   └── models/
│       └── test175/              # 存放模型缓存
└── config_examples/
    └── config_freqai.okx.json   # 启用 PCA、TS CV 等配置

📝 总结

问题 解决方案
Exit Signal 不稳定 引入 Market State + 分级条件
模型泛化能力弱 启用 PCA + TimeSeriesSplit
特征维度低 添加 BB Width、Volume Change、Trend Diff
固定止损不灵活 动态 ATR Multiplier
低质量信号多 加入 pred_upper/pred_lower 区间过滤