退出条件阈值用hyperopt优化

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-15 13:25:54 +08:00
parent 70d0395513
commit 497ff38133
2 changed files with 79 additions and 22 deletions

1
.gitignore vendored
View File

@ -128,3 +128,4 @@ data/
tools/.env
output.log
result/
user_data.tar.gz

View File

@ -48,6 +48,37 @@ class FreqaiPrimer(IStrategy):
# Hyperopt 可优化参数
trend_final_bullish_threshold = IntParameter(40, 90, default=55, space="buy", optimize=True, load=True)
trend_final_bearish_threshold = IntParameter(10, 40, default=13, space="buy", optimize=True, load=True)
# 出场策略相关参数
exit_divergence_multiplier = DecimalParameter(1.0, 1.3, default=1.06, space="sell", optimize=True, load=True)
exit_adx_threshold = IntParameter(15, 35, default=20, space="sell", optimize=True, load=True)
exit_rsi_threshold = IntParameter(55, 75, default=65, space="sell", optimize=True, load=True)
exit_stochrsi_threshold = IntParameter(60, 80, default=70, space="sell", optimize=True, load=True)
exit_adx_threshold_overbought = IntParameter(20, 35, default=25, space="sell", optimize=True, load=True)
exit_min_profit_threshold = DecimalParameter(0.005, 0.05, default=0.02, space="sell", optimize=True, load=True)
exit_rapid_rise_bull = DecimalParameter(1.5, 4.0, default=2.0, space="sell", optimize=True, load=True)
exit_rapid_rise_bear = DecimalParameter(2.5, 5.0, default=3.5, space="sell", optimize=True, load=True)
exit_stochrsi_rapid = IntParameter(65, 85, default=70, space="sell", optimize=True, load=True)
exit_volume_threshold = DecimalParameter(0.5, 2.0, default=1.0, space="sell", optimize=True, load=True)
# 趋势状态相关出场参数
exit_bullish_trend_score_max = IntParameter(90, 98, default=95, space="sell", optimize=True, load=True)
exit_bullish_divergence_mult = DecimalParameter(1.1, 1.3, default=1.15, space="sell", optimize=True, load=True)
exit_bullish_rsi = IntParameter(70, 85, default=75, space="sell", optimize=True, load=True)
exit_bullish_stochrsi = IntParameter(80, 90, default=85, space="sell", optimize=True, load=True)
exit_bullish_adx = IntParameter(25, 40, default=30, space="sell", optimize=True, load=True)
exit_bullish_return = DecimalParameter(3.0, 7.0, default=5.0, space="sell", optimize=True, load=True)
exit_bullish_stochrsi_rapid = IntParameter(80, 90, default=85, space="sell", optimize=True, load=True)
exit_bearish_divergence_mult = DecimalParameter(0.8, 1.0, default=0.9, space="sell", optimize=True, load=True)
exit_bearish_rsi = IntParameter(55, 65, default=60, space="sell", optimize=True, load=True)
exit_bearish_stochrsi = IntParameter(65, 75, default=70, space="sell", optimize=True, load=True)
exit_bearish_adx = IntParameter(15, 25, default=20, space="sell", optimize=True, load=True)
exit_bearish_return = DecimalParameter(1.0, 3.0, default=1.5, space="sell", optimize=True, load=True)
exit_bearish_stochrsi_rapid = IntParameter(70, 85, default=75, space="sell", optimize=True, load=True)
exit_ranging_trend_score_max = IntParameter(95, 99, default=98, space="sell", optimize=True, load=True)
exit_ranging_trend_score_threshold = IntParameter(80, 90, default=85, space="sell", optimize=True, load=True)
# --- 🛠️ 固定配置参数 ---
stoploss = -0.15
@ -601,26 +632,26 @@ class FreqaiPrimer(IStrategy):
# 条件 1高阈值 &-price_value_divergence
cond1 = (
(dataframe["&-price_value_divergence"] > self.sell_threshold * 1.06) & # 提高到 1.06
(dataframe["adx"] > 20) # 趋势强度过滤
(dataframe["&-price_value_divergence"] > self.sell_threshold * self.exit_divergence_multiplier) &
(dataframe["adx"] > self.exit_adx_threshold) # 趋势强度过滤
)
# 条件 2超买信号
cond2 = (
(dataframe["rsi"] > 65) &
(dataframe["stochrsi_k"] > 70) & # StochRSI 超买
(dataframe["adx"] > 25) # 趋势强度
(dataframe["rsi"] > self.exit_rsi_threshold) &
(dataframe["stochrsi_k"] > self.exit_stochrsi_threshold) & # StochRSI 超买
(dataframe["adx"] > self.exit_adx_threshold_overbought) # 趋势强度
)
# 条件 3快速拉升退出
# 检测最近 5 根 K 线(约 15 分钟)涨幅超过 3%,且有最低 2% 利润,结合 StochRSI 超买
min_profit = 0.02 # 最低利润 2%
rapid_rise_threshold = self.linear_map(trend_score, 0, 100, 3.5, 2) # 熊市 4%,牛市 2.5%
# 检测最近 5 根 K 线(约 15 分钟)涨幅超过阈值,且有最低利润要求
min_profit = self.exit_min_profit_threshold # 最低利润要求
rapid_rise_threshold = self.linear_map(trend_score, 0, 100, self.exit_rapid_rise_bear, self.exit_rapid_rise_bull)
cond3 = (
(dataframe["short_term_return"] > rapid_rise_threshold) & # 短期快速拉升
(dataframe["close"] / dataframe["close"].shift(5) - 1 > min_profit) & # 确保最低利润
(dataframe["stochrsi_k"] > 70) & # 超买确认
(dataframe["volume_z_score"] > 1.0)
(dataframe["stochrsi_k"] > self.exit_stochrsi_rapid) & # 超买确认
(dataframe["volume_z_score"] > self.exit_volume_threshold)
)
# 检测趋势状态
@ -629,36 +660,34 @@ class FreqaiPrimer(IStrategy):
# 根据趋势状态调整出场策略
if trend_status == "bullish":
# 上涨趋势:严格出场条件,让利润奔跑
if trend_score > 95:
if trend_score > self.exit_bullish_trend_score_max:
logger.info(f"[{pair}] 🚀 强劲上涨趋势,拒绝卖出")
return dataframe
# 上涨趋势下需要更强的卖出信号
bullish_sell_threshold = 90
cond1_bullish = (dataframe["&-price_value_divergence"] > self.sell_threshold * 1.15) # 更严格的阈值
cond2_bullish = (dataframe["rsi"] > 75) & (dataframe["stochrsi_k"] > 85) & (dataframe["adx"] > 30)
cond3_bullish = (dataframe["short_term_return"] > 5.0) & (dataframe["stochrsi_k"] > 85) # 更高的涨幅要求
cond1_bullish = (dataframe["&-price_value_divergence"] > self.sell_threshold * self.exit_bullish_divergence_mult)
cond2_bullish = (dataframe["rsi"] > self.exit_bullish_rsi) & (dataframe["stochrsi_k"] > self.exit_bullish_stochrsi) & (dataframe["adx"] > self.exit_bullish_adx)
cond3_bullish = (dataframe["short_term_return"] > self.exit_bullish_return) & (dataframe["stochrsi_k"] > self.exit_bullish_stochrsi_rapid)
sell_condition = (cond1_bullish & cond2_bullish) | (cond1_bullish & cond3_bullish) | (cond2_bullish & cond3_bullish)
logger.info(f"[{pair}] 🚀 上涨趋势策略:严格出场条件")
elif trend_status == "bearish":
# 下跌趋势:宽松出场条件,快速止盈止损
cond1_bearish = (dataframe["&-price_value_divergence"] > self.sell_threshold * 0.9) # 更宽松的阈值
cond2_bearish = (dataframe["rsi"] > 60) & (dataframe["stochrsi_k"] > 70) & (dataframe["adx"] > 20)
cond3_bearish = (dataframe["short_term_return"] > 1.5) & (dataframe["stochrsi_k"] > 75) # 较低的涨幅要求
cond1_bearish = (dataframe["&-price_value_divergence"] > self.sell_threshold * self.exit_bearish_divergence_mult)
cond2_bearish = (dataframe["rsi"] > self.exit_bearish_rsi) & (dataframe["stochrsi_k"] > self.exit_bearish_stochrsi) & (dataframe["adx"] > self.exit_bearish_adx)
cond3_bearish = (dataframe["short_term_return"] > self.exit_bearish_return) & (dataframe["stochrsi_k"] > self.exit_bearish_stochrsi_rapid)
sell_condition = cond1_bearish | cond2_bearish | cond3_bearish # 任一条件即可卖出
logger.info(f"[{pair}] 📉 下跌趋势策略:宽松出场条件")
else: # ranging
# 震荡趋势:使用原策略
if trend_score > 98:
if trend_score > self.exit_ranging_trend_score_max:
logger.info(f"[{pair}] ⚖️ 震荡趋势但得分较高,拒绝卖出")
return dataframe
trend_sell_threshold = 85
if trend_score > trend_sell_threshold:
if trend_score > self.exit_ranging_trend_score_threshold:
sell_condition = (cond1 & cond2) | (cond1 & cond3) | (cond2 & cond3) # 中等趋势,至少两个条件满足
logger.info(f"[{pair}] ⚖️ 震荡趋势策略:标准出场条件")
else:
@ -702,7 +731,34 @@ class FreqaiPrimer(IStrategy):
return [
DecimalParameter(0.001, 0.02, name="sell_threshold_min"),
DecimalParameter(0.02, 0.1, name="sell_threshold_max"),
DecimalParameter(0.2, 0.7, name="exit_position_ratio", default=0.5)
DecimalParameter(0.2, 0.7, name="exit_position_ratio", default=0.5),
# 出场策略参数
DecimalParameter(1.0, 1.3, name="exit_divergence_multiplier"),
IntParameter(15, 35, name="exit_adx_threshold"),
IntParameter(55, 75, name="exit_rsi_threshold"),
IntParameter(60, 80, name="exit_stochrsi_threshold"),
IntParameter(20, 35, name="exit_adx_threshold_overbought"),
DecimalParameter(0.005, 0.05, name="exit_min_profit_threshold"),
DecimalParameter(1.5, 4.0, name="exit_rapid_rise_bull"),
DecimalParameter(2.5, 5.0, name="exit_rapid_rise_bear"),
IntParameter(65, 85, name="exit_stochrsi_rapid"),
DecimalParameter(0.5, 2.0, name="exit_volume_threshold"),
# 趋势状态相关出场参数
IntParameter(90, 98, name="exit_bullish_trend_score_max"),
DecimalParameter(1.1, 1.3, name="exit_bullish_divergence_mult"),
IntParameter(70, 85, name="exit_bullish_rsi"),
IntParameter(80, 90, name="exit_bullish_stochrsi"),
IntParameter(25, 40, name="exit_bullish_adx"),
DecimalParameter(3.0, 7.0, name="exit_bullish_return"),
IntParameter(80, 90, name="exit_bullish_stochrsi_rapid"),
IntParameter(95, 99, name="exit_ranging_trend_score_max"),
IntParameter(80, 90, name="exit_ranging_trend_score_threshold"),
DecimalParameter(0.8, 1.0, name="exit_bearish_divergence_mult"),
IntParameter(55, 65, name="exit_bearish_rsi"),
IntParameter(65, 75, name="exit_bearish_stochrsi"),
IntParameter(15, 25, name="exit_bearish_adx"),
DecimalParameter(1.0, 3.0, name="exit_bearish_return"),
IntParameter(70, 85, name="exit_bearish_stochrsi_rapid")
]
def adjust_trade_position(self, trade: Trade, current_time: datetime,