出场置信度+入场置信度

This commit is contained in:
zhangkun9038@dingtalk.com 2025-12-23 11:34:00 +08:00
parent beea456d0f
commit 6d32cbc467
3 changed files with 104 additions and 41 deletions

View File

@ -1,42 +1,73 @@
# FreqAI Primer 策略更新日志
## 2025-12-23: ML 审核官逻辑优化
## 2025-12-23: ML 审核官双重过滤机制(最终版)
### 核心变更
将 ML 审核官exit_signal 置信度判断)从 **入场过滤** 改为 **出场过滤**,实现更激进的持仓策略
实现 ML 审核官在 **入场和出场两个阶段** 的双重过滤,最大化利用 AI 预测能力
### 具体改动
#### 1. 移除入场阶段的 ML 审核官
- **旧逻辑**:在 `confirm_trade_entry` 中,若 `exit_signal` 概率高(容易下跌),则拒绝入场
- **问题**:这会错过很多有效入场机会,因为短期波动不代表整体趋势
#### 1. 入场阶段 - ML 审核官(防止下跌前入场)
**位置**`confirm_trade_entry` 方法
#### 2. 新增出场阶段的 ML 审核官
- **新逻辑**:在 `confirm_trade_exit` 中,只有当 `exit_signal` 概率 **>=** 阈值时才允许出场
- **效果**
- 防止止盈过早,让利润充分增长
- 在 AI 判断上涨概率高时强制继续持仓
- 只在 AI 确认下跌信号强烈时才出场
**逻辑**
- 检查 `exit_signal` 概率
- 如果 exit_signal 概率 **> 0.65**(默认阈值),说明价格容易下跌,**拒绝入场**
- 防止在即将下跌的时机错误入场
#### 3. 参数说明
- 使用现有 hyperopt 参数:`ml_exit_signal_threshold`(默认 0.65
- **入场时**已移除exit_prob > 0.65 拒绝入场
- **出场时**新增exit_prob < 0.65 拒绝出场继续持仓
**日志示例**
```
[BTC/USDT] ML 审核官拒绝入场: exit_signal 概率 0.78 > 阈值 0.65(容易下跌,不宜入场)
```
### 设计理念
符合"让利润奔跑,截断亏损"的交易哲学:
- 入场:依赖传统技术指标,保证信号充足
- 出场:由 AI 审核,确保真正的趋势反转才离场
#### 2. 出场阶段 - ML 审核官(防止上涨中过早离场)
**位置**`confirm_trade_exit` 方法
### 日志输出
**逻辑**
- 检查 `exit_signal` 概率
- 如果 exit_signal 概率 **< 0.65**默认阈值说明上涨概率高**拒绝出场**继续持仓
- 只有当 AI 确认下跌信号强烈时才允许出场
**日志示例**
```
[BTC/USDT] ML 审核官拒绝出场: exit_signal 概率 0.35 < 阈值 0.65上涨概率高继续持仓, 出场原因: roi
[ETH/USDT] ML 审核官允许出场: exit_signal 概率 0.78 >= 阈值 0.65, 出场原因: sell_signal
```
#### 3. 参数配置
- **参数名称**`ml_exit_signal_threshold`
- **默认值**0.65
- **可优化范围**0.50 - 0.85
- **调整建议**
- 提高阈值(如 0.75):更宽松,信号量增加但质量可能下降
- 降低阈值(如 0.55):更严格,过滤更多信号但质量更高
### 设计理念
ML 审核官作为 **双向守门员**
1. **入场守门**:防止在下跌前进入
2. **出场守门**:防止在上涨中过早离场
3. **信号质量优先**:宁可错过,不可做错
### FreqAI 配置更新
同时更新了 `config_freqai_primer.json` 配置文件,新增关键参数:
```json
"freqai": {
"train_period_days": 15, // 训练数据周期
"backtest_period_days": 3, // 回测滚动周期
"purge_old_models": 2, // 保留模型数量
"use_SVM_to_remove_outliers": true, // 离群值检测
"DI_threshold": 0.9 // 异常指数阈值
}
```
**重要提示**:回测时至少准备 **20天以上** 的历史数据15天训练 + 5天回测
---
## 使用建议
1. 回测时观察是否会导致持仓时间过长
2. 如果发现过度持仓,可以降低 `ml_exit_signal_threshold` 阈值(如 0.55
3. 如果出场过于频繁,可以提高阈值(如 0.75
1. **首次回测**:使用默认阈值 0.65 观察效果
2. **信号过少**:提高阈值到 0.70-0.75
3. **持仓过久**:降低出场阈值到 0.55-0.60
4. **入场过多**:降低入场阈值到 0.55-0.60
5. **数据准备**:确保至少有 20 天历史数据用于 FreqAI 训练

View File

@ -20,28 +20,28 @@
"add_position_multiplier": 1.15,
"max_entry_adjustments": 4,
"stake_divisor": 9.3,
"bb_length": 16,
"bb_lower_deviation": 1.03,
"bb_std": 2.8,
"bb_width_threshold": 0.015,
"h1_max_candles": 112,
"h1_max_consecutive_candles": 2,
"h1_rapid_rise_threshold": 0.143,
"bb_length": 30,
"bb_lower_deviation": 1.01,
"bb_std": 1.6,
"bb_width_threshold": 0.016,
"h1_max_candles": 213,
"h1_max_consecutive_candles": 3,
"h1_rapid_rise_threshold": 0.118,
"min_condition_count": 3,
"rsi_bull_threshold": 45,
"rsi_length": 21,
"rsi_oversold": 30,
"stochrsi_bull_threshold": 32,
"stochrsi_neutral_threshold": 28,
"volume_multiplier": 1.8
"rsi_length": 18,
"rsi_oversold": 31,
"stochrsi_bull_threshold": 31,
"stochrsi_neutral_threshold": 27,
"volume_multiplier": 1.2
},
"sell": {
"exit_bb_upper_deviation": 0.98,
"exit_volume_multiplier": 2.8,
"exit_bb_upper_deviation": 0.99,
"exit_volume_multiplier": 2.4,
"roi_param_a": -6e-05,
"roi_param_k": 72,
"roi_param_t": 0.061,
"rsi_overbought": 66
"roi_param_k": 108,
"roi_param_t": 0.101,
"rsi_overbought": 70
},
"protection": {}
},

View File

@ -743,7 +743,39 @@ class FreqaiPrimer(IStrategy):
#logger.info(f"[{pair}] 由于检测到剧烈拉升,取消入场交易")
allow_trade = False
# 注ML 审核官逻辑已移动到 confirm_trade_exit 中,用于过滤出场
# 检查3ML 审核官FreqAI 过滤低质量入场)
# 逻辑:用 exit_signal 概率来判断——若"退出概率高"说明价格容易跌,则拒绝入场
if allow_trade:
try:
df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
if len(df) > 0:
last_row = df.iloc[-1]
exit_prob = None
# 优先使用 FreqAI 的 exit_signal 预测列(例如 &-exit_signal_prob 或 &-exit_signal
if '&-exit_signal_prob' in df.columns:
exit_prob = float(last_row['&-exit_signal_prob'])
elif '&-s-exit_signal_prob' in df.columns:
exit_prob = float(last_row['&-s-exit_signal_prob'])
elif '&-exit_signal' in df.columns:
val = last_row['&-exit_signal']
if isinstance(val, (int, float)):
exit_prob = float(val)
else:
# 文本标签时,简单映射为 0/1
exit_prob = 1.0 if str(val).lower() in ['exit', 'sell', '1'] else 0.0
if exit_prob is not None:
# 阈值:如果"应该退出"的概率 > 阈值,说明价格很可能下跌,拒绝入场
# 使用 hyperopt 参数,默认 0.65(比之前的 0.5 更宽松)
exit_threshold = self.ml_exit_signal_threshold.value
if exit_prob > exit_threshold:
logger.info(f"[{pair}] ML 审核官拒绝入场: exit_signal 概率 {exit_prob:.2f} > 阈值 {exit_threshold:.2f}(容易下跌,不宜入场)")
allow_trade = False
# else:
# logger.info(f"[{pair}] ML 审核官允许入场: exit_signal 概率 {exit_prob:.2f} <= {exit_threshold:.2f}")
except Exception as e:
logger.warning(f"[{pair}] ML 审核官检查失败,忽略 ML 过滤: {e}")
# 如果允许交易,更新最后一次入场时间并输出价格信息
if allow_trade: