加入risk_rate freqai属性

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-19 02:45:04 +08:00
parent 189add64f9
commit 4c5f444693

View File

@ -130,7 +130,7 @@ class FreqaiPrimer(IStrategy):
}
freqai_info = {
"identifier": "freqai_primer_mixed_v4", # 更新标识符以强制重新训练
"identifier": "freqai_primer_mixed_v5", # 更新标识符以强制重新训练
"model": "LightGBMRegressor", # 默认回归模型
"feature_parameters": {
"include_timeframes": ["3m", "15m", "1h"], # 3个时间框架
@ -165,6 +165,18 @@ class FreqaiPrimer(IStrategy):
"verbose": -1,
}
},
"risk_rating": { # 新增:智能风险评级预测
"model": "LightGBMClassifier",
"model_params": {
"n_estimators": 160,
"learning_rate": 0.08,
"num_leaves": 20,
"max_depth": 6,
"min_child_samples": 8,
"class_weight": "balanced",
"verbose": -1,
}
},
},
"fit_live_predictions_candles": 100,
"live_retrain_candles": 100,
@ -227,11 +239,21 @@ class FreqaiPrimer(IStrategy):
dataframe["ema200"] = ta.EMA(dataframe, timeperiod=200)
dataframe["%-price_value_divergence"] = (dataframe["close"] - dataframe["ema200"]) / dataframe["ema200"]
# 新增:风险评级相关特征
dataframe["%-atr-period"] = ta.ATR(dataframe, timeperiod=period)
dataframe["%-volatility_ratio"] = dataframe["%-atr-period"] / dataframe["close"]
dataframe["%-price_range"] = (dataframe["high"] - dataframe["low"]) / dataframe["close"]
dataframe["%-volume_volatility"] = dataframe["volume"].pct_change().rolling(period).std()
dataframe["%-price_velocity"] = dataframe["close"].pct_change().abs().rolling(period).mean()
dataframe["%-rsi_velocity"] = dataframe["%-rsi-period"].diff().abs().rolling(3).mean()
columns_to_clean = [
"%-rsi-period", "%-mfi-period", "%-sma-period", "%-ema-period", "%-adx-period",
"bb_lowerband-period", "bb_middleband-period", "bb_upperband-period",
"%-bb_width-period", "%-relative_volume-period", "%-price_value_divergence"
"%-bb_width-period", "%-relative_volume-period", "%-price_value_divergence",
"%-atr-period", "%-volatility_ratio", "%-price_range", "%-volume_volatility",
"%-price_velocity", "%-rsi_velocity"
]
for col in columns_to_clean:
dataframe[col] = dataframe[col].replace([np.inf, -np.inf], 0).ffill().fillna(0)
@ -263,6 +285,46 @@ class FreqaiPrimer(IStrategy):
logger.warning(f"[{pair}] price_value_divergence包含非有限值进行清理")
dataframe["&-price_value_divergence"] = dataframe["&-price_value_divergence"].replace([np.inf, -np.inf, np.nan], 0.0)
# 新增:智能风险评级分类目标
# 基于未来波动率、成交量异常、价格动量等多维度评估风险等级
# 0: 低风险(绿色) 1: 中低风险(蓝色) 2: 中等风险(黄色) 3: 中高风险(橙色) 4: 高风险(红色)
# 计算未来波动率作为风险指标
future_atr = ta.ATR(dataframe, timeperiod=14).shift(-6)
future_volatility = (future_atr / dataframe['close']).replace([np.inf, -np.inf], 0)
# 成交量异常检测
volume_zscore = (dataframe['volume'] - dataframe['volume'].rolling(20).mean()) / dataframe['volume'].rolling(20).std()
volume_anomaly = abs(volume_zscore) > 2
# 价格动量强度
price_momentum = abs(dataframe['close'].pct_change(5)).rolling(3).mean()
# 综合风险评分
risk_score = (
future_volatility * 0.4 + # 未来波动率权重40%
(abs(volume_zscore) / 5) * 0.3 + # 成交量异常权重30%
price_momentum * 0.3 # 价格动量权重30%
)
# 风险等级分类
risk_conditions = [
risk_score < 0.01, # 低风险
risk_score < 0.02, # 中低风险
risk_score < 0.035, # 中等风险
risk_score < 0.05, # 中高风险
]
risk_choices = [0, 1, 2, 3]
dataframe["&*-risk_rating"] = np.select(risk_conditions, risk_choices, default=4).astype(np.int32)
# 清理风险评级值
if not np.isfinite(dataframe["&*-risk_rating"]).all():
logger.warning(f"[{pair}] risk_rating包含非有限值进行清理")
dataframe["&*-risk_rating"] = dataframe["&*-risk_rating"].replace([np.inf, -np.inf, np.nan], 2).astype(np.int32)
logger.info(f"[{pair}] 风险评级分布: {dict(pd.Series(dataframe['&*-risk_rating']).value_counts())}")
# 新增:分类模型优化 first_length
# 基于市场状态预测最优的 first_length 分类2, 4, 6, 8, 10
# 使用技术指标和市场波动率作为特征
@ -583,6 +645,32 @@ class FreqaiPrimer(IStrategy):
self.sell_threshold = max(self.sell_threshold, self.SELL_THRESHOLD_MIN)
# 调试日志
# 处理风险评级预测
if "&*-risk_rating" in dataframe.columns:
risk_rating = dataframe["&*-risk_rating"].iloc[-1] if len(dataframe) > 0 else 2
# 基于风险评级调整仓位和止损
risk_multipliers = {
0: {"position": 1.5, "stoploss": 0.8, "label": "🟢低风险"}, # 低风险:加大仓位,收紧止损
1: {"position": 1.2, "stoploss": 0.9, "label": "🔵中低风险"}, # 中低风险:适中仓位
2: {"position": 1.0, "stoploss": 1.0, "label": "🟡中等风险"}, # 中等风险:标准参数
3: {"position": 0.7, "stoploss": 1.2, "label": "🟠中高风险"}, # 中高风险:减小仓位,放宽止损
4: {"position": 0.5, "stoploss": 1.5, "label": "🔴高风险"}, # 高风险:最小仓位,最宽止损
}
risk_config = risk_multipliers.get(risk_rating, risk_multipliers[2])
# 应用到策略参数
self.risk_position_multiplier = risk_config["position"]
self.risk_stoploss_multiplier = risk_config["stoploss"]
logger.info(f"[{pair}] {risk_config['label']} - 仓位倍数: {self.risk_position_multiplier}, "
f"止损倍数: {self.risk_stoploss_multiplier}")
else:
# 默认值
self.risk_position_multiplier = 1.0
self.risk_stoploss_multiplier = 1.0
logger.info(f"[{pair}] 市场趋势得分:{market_trend_score}, labels_mean{labels_mean:.4f}, labels_std{labels_std:.4f}")
logger.info(f"[{pair}] k_buy{k_buy:.2f}, k_sell{k_sell:.2f}")
logger.info(f"[{pair}] 动态买入阈值:{self.buy_threshold:.4f}, 卖出阈值:{self.sell_threshold:.4f}")
@ -591,9 +679,7 @@ class FreqaiPrimer(IStrategy):
f"&-price_value_divergence: {dataframe['&-price_value_divergence'].iloc[-1]:.6f}, "
f"volume_z_score: {dataframe['volume_z_score'].iloc[-1]:.2f}, "
f"bb_lowerband: {dataframe['bb_lowerband'].iloc[-1]:.6f}, "
f"close_1h: {dataframe['close_1h'].iloc[-1] if 'close_1h' in dataframe else 'N/A'}, "
f"stochrsi_k_1h: {dataframe['stochrsi_k_1h'].iloc[-1] if 'stochrsi_k_1h' in dataframe else 'N/A'}, "
f"volume_z_score_1h: {dataframe['volume_z_score_1h'].iloc[-1] if 'volume_z_score_1h' in dataframe else 'N/A'}")
f"risk_rating: {dataframe['&*-risk_rating'].iloc[-1] if '&*-risk_rating' in dataframe else 'N/A'}")
if not self.stats_logged:
logger.info("===== 所有币对的 labels_mean 和 labels_std 汇总 =====")
@ -642,6 +728,22 @@ class FreqaiPrimer(IStrategy):
open_trades = len(self.active_trades) if hasattr(self, 'active_trades') else 0
is_green_channel = (trend_status == "bullish" and open_trades <= 2 and self.GREEN_CHANNEL_ENABLED)
# 获取风险评级并调整入场条件
risk_rating = dataframe["&*-risk_rating"].iloc[-1] if "&*-risk_rating" in dataframe.columns else 2
# 风险评级影响入场严格程度
risk_adjustments = {
0: {"threshold_mult": 1.5, "strict_mult": 0.7}, # 低风险:更宽松入场
1: {"threshold_mult": 1.2, "strict_mult": 0.8}, # 中低风险:较宽松
2: {"threshold_mult": 1.0, "strict_mult": 1.0}, # 中等风险:标准
3: {"threshold_mult": 0.8, "strict_mult": 1.2}, # 中高风险:更严格
4: {"threshold_mult": 0.6, "strict_mult": 1.5}, # 高风险:最严格
}
risk_adj = risk_adjustments.get(risk_rating, risk_adjustments[2])
logger.info(f"[{pair}] 风险评级: {risk_rating}, 阈值调整: {risk_adj['threshold_mult']}, 严格度调整: {risk_adj['strict_mult']}")
if is_green_channel:
# 🟢 牛市绿色通道持仓≤2个25USDT入场5条件需要满足4个
cond1 = (dataframe["&-price_value_divergence"] < self.buy_threshold * 1.8) # 超宽松偏离度