加入risk_rate freqai属性
This commit is contained in:
parent
189add64f9
commit
4c5f444693
@ -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) # 超宽松偏离度
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user