freqai同时优化回归和分类参数

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-17 02:18:14 +08:00
parent e78283eda6
commit d96776c47d

View File

@ -125,8 +125,8 @@ class FreqaiPrimer(IStrategy):
}
freqai_info = {
"identifier": "test58",
"model": "LightGBMRegressor",
"identifier": "freqai_primer_mixed",
"model": "LightGBMRegressor", # 默认回归模型
"feature_parameters": {
"include_timeframes": ["3m", "15m", "1h"],
"label_period_candles": 12,
@ -137,10 +137,27 @@ class FreqaiPrimer(IStrategy):
"shuffle": False,
},
"model_training_parameters": {
"n_estimators": 200,
"learning_rate": 0.05,
"num_leaves": 31,
"verbose": -1,
"price_value_divergence": { # 回归模型配置
"model": "LightGBMRegressor",
"model_params": {
"n_estimators": 200,
"learning_rate": 0.05,
"num_leaves": 31,
"verbose": -1,
}
},
"optimal_first_length": { # 分类模型配置
"model": "LightGBMClassifier",
"model_params": {
"n_estimators": 150,
"learning_rate": 0.1,
"num_leaves": 15,
"max_depth": 8,
"min_child_samples": 10,
"class_weight": "balanced",
"verbose": -1,
}
}
},
"fit_live_predictions_candles": 100,
"live_retrain_candles": 100,
@ -227,7 +244,29 @@ class FreqaiPrimer(IStrategy):
dataframe["volume_z_score"] = dataframe["volume_z_score"].replace([np.inf, -np.inf], 0).ffill().fillna(0)
dataframe["&-price_value_divergence"] = dataframe["&-price_value_divergence"].replace([np.inf, -np.inf], 0).ffill().fillna(0)
# 新增:分类模型优化 first_length
# 基于市场状态预测最优的 first_length 分类2, 4, 6, 8, 10
# 使用技术指标和市场波动率作为特征
atr = ta.ATR(dataframe, timeperiod=14)
volatility_ratio = atr / dataframe['close']
# 定义市场状态特征
trend_strength = abs(dataframe['close'] - dataframe['ema200']) / dataframe['ema200']
volume_anomaly = abs(dataframe['volume_z_score']) > 2
# 基于市场状态确定最优 first_length 类别
# 0: 激进(2) 1: 中性(4) 2: 稳健(6) 3: 保守(8) 4: 极保守(10)
conditions = [
(volatility_ratio > 0.02) & (trend_strength > 0.05), # 高波动+强趋势 -> 激进
(volatility_ratio > 0.015) & (trend_strength > 0.03), # 中高波动+中强趋势 -> 中性
(volatility_ratio > 0.01) | (volume_anomaly), # 中等波动或成交量异常 -> 稳健
(volatility_ratio < 0.008) & (trend_strength < 0.02), # 低波动+弱趋势 -> 保守
]
choices = [0, 1, 2, 3]
dataframe["&*-optimal_first_length"] = np.select(conditions, choices, default=4)
return dataframe
def is_stochrsi_overbought(self, dataframe: DataFrame, period=10, threshold=85) -> bool:
"""
@ -1292,21 +1331,28 @@ class FreqaiPrimer(IStrategy):
def detect_trend_status(self, dataframe: DataFrame, metadata: dict) -> str:
"""
基于加权分段的trend_score判断趋势状态
基于分类模型优化 first_length 的趋势检测
规则
- 将最近N个trend_score分为3段first, second, third
- 长度比例为first:second:third = 1:3:5
- 例如2,6,10固定使用段长2
- 权重first(权重10)second(权重7)third(权重3)
- 使用静态段长first段长度固定为2
- 使用 LightGBMClassifier 预测最优 first_length 类别
- 类别映射0:激进(2), 1:中性(4), 2:稳健(6), 3:保守(8), 4:极保守(10)
- 根据预测的类别动态调整段长而非固定使用2
"""
pair = metadata.get('pair', 'Unknown')
try:
# 直接使用静态值2作为第一段长度
first_length = 2
# 使用分类模型预测最优 first_length
if "&*-optimal_first_length" in dataframe.columns:
# 获取最新预测值
optimal_length_class = int(dataframe["&*-optimal_first_length"].iloc[-1])
length_mapping = {0: 2, 1: 4, 2: 6, 3: 8, 4: 10}
first_length = length_mapping.get(optimal_length_class, 2)
logger.info(f"[{pair}] 使用分类模型优化 first_length: {first_length} (类别: {optimal_length_class})")
else:
# 回退到默认值
first_length = 2
logger.warning(f"[{pair}] 分类模型未预测,使用默认 first_length: {first_length}")
# 根据比例计算第二段和第三段长度
# 根据 first_length 动态调整其他段长
second_length = first_length * 3
third_length = first_length * 5