freqai同时优化回归和分类参数
This commit is contained in:
parent
a9363f215f
commit
42ecd2bbcd
@ -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": {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user