这个的hyperopt结果胜率高,盈利高,美中不足就是持仓时间太长,平均8天,适合大量资金进出时使用

This commit is contained in:
zhangkun9038@dingtalk.com 2025-09-10 23:52:31 +00:00
parent 7e68e4e31d
commit dcb91f3bed
3 changed files with 59 additions and 85 deletions

View File

@ -16,33 +16,33 @@
}, },
"buy": { "buy": {
"stake_divisor": 2, "stake_divisor": 2,
"add_position_callback": 0.056, "add_position_callback": 0.04,
"bb_length": 22, "bb_length": 28,
"bb_lower_deviation": 1.03, "bb_lower_deviation": 1.03,
"bb_std": 2.1, "bb_std": 3.0,
"bb_width_threshold": 0.01, "bb_width_threshold": 0.01,
"h1_max_candles": 223, "h1_max_candles": 218,
"h1_max_consecutive_candles": 4, "h1_max_consecutive_candles": 3,
"h1_rapid_rise_threshold": 0.061, "h1_rapid_rise_threshold": 0.063,
"max_entry_adjustments": 5, "max_entry_adjustments": 2,
"min_condition_count": 2, "min_condition_count": 2,
"rsi_bull_threshold": 53, "rsi_bull_threshold": 48,
"rsi_length": 10, "rsi_length": 11,
"rsi_oversold": 49, "rsi_oversold": 44,
"stochrsi_bull_threshold": 40, "stochrsi_bull_threshold": 32,
"stochrsi_neutral_threshold": 20, "stochrsi_neutral_threshold": 29,
"volume_multiplier": 1.4 "volume_multiplier": 1.6
}, },
"sell": { "sell": {
"exit_bb_upper_deviation": 0.98, "exit_bb_upper_deviation": 0.98,
"exit_volume_multiplier": 1.9, "exit_volume_multiplier": 2.0,
"roi_param_a": 0.06, "roi_param_a": 0.062,
"roi_param_c": 0.0057, "roi_param_k": 0.0054,
"roi_param_k": 0.0088, "roi_param_t0": 0.0082,
"rsi_overbought": 66 "rsi_overbought": 53
}, },
"protection": {} "protection": {}
}, },
"ft_stratparam_v": 1, "ft_stratparam_v": 1,
"export_time": "2025-09-10 13:07:34.606541+00:00" "export_time": "2025-09-10 20:55:14.197341+00:00"
} }

View File

@ -109,7 +109,7 @@ class FreqaiPrimer(IStrategy):
# 动态ROI参数 - 指数衰减函数参数 (ROI(t) = a·e^(-k·t) + c) # 动态ROI参数 - 指数衰减函数参数 (ROI(t) = a·e^(-k·t) + c)
roi_param_a = DecimalParameter(0.01, 0.1, decimals=3, default=0.05, optimize=True, load=True, space='sell') # 初始ROI水平 roi_param_a = DecimalParameter(0.01, 0.1, decimals=3, default=0.05, optimize=True, load=True, space='sell') # 初始ROI水平
roi_param_k = DecimalParameter(0.001, 0.01, decimals=4, default=0.003, optimize=True, load=True, space='sell') # 衰减速率 roi_param_k = DecimalParameter(0.001, 0.01, decimals=4, default=0.003, optimize=True, load=True, space='sell') # 衰减速率
roi_param_c = DecimalParameter(0, 0.01, decimals=4, default=0.005, optimize=True, load=True, space='sell') # 最低ROI水平 roi_param_t0 = DecimalParameter(0, 0.01, decimals=4, default=0.005, optimize=True, load=True, space='sell') # 最低ROI水平
# 出场条件阈值参数 # 出场条件阈值参数
exit_bb_upper_deviation = DecimalParameter(0.98, 1.02, decimals=2, default=1.0, optimize=True, load=True, space='sell') exit_bb_upper_deviation = DecimalParameter(0.98, 1.02, decimals=2, default=1.0, optimize=True, load=True, space='sell')
exit_volume_multiplier = DecimalParameter(1.5, 3.0, decimals=1, default=2.0, optimize=True, load=True, space='sell') exit_volume_multiplier = DecimalParameter(1.5, 3.0, decimals=1, default=2.0, optimize=True, load=True, space='sell')
@ -548,78 +548,52 @@ class FreqaiPrimer(IStrategy):
return -1.2 * atr / current_rate # 基础1.2倍ATR止损 return -1.2 * atr / current_rate # 基础1.2倍ATR止损
return self.stoploss return self.stoploss
def custom_exit(self, pair: str, trade: 'Trade', current_time, current_rate: float, def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_rate: float,
current_profit: float, **kwargs) -> float: current_profit: float, **kwargs) -> float:
"""
结合指数衰减ROI逻辑的动态止盈函数
- 根据交易持仓时间使用指数衰减公式计算动态止盈阈值
- 考虑当前市场状态调整止盈策略
- 仅支持多头交易
"""
# 只支持多头
if trade.is_short: if trade.is_short:
return 0.0 return 0.0
# 计算交易已持仓时间(分钟)
trade_age_minutes = (current_time - trade.open_date_utc).total_seconds() / 60 trade_age_minutes = (current_time - trade.open_date_utc).total_seconds() / 60
# 防止负数时间
if trade_age_minutes < 0: if trade_age_minutes < 0:
trade_age_minutes = 0 trade_age_minutes = 0
# 获取Hyperopt优化的指数衰减参数值
a = self.roi_param_a.value a = self.roi_param_a.value
k = self.roi_param_k.value k = self.roi_param_k.value
c = self.roi_param_c.value t0 = self.roi_param_t0.value
# 应用指数衰减公式计算动态ROI阈值 dynamic_roi_threshold = -a * math.atan(k * (trade_age_minutes - t0))
dynamic_roi_threshold = a * math.exp(-k * trade_age_minutes) + c if dynamic_roi_threshold < 0:
dynamic_roi_threshold = 0.0
# 确保ROI阈值为正数
dynamic_roi_threshold = max(dynamic_roi_threshold, 0.0) dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
current_state = dataframe['market_state'].iloc[-1] if 'market_state' in dataframe.columns else (
# 获取当前市场状态以调整止盈策略 'strong_bull' if dataframe['sma'].diff().iloc[-1] > 0.01 else 'weak_bull' if dataframe['sma'].diff().iloc[-1] > 0 else 'neutral'
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) )
current_state = dataframe['market_state'].iloc[-1] if 'market_state' in dataframe.columns else 'unknown'
entry_tag = trade.enter_tag if hasattr(trade, 'enter_tag') else None
# 根据市场状态调整退出比例计算 profit_ratio = current_profit / dynamic_roi_threshold if dynamic_roi_threshold > 0 else 0
exit_ratio = 0.0
exit_ratio = 0.0
# 计算当前利润与动态ROI阈值的比值 if profit_ratio >= 1.0:
if dynamic_roi_threshold > 0: if current_state == 'strong_bull':
profit_ratio = current_profit / dynamic_roi_threshold exit_ratio = 0.5 if profit_ratio < 1.5 else 0.8
else: elif current_state == 'weak_bull':
profit_ratio = 0 exit_ratio = 0.6 if profit_ratio < 1.2 else 0.9
else:
# 根据市场状态和利润比值确定退出比例 exit_ratio = 1.0
if profit_ratio >= 1.0: if entry_tag == 'strong_trend':
# 利润达到或超过动态ROI阈值 exit_ratio *= 0.8
if current_state == 'strong_bull':
# 强劲牛市中,允许部分利润奔跑 if dynamic_roi_threshold < 0:
if profit_ratio < 1.5: exit_ratio = 1.0
exit_ratio = 0.5 # 达到ROI阈值时只退出50%
else: logger.info(f"[{pair}] 动态止盈: 持仓时间={trade_age_minutes:.1f}分钟, 当前利润={current_profit:.2%}, "
exit_ratio = 0.8 # 利润显著高于阈值时退出80% f"动态ROI阈值={dynamic_roi_threshold:.4f}, 利润比值={profit_ratio:.2f}, "
elif current_state == 'weak_bull': f"市场状态={current_state}, entry_tag={entry_tag}, 退出比例={exit_ratio:.0%}")
# 弱牛市中,平衡利润和风险
if profit_ratio < 1.2: return exit_ratio
exit_ratio = 0.6 # 达到ROI阈值时退出60%
else:
exit_ratio = 0.9 # 利润高于阈值时退出90%
else:
# 其他市场状态下,更保守的策略
exit_ratio = 1.0 # 达到ROI阈值时全部退出
# 记录动态止盈决策
#logger.info(f"[{pair}] 动态止盈: 持仓时间={trade_age_minutes:.1f}分钟, 当前利润={current_profit:.2%}, \
# 动态ROI阈值={dynamic_roi_threshold:.4f}, 利润比值={profit_ratio:.2f}, \
# 市场状态={current_state}, 退出比例={exit_ratio:.0%}")
# 返回应退出的比例0.0表示不退出1.0表示全部退出)
return exit_ratio
def adjust_trade_position(self, trade: 'Trade', current_time, current_rate: float, def adjust_trade_position(self, trade: 'Trade', current_time, current_rate: float,
current_profit: float, min_stake: float, max_stake: float, **kwargs) -> float: current_profit: float, min_stake: float, max_stake: float, **kwargs) -> float:
""" """

View File

@ -243,8 +243,8 @@ docker-compose run --rm freqtrade hyperopt $PAIRS_FLAG \
--enable-protections \ --enable-protections \
--strategy-path /freqtrade/templates \ --strategy-path /freqtrade/templates \
--timerange ${START_DATE}-${END_DATE} \ --timerange ${START_DATE}-${END_DATE} \
-e 200 \ -e 400 \
-j 3 \ -j 4 \
--hyperopt-loss SharpeHyperOptLossDaily \ --hyperopt-loss SharpeHyperOptLossDaily \
--spaces buy sell \ --spaces buy sell \
--fee 0.0016 --fee 0.0016