根据市场状态动态获取入场/出场阈值,不再使用hyperopt优化这两个ml_entry_signal_threshold,ml_exit_signal_threshold

This commit is contained in:
Ubuntu 2026-01-10 14:43:24 +00:00
parent dc29df308d
commit 1ce14270ea
2 changed files with 37 additions and 9 deletions

View File

@ -228,10 +228,14 @@ class FreqaiPrimer(IStrategy):
entry_interval_minutes = IntParameter(20, 200, default=42, optimize=True, load=True, space='buy')
# ML 审核官entry_signal 拒绝入场的阈值(越高越宽松,越低越严格)
ml_entry_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.78, optimize=True, load=True, space='buy')
# ML 审核官exit_signal 拒绝出场的阈值(越高越宽松,越低越严格)
ml_exit_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.68, optimize=True, load=True, space='buy')
# ml_entry_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.90, optimize=True, load=True, space='buy')
#
# # ML 审核官exit_signal 拒绝出场的阈值(越高越宽松,越低越严格)
# ml_exit_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.68, optimize=True, load=True, space='buy')
# ML 审核官阈值已改为根据市场状态动态调整,不再使用固定参数
# strong_bull: 入场0.15/出场0.85, weak_bull: 0.325/0.675, neutral: 0.50/0.50
# weak_bear: 0.675/0.325, strong_bear: 0.85/0.15
# FreqAI 标签定义entry_signal 的洛底上涨幅度(%
freqai_entry_up_percent = DecimalParameter(0.3, 2.0, decimals=2, default=0.5, optimize=True, load=True, space='buy')
@ -809,7 +813,32 @@ class FreqaiPrimer(IStrategy):
except Exception as e:
logger.error(f"[{pair}] 剧烈拉升检测过程中发生错误: {str(e)}")
return False
def get_ml_threshold_by_market_state(self, market_state: str, threshold_type: str = 'entry') -> float:
"""
根据市场状态动态获取 ML 审核官阈值
Args:
market_state: 市场状态 (strong_bull, weak_bull, neutral, weak_bear, strong_bear)
threshold_type: 阈值类型 ('entry' 'exit')
Returns:
float: 动态计算的阈值
"""
# 市场状态到阈值的映射
thresholds_map = {
'strong_bull': {'entry': 0.15, 'exit': 0.85},
'weak_bull': {'entry': 0.325, 'exit': 0.675},
'neutral': {'entry': 0.50, 'exit': 0.50},
'weak_bear': {'entry': 0.675, 'exit': 0.325},
'strong_bear': {'entry': 0.85, 'exit': 0.15}
}
# 默认值(如果市场状态未知)
default_threshold = 0.50
return thresholds_map.get(market_state, {}).get(threshold_type, default_threshold)
def confirm_trade_entry(
self,
pair: str,
@ -917,7 +946,8 @@ class FreqaiPrimer(IStrategy):
if entry_prob is not None:
# 确保概率在 [0, 1] 范围内(分类器输出可能有浮点误差)
entry_prob = max(0.0, min(1.0, entry_prob))
entry_threshold = self.ml_entry_signal_threshold.value
# 根据市场状态动态获取入场阈值
entry_threshold = self.get_ml_threshold_by_market_state(market_state, 'entry')
# 记录entry_signal值用于调试
self.strategy_log(f"[{pair}] ML 审核官检查: entry_signal={entry_prob:.2f}, 阈值={entry_threshold:.2f}, 市场状态={market_state}")
if entry_prob < entry_threshold:
@ -997,8 +1027,7 @@ class FreqaiPrimer(IStrategy):
current_profit = float(kwargs.get('current_profit', 0.0))
# 获取出场一字基础阈值
base_threshold = self.ml_exit_signal_threshold.value
base_threshold = self.get_ml_threshold_by_market_state(market_state, 'exit')
# 计算持仓时长(分钟)
try:
trade_age_minutes = max(0.0, (current_time - trade.open_date_utc).total_seconds() / 60.0)

View File

@ -201,7 +201,6 @@ docker-compose run --rm freqtrade backtesting $PAIRS_FLAG \
--logfile /freqtrade/user_data/logs/freqtrade.log \
--freqaimodel LightGBMRegressorMultiTarget \
--config /freqtrade/config_examples/$CONFIG_FILE \
--config /freqtrade/config_examples/live.json \
--config /freqtrade/templates/freqaiprimer.json \
--strategy-path /freqtrade/templates \
--enable-protections \