diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index f14bc88a..0d2c0cd0 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -403,6 +403,26 @@ class FreqaiPrimer(IStrategy): 0 # 未来低波动(震荡市),快速止盈 ) + # ========== 诊断日志:输出动态阈值示例 ========== + if len(dataframe) > 0: + # 获取最后一行的动态阈值 + last_row = dataframe.iloc[-1] + market_state = str(last_row.get('market_state', 'unknown')) + entry_threshold_pct = last_row.get('dynamic_entry_up_percent', 0.5) + exit_threshold_pct = last_row.get('dynamic_exit_down_percent', 0.5) + entry_signal = int(last_row.get('&s-entry_signal', 0)) + exit_signal = int(last_row.get('&s-exit_signal', 0)) + + self.strategy_log( + f"[{metadata['pair']}] 动态标签阈值 | " + f"市场: {market_state} | " + f"入场阈值: {entry_threshold_pct:.2f}% | " + f"出场阈值: {exit_threshold_pct:.2f}% | " + f"入场标签: {entry_signal} | " + f"出场标签: {exit_signal}" + ) + # ========== 诊断日志结束 ========== + return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: diff --git a/动态标签阈值实施完成.txt b/动态标签阈值实施完成.txt new file mode 100644 index 00000000..88cd18c6 --- /dev/null +++ b/动态标签阈值实施完成.txt @@ -0,0 +1,116 @@ +✅ 动态标签阈值实施完成 + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +📊 动态调整 freqai_entry_up_percent 和 freqai_exit_down_percent +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +【修改位置】 +文件:freqtrade/templates/freqaiprimer.py +方法:set_freqai_targets() +行数:约 317-406 行 + +【核心逻辑】 + +1️⃣ 基础阈值映射(根据市场状态) + +市场状态 entry_up_percent exit_down_percent 说明 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +strong_bull 1.5% 0.3% 要求更大涨幅,快速止损 +weak_bull 1.0% 0.4% 适度提高门槛 +neutral 0.5% 0.5% 当前默认值 +weak_bear 0.4% 0.8% 降低门槛找反弹 +strong_bear 0.3% 1.0% 更低门槛,宽容止损 + +逻辑: +- 牛市中:提高入场门槛(避免追高),快速止损 +- 熊市中:降低入场门槛(寻找反弹),宽容止损 + +2️⃣ 波动率微调(±20%) + +volatility = ATR / close +vol_factor = 1.0 + (volatility - 0.02) * 5 +vol_factor = clip(0.8, 1.2) # 限制在 80%-120% 范围 + +final_threshold = base_threshold * vol_factor + +逻辑: +- 高波动市场:提高阈值(避免噪音) +- 低波动市场:降低阈值(捕捉小波动) + +3️⃣ 按行计算动态阈值 + +每根K线根据当时的市场状态和波动率计算独立的阈值 +dataframe['dynamic_entry_up_percent'] +dataframe['dynamic_exit_down_percent'] + +4️⃣ 应用到标签生成 + +entry_up_threshold = 1.0 + dynamic_entry_up_percent / 100.0 +exit_down_threshold = 1.0 - dynamic_exit_down_percent / 100.0 + +入场标签: future_max > close * entry_up_threshold +出场标签: future_min < close * exit_down_threshold + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +🎯 预期效果 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +1. ML模型在不同市场环境下的训练目标更合理 + ✅ 牛市:不会因为0.5%太容易达到而过度乐观 + ✅ 熊市:不会因为0.5%难以达到而样本不足 + +2. 训练标签分布更平衡 + ✅ 目标:各市场状态下保持 15-25% 的正样本比例 + ✅ 避免样本不平衡导致的模型偏差 + +3. 与策略整体一致 + ✅ 与动态ML阈值(方案B)协同 + ✅ 与双重过滤机制(方案A+B)协同 + ✅ 形成完整的自适应交易系统 + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +📋 诊断日志示例 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +[BTC/USDT] 动态标签阈值 | 市场: strong_bull | 入场阈值: 1.65% | 出场阈值: 0.27% | 入场标签: 1 | 出场标签: 0 +[ETH/USDT] 动态标签阈值 | 市场: strong_bear | 入场阈值: 0.32% | 出场阈值: 1.05% | 入场标签: 0 | 出场标签: 1 + +说明: +- 强牛市中,入场阈值自动提高到 1.65%(比默认0.5%高3倍) +- 强熊市中,入场阈值自动降低到 0.32%(比默认0.5%低35%) + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +⚠️ 注意事项 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +1. 需要重新训练ML模型 + - 标签定义已改变,旧模型无效 + - 建议:删除 user_data/models/ 下的所有模型 + - 重新运行训练 + +2. 回测时会看到诊断日志 + - 每个币种会输出最新一根K线的动态阈值 + - 可以观察不同市场状态下的阈值变化 + +3. 参数不再需要 Hyperopt 优化 + - freqai_entry_up_percent 和 freqai_exit_down_percent + - 可以从参数列表中移除或设为固定值 + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +🚀 下一步 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +1. 清理旧模型: + rm -rf user_data/models/* + +2. 重新训练(如果是 FreqAI 策略): + freqtrade trade --strategy FreqaiPrimer --config config.json --freqaimodel LightGBMClassifier + +3. 观察日志中的动态阈值是否合理 + +4. 回测验证效果(建议使用更长时间段): + freqtrade backtesting --config config.json --strategy FreqaiPrimer --timerange=20251101-20260108 + +建议commit信息: +git commit -m "实施动态标签阈值:根据市场状态和波动率自适应调整FreqAI训练目标" +