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

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-17 02:51:07 +08:00
parent e3d26a9bd2
commit a9363f215f

View File

@ -435,9 +435,22 @@ class FreqaiPrimer(IStrategy):
else:
logger.info(f"[{pair}] 调用 FreqAI 预测,类型:{type(self.freqai)}")
dataframe = self.freqai.start(dataframe, metadata, self)
# 检查 FreqAI 生成的列
freqai_columns = [col for col in dataframe.columns if col.startswith('&') or col.startswith('&*')]
logger.info(f"[{pair}] FreqAI 生成的列: {freqai_columns}")
if "&-price_value_divergence" not in dataframe.columns:
logger.warning(f"[{pair}] FreqAI 未生成 &-price_value_divergence回退到规则计算")
dataframe["&-price_value_divergence"] = dataframe["price_value_divergence"]
# 检查分类模型列
if "&*-optimal_first_length" not in dataframe.columns:
logger.warning(f"[{pair}] ⚠️ FreqAI 未生成 &*-optimal_first_length将使用默认值")
# 创建默认分类值
dataframe["&*-optimal_first_length"] = 2.0
else:
logger.info(f"[{pair}] ✅ FreqAI 生成了 &*-optimal_first_length统计: {dataframe['&*-optimal_first_length'].value_counts().to_dict()}")
# 计算 labels_mean 和 labels_std
labels_mean = None
@ -485,8 +498,16 @@ class FreqaiPrimer(IStrategy):
dataframe["optimal_first_length_pred"] = dataframe["&*-optimal_first_length"]
logger.info(f"[{pair}] ✅ 找到并复制分类模型预测列: &*-optimal_first_length -> optimal_first_length_pred")
logger.info(f"[{pair}] 分类预测值统计: {dataframe['&*-optimal_first_length'].value_counts().to_dict()}")
# 确保列存在
if "optimal_first_length_pred" in dataframe.columns:
logger.info(f"[{pair}] ✅ optimal_first_length_pred 列已创建最后5个值: {dataframe['optimal_first_length_pred'].tail().tolist()}")
else:
logger.error(f"[{pair}] ❌ optimal_first_length_pred 列创建失败")
else:
logger.warning(f"[{pair}] 未找到分类模型预测列 &*-optimal_first_length")
# 创建默认列
dataframe["optimal_first_length_pred"] = 2.0
logger.info(f"[{pair}] 创建默认 optimal_first_length_pred 列,值=2.0")
self.buy_threshold = labels_mean - k_buy * labels_std
self.sell_threshold = labels_mean + k_sell * labels_std
@ -1353,8 +1374,17 @@ class FreqaiPrimer(IStrategy):
"""
pair = metadata.get('pair', 'Unknown')
# 检查数据完整性
if len(dataframe) == 0:
logger.warning(f"[{pair}] ⚠️ 数据为空,返回震荡趋势")
return "ranging"
try:
# 使用分类模型预测最优 first_length
# 检查所有可能的分类列
classification_cols = [col for col in dataframe.columns if "optimal_first_length" in str(col)]
logger.info(f"[{pair}] 📊 检测到分类相关列: {classification_cols}")
if "optimal_first_length_pred" in dataframe.columns:
predicted_value = dataframe["optimal_first_length_pred"].iloc[-1]
if pd.notna(predicted_value):
@ -1362,10 +1392,10 @@ class FreqaiPrimer(IStrategy):
optimal_length_class = int(round(float(predicted_value)))
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} (原始值: {predicted_value}, 类别: {optimal_length_class})")
logger.info(f"[{pair}] ✅ 使用 optimal_first_length_pred: first_length={first_length} (原始值: {predicted_value}, 类别: {optimal_length_class})")
else:
first_length = 2
logger.warning(f"[{pair}] ⚠️ 分类模型预测值为NaN使用默认值: {first_length}")
logger.warning(f"[{pair}] ⚠️ optimal_first_length_pred 为NaN使用默认值: {first_length}")
elif "&*-optimal_first_length" in dataframe.columns:
# 直接检查原始列
predicted_value = dataframe["&*-optimal_first_length"].iloc[-1]
@ -1373,13 +1403,15 @@ class FreqaiPrimer(IStrategy):
optimal_length_class = int(round(float(predicted_value)))
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} (原始值: {predicted_value}, 类别: {optimal_length_class})")
logger.info(f"[{pair}] ✅ 使用 &*-optimal_first_length: first_length={first_length} (原始值: {predicted_value}, 类别: {optimal_length_class})")
else:
first_length = 2
logger.warning(f"[{pair}] ⚠️ 原始分类列值为NaN使用默认值: {first_length}")
logger.warning(f"[{pair}] ⚠️ &*-optimal_first_length 为NaN使用默认值: {first_length}")
else:
first_length = 2
logger.warning(f"[{pair}] ⚠️ 未找到任何分类模型列,使用默认值: {first_length}")
# 调试:显示所有列名
logger.debug(f"[{pair}] 可用列: {list(dataframe.columns)[:10]}...")
# 根据 first_length 动态调整其他段长
second_length = first_length * 3