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

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-17 03:08:29 +08:00
parent a9363f215f
commit 42ecd2bbcd
3 changed files with 74 additions and 31 deletions

View File

@ -88,7 +88,7 @@
"include_timeframes": [
"3m",
"15m",
"1h",
"1h"
],
"include_corr_pairlist": [
"BTC/USDT",
@ -106,7 +106,6 @@
20,
50
],
"outlier_protection_percentage": 0.15,
"plot_feature_importances": 10
},
"data_split_parameters": {
@ -114,15 +113,32 @@
"shuffle": false
},
"model_training_parameters": {
"n_estimators": 400,
"learning_rate": 0.03,
"num_leaves": 40,
"max_depth": 10,
"min_data_in_leaf": 20,
"feature_fraction": 0.8,
"bagging_fraction": 0.8,
"bagging_freq": 5,
"verbose": -1
"price_value_divergence": {
"model": "LightGBMRegressor",
"model_params": {
"n_estimators": 400,
"learning_rate": 0.03,
"num_leaves": 40,
"max_depth": 10,
"min_data_in_leaf": 20,
"feature_fraction": 0.8,
"bagging_fraction": 0.8,
"bagging_freq": 5,
"verbose": -1
}
},
"optimal_first_length": {
"model": "LightGBMClassifier",
"model_params": {
"n_estimators": 150,
"learning_rate": 0.1,
"num_leaves": 15,
"max_depth": 8,
"min_data_in_leaf": 10,
"class_weight": "balanced",
"verbose": -1
}
}
}
},
"api_server": {

View File

@ -428,29 +428,55 @@ class FreqaiPrimer(IStrategy):
if col in dataframe.columns:
dataframe[col] = dataframe[col].replace([np.inf, -np.inf], 0).ffill().fillna(0)
# 调用 FreqAI 预测
# 调用 FreqAI 预测 - 分别处理回归和分类模型
if not hasattr(self, 'freqai') or self.freqai is None:
logger.error(f"[{pair}] FreqAI 未初始化,回退到规则计算")
dataframe["&-price_value_divergence"] = dataframe["price_value_divergence"]
dataframe["&*-optimal_first_length"] = 2.0 # 默认分类值
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}")
# 先处理回归模型
original_targets = list(self.freqai_info.get("model_training_parameters", {}).keys())
logger.info(f"[{pair}] 原始目标列: {original_targets}")
if "&-price_value_divergence" not in dataframe.columns:
logger.warning(f"[{pair}] FreqAI 未生成 &-price_value_divergence回退到规则计算")
try:
# 只保留回归目标进行预测
dataframe = self.freqai.start(dataframe, metadata, self)
# 检查 FreqAI 生成的列
freqai_columns = [col for col in dataframe.columns if 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"]
except Exception as e:
logger.error(f"[{pair}] FreqAI 预测失败: {e}")
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
# 使用规则计算分类值
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
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]
optimal_length_class = np.select(conditions, choices, default=4)
dataframe["&*-optimal_first_length"] = optimal_length_class.astype(float)
logger.info(f"[{pair}] ✅ 使用规则计算分类值: {dict(pd.Series(optimal_length_class).value_counts())}")
else:
logger.info(f"[{pair}] ✅ FreqAI 生成了 &*-optimal_first_length统计: {dataframe['&*-optimal_first_length'].value_counts().to_dict()}")
logger.info(f"[{pair}] ✅ FreqAI 生成了 &*-optimal_first_length: {dataframe['&*-optimal_first_length'].value_counts().to_dict()}")
# 计算 labels_mean 和 labels_std
labels_mean = None

View File

@ -1,22 +1,23 @@
#!/bin/bash
# 测试混合模型策略的启动脚本
# 确保使用新的配置文件和模型名称
# 设置工作目录
export WORK_DIR="/Users/zhangkun/myTestFreqAI"
cd "$WORK_DIR"
echo "🚀 启动混合模型策略测试..."
echo "📊 使用模型: freqai_primer_mixed"
echo "📁 配置文件: test_mixed_models_config.json"
echo "📁 配置文件: user_data/config.json"
# 清理旧模型和缓存
echo "🧹 清理旧模型和缓存..."
rm -rf /Users/zhangkun/myTestFreqAI/user_data/models/test58/
rm -rf /Users/zhangkun/myTestFreqAI/user_data/models/test_mixed_models/
rm -rf /Users/zhangkun/myTestFreqAI/user_data/models/freqai_primer_mixed
rm -rf /Users/zhangkun/myTestFreqAI/user_data/data/test_mixed_models
rm -rf user_data/models/test58/
rm -rf user_data/models/test_mixed_models/
rm -rf user_data/models/freqai_primer_mixed
rm -rf user_data/data/test_mixed_models
# 启动策略
python -m freqtrade trade \
--config /Users/zhangkun/myTestFreqAI/test_mixed_models_config.json \
--config user_data/config.json \
--strategy freqaiprimer \
--log-level INFO \
--freqai-enabled \