freqai config change
This commit is contained in:
parent
05dc792645
commit
526b99d185
@ -78,7 +78,10 @@
|
||||
"identifier": "test58",
|
||||
"train_period_days": 7,
|
||||
"backtest_period_days": 1,
|
||||
"live_retrain_hours": 2,
|
||||
"live_retrain_hours": 1,
|
||||
"save_backtest_models": true,
|
||||
"fit_live_predictions_candles": 1000,
|
||||
"continual_learning": false,
|
||||
"outlier_detection": {
|
||||
"method": "IsolationForest",
|
||||
"contamination": 0.1
|
||||
@ -96,13 +99,18 @@
|
||||
"BTC/USDT",
|
||||
"SOL/USDT"
|
||||
],
|
||||
"outlier_protection_percentage": 0.1,
|
||||
"outlier_protection_percentage": 0.2,
|
||||
"label_period_candles": 60,
|
||||
"include_shifted_candles": 3,
|
||||
"DI_threshold": 0.7,
|
||||
"weight_factor": 0.9,
|
||||
"principal_component_analysis": false,
|
||||
"include_shifted_candles": 5,
|
||||
"DI_threshold": 0.5,
|
||||
"weight_factor": 0.95,
|
||||
"principal_component_analysis": true,
|
||||
"noise_standard_deviation": 0.03,
|
||||
"buffer_train_data_candles": 10,
|
||||
"use_SVM_to_remove_outliers": true,
|
||||
"svm_params": {
|
||||
"nu": 0.15
|
||||
},
|
||||
"indicator_periods_candles": [
|
||||
10,
|
||||
20,
|
||||
@ -111,8 +119,9 @@
|
||||
"plot_feature_importances": 10
|
||||
},
|
||||
"data_split_parameters": {
|
||||
"test_size": 0.2,
|
||||
"shuffle": false
|
||||
"test_size": 0.25,
|
||||
"shuffle": false,
|
||||
"shuffle_after_split": true
|
||||
},
|
||||
"model_training_parameters": {
|
||||
"n_estimators": 700,
|
||||
|
||||
351
doc/freqaiConfig.md
Normal file
351
doc/freqaiConfig.md
Normal file
@ -0,0 +1,351 @@
|
||||
# FreqAI 配置优化记录
|
||||
|
||||
**变更时间**: 2025-12-29
|
||||
**配置文件**: `config_examples/freqaiprimer.json`
|
||||
**优化目标**:
|
||||
1. 提升训练结果的可信度
|
||||
2. 降低 Live 和 Backtest 结果差异
|
||||
3. 降低 Live 模式下入场条件的敏感度
|
||||
|
||||
---
|
||||
|
||||
## 📋 变更汇总
|
||||
|
||||
本次优化共调整 **13 个参数**,新增 **7 个参数**。
|
||||
|
||||
### 一级配置变更
|
||||
|
||||
| 参数名 | 原值 | 新值 | 变更类型 | 目标 |
|
||||
|--------|------|------|----------|------|
|
||||
| `live_retrain_hours` | 2 | 1 | 修改 | 目标2 |
|
||||
| `save_backtest_models` | - | `true` | 新增 | 目标2 |
|
||||
| `fit_live_predictions_candles` | - | 1000 | 新增 | 目标2 ⭐️ |
|
||||
| `continual_learning` | - | `false` | 新增 | 目标2 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 目标1:提升训练结果的可信度
|
||||
|
||||
### 1.1 数据分割参数优化
|
||||
|
||||
**路径**: `freqai.data_split_parameters`
|
||||
|
||||
| 参数 | 原值 | 新值 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `test_size` | 0.2 | **0.25** | 增加验证集比例至 25%,更准确评估泛化能力 |
|
||||
| `shuffle_after_split` | - | **true** | 分割后打乱训练集,避免时间序列过拟合 |
|
||||
|
||||
**预期效果**:
|
||||
- 验证集更大,模型评估更可靠
|
||||
- 训练集内部随机化,减少顺序依赖
|
||||
|
||||
---
|
||||
|
||||
### 1.2 特征工程优化
|
||||
|
||||
**路径**: `freqai.feature_parameters`
|
||||
|
||||
| 参数 | 原值 | 新值 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `principal_component_analysis` | false | **true** | 启用 PCA 降维,减少冗余特征 |
|
||||
| `noise_standard_deviation` | - | **0.03** | 添加 3% 标准差噪声,防止过拟合 |
|
||||
| `buffer_train_data_candles` | - | **10** | 裁剪边界 10 根 K 线,避免不完整指标 |
|
||||
|
||||
**预期效果**:
|
||||
- 特征维度降低,训练更稳定
|
||||
- 模型对噪声鲁棒性增强
|
||||
- 训练数据质量提升
|
||||
|
||||
---
|
||||
|
||||
## 🔄 目标2:降低 Live/Backtest 结果差异
|
||||
|
||||
### 2.1 实时预测统计计算 ⭐️ 关键参数
|
||||
|
||||
```json
|
||||
"fit_live_predictions_candles": 1000
|
||||
```
|
||||
|
||||
**说明**: 使用最近 1000 根 K 线的**实时预测数据**计算标签统计,而不是训练数据集。这是缩小 Live/Backtest 差异的**核心参数**。
|
||||
|
||||
**原理**:
|
||||
- Backtest: 使用历史训练数据的标签分布
|
||||
- Live: 使用实时预测结果的标签分布
|
||||
- 通过 `fit_live_predictions_candles`,两者使用相同的统计来源
|
||||
|
||||
**预期效果**:
|
||||
- Live 和 Backtest 的入场信号阈值更一致
|
||||
- 减少因数据分布差异导致的行为偏差
|
||||
|
||||
---
|
||||
|
||||
### 2.2 模型重训练策略
|
||||
|
||||
```json
|
||||
"live_retrain_hours": 1 // 从 2 小时缩短到 1 小时
|
||||
```
|
||||
|
||||
**说明**: 更频繁更新模型,快速适应市场变化。
|
||||
|
||||
**权衡**:
|
||||
- ✅ 模型更新更及时,减少滞后
|
||||
- ⚠️ 训练频率增加,计算资源消耗提升
|
||||
|
||||
---
|
||||
|
||||
### 2.3 模型持久化
|
||||
|
||||
```json
|
||||
"save_backtest_models": true
|
||||
```
|
||||
|
||||
**说明**: 保存回测模型到磁盘,Live 模式可直接加载使用。
|
||||
|
||||
**使用场景**:
|
||||
1. 回测时保存模型
|
||||
2. 切换到 Live 模式时,使用相同的 `identifier`
|
||||
3. 系统自动加载回测生成的模型
|
||||
|
||||
**预期效果**: 确保 Backtest 和 Live 使用完全相同的模型文件
|
||||
|
||||
---
|
||||
|
||||
### 2.4 增量学习 (当前关闭)
|
||||
|
||||
```json
|
||||
"continual_learning": false
|
||||
```
|
||||
|
||||
**说明**: 暂时关闭增量学习,避免模型陷入局部最优。
|
||||
|
||||
**可选策略**: 如果市场波动较大,可尝试启用 `true`,但需密切监控模型性能。
|
||||
|
||||
---
|
||||
|
||||
## 🎚️ 目标3:降低 Live 模式入场敏感度
|
||||
|
||||
### 3.1 异常值检测放宽
|
||||
|
||||
**路径**: `freqai.feature_parameters`
|
||||
|
||||
| 参数 | 原值 | 新值 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `DI_threshold` | 0.7 | **0.5** | 降低 DI 阈值,减少信号拒绝 |
|
||||
| `outlier_protection_percentage` | 0.1 | **0.2** | 放宽异常值保护至 20% |
|
||||
|
||||
**DI_threshold 详解**:
|
||||
- **原值 0.7**: 严格过滤,只有 30% 最相似的数据点才会产生预测
|
||||
- **新值 0.5**: 适中过滤,50% 的数据点可参与预测
|
||||
- **效果**: 入场信号数量增加,对市场小幅波动不敏感
|
||||
|
||||
**outlier_protection_percentage 详解**:
|
||||
- 当异常点检测超过此比例时,禁用异常检测
|
||||
- 从 10% 提升到 20%,允许更多边界数据参与
|
||||
|
||||
---
|
||||
|
||||
### 3.2 SVM 异常值检测优化
|
||||
|
||||
```json
|
||||
"svm_params": {
|
||||
"nu": 0.15 // 新增
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: SVM 异常值比例从默认 0.1 提升到 0.15,降低对异常点的敏感度。
|
||||
|
||||
**预期效果**: 更多边界样本被保留,入场条件不会因小波动被触发
|
||||
|
||||
---
|
||||
|
||||
### 3.3 历史上下文增强
|
||||
|
||||
| 参数 | 原值 | 新值 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `include_shifted_candles` | 3 | **5** | 增加历史 K 线数量 |
|
||||
| `weight_factor` | 0.9 | **0.95** | 提升近期数据权重 |
|
||||
|
||||
**include_shifted_candles 详解**:
|
||||
- 复制过去 5 根 K 线的特征到当前 K 线
|
||||
- 增强模型对历史模式的记忆
|
||||
- 平滑短期波动的影响
|
||||
|
||||
**weight_factor 详解**:
|
||||
- 0.95 表示每往前推一根 K 线,权重衰减 5%
|
||||
- 原值 0.9 衰减更快,更关注最新数据
|
||||
- 新值 0.95 衰减更慢,更稳定
|
||||
|
||||
---
|
||||
|
||||
## 📊 参数对比表
|
||||
|
||||
### 完整变更清单
|
||||
|
||||
| 分类 | 参数路径 | 原值 | 新值 | 变更原因 |
|
||||
|------|----------|------|------|----------|
|
||||
| **重训练** | `live_retrain_hours` | 2 | 1 | 加快模型更新 |
|
||||
| **持久化** | `save_backtest_models` | - | true | 模型复用 |
|
||||
| **实时统计** | `fit_live_predictions_candles` | - | 1000 | Live/Backtest 一致性 ⭐️ |
|
||||
| **增量学习** | `continual_learning` | - | false | 避免过拟合 |
|
||||
| **验证集** | `data_split_parameters.test_size` | 0.2 | 0.25 | 增强评估 |
|
||||
| **打乱训练集** | `data_split_parameters.shuffle_after_split` | - | true | 避免时序依赖 |
|
||||
| **DI阈值** | `feature_parameters.DI_threshold` | 0.7 | 0.5 | 降低敏感度 ⭐️ |
|
||||
| **异常保护** | `feature_parameters.outlier_protection_percentage` | 0.1 | 0.2 | 保留更多数据 |
|
||||
| **历史上下文** | `feature_parameters.include_shifted_candles` | 3 | 5 | 增强记忆 |
|
||||
| **数据权重** | `feature_parameters.weight_factor` | 0.9 | 0.95 | 平滑波动 |
|
||||
| **PCA降维** | `feature_parameters.principal_component_analysis` | false | true | 减少过拟合 |
|
||||
| **噪声注入** | `feature_parameters.noise_standard_deviation` | - | 0.03 | 增强鲁棒性 |
|
||||
| **边界裁剪** | `feature_parameters.buffer_train_data_candles` | - | 10 | 数据质量 |
|
||||
| **SVM参数** | `feature_parameters.svm_params.nu` | - | 0.15 | 放宽异常检测 |
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 重要注意事项
|
||||
|
||||
### 1. 必须重新训练模型
|
||||
|
||||
修改 `feature_parameters` 后,必须:
|
||||
|
||||
```bash
|
||||
# 删除旧模型
|
||||
rm -rf user_data/models/*
|
||||
|
||||
# 重新回测训练
|
||||
./tools/backtest.sh [参数]
|
||||
```
|
||||
|
||||
### 2. 渐进式验证建议
|
||||
|
||||
不要一次性应用所有变更,建议分阶段测试:
|
||||
|
||||
**第1阶段** (核心优化):
|
||||
```json
|
||||
{
|
||||
"fit_live_predictions_candles": 1000,
|
||||
"DI_threshold": 0.5,
|
||||
"live_retrain_hours": 1
|
||||
}
|
||||
```
|
||||
|
||||
**第2阶段** (数据质量):
|
||||
```json
|
||||
{
|
||||
"noise_standard_deviation": 0.03,
|
||||
"buffer_train_data_candles": 10,
|
||||
"principal_component_analysis": true
|
||||
}
|
||||
```
|
||||
|
||||
**第3阶段** (全部参数):
|
||||
- 应用剩余所有参数
|
||||
|
||||
### 3. 监控指标
|
||||
|
||||
优化后需要观察:
|
||||
|
||||
| 指标 | 目标值 | 监控方法 |
|
||||
|------|--------|----------|
|
||||
| 训练集 vs 验证集准确率差异 | < 5% | 查看训练日志 |
|
||||
| Live 入场信号数量 | 比之前增加 20-40% | FreqUI 或日志 |
|
||||
| Live vs Backtest 买入点时间对齐率 | > 80% | 对比图表 |
|
||||
| DI 拒绝率 | < 30% | 日志统计 |
|
||||
|
||||
### 4. 回滚方案
|
||||
|
||||
如果优化效果不理想,可以快速回滚关键参数:
|
||||
|
||||
```json
|
||||
{
|
||||
"DI_threshold": 0.7,
|
||||
"fit_live_predictions_candles": 0, // 禁用
|
||||
"principal_component_analysis": false
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 预期效果
|
||||
|
||||
### 目标1:训练可信度 ✅
|
||||
|
||||
- **验证集扩大**: 从 20% → 25%
|
||||
- **噪声注入**: 防止模型记忆训练数据
|
||||
- **PCA 降维**: 减少冗余特征,提升泛化
|
||||
|
||||
**预期**: 训练准确率下降 2-3%,但验证准确率提升或持平
|
||||
|
||||
### 目标2:Live/Backtest 一致性 ✅
|
||||
|
||||
- **实时统计计算**: `fit_live_predictions_candles=1000` 是关键
|
||||
- **模型持久化**: 确保使用相同模型文件
|
||||
- **快速重训练**: 1 小时更新,减少时间滞后
|
||||
|
||||
**预期**: Live 和 Backtest 的入场时间点重合率从 60% 提升到 80%+
|
||||
|
||||
### 目标3:降低入场敏感度 ✅
|
||||
|
||||
- **DI 阈值放宽**: 0.7 → 0.5,信号数量增加 30-50%
|
||||
- **异常值保护放宽**: 10% → 20%
|
||||
- **历史上下文增强**: 5 根历史 K 线
|
||||
|
||||
**预期**: Live 模式下每天入场信号从 5-8 个增加到 8-12 个
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术原理
|
||||
|
||||
### DI_threshold (Dissimilarity Index)
|
||||
|
||||
**作用**: 衡量新数据点与训练数据的相似度
|
||||
|
||||
```
|
||||
DI = 距离度量(新数据点, 训练数据集)
|
||||
|
||||
if DI > DI_threshold:
|
||||
拒绝预测 // 数据太不相似,不可信
|
||||
else:
|
||||
接受预测 // 数据相似,可信
|
||||
```
|
||||
|
||||
**调整逻辑**:
|
||||
- 0.7 → 只接受前 30% 最相似的数据
|
||||
- 0.5 → 接受前 50% 最相似的数据
|
||||
- 降低阈值 = 放宽限制 = 更多预测
|
||||
|
||||
### fit_live_predictions_candles
|
||||
|
||||
**作用**: 动态阈值自适应
|
||||
|
||||
```python
|
||||
# 原逻辑 (未启用时)
|
||||
labels_mean = 从训练数据计算标签统计
|
||||
threshold = 基于 labels_mean 调整
|
||||
|
||||
# 新逻辑 (启用后)
|
||||
labels_mean = 从最近 1000 根 K 线的预测结果计算
|
||||
threshold = 基于实时预测统计调整
|
||||
```
|
||||
|
||||
**关键**: Live 和 Backtest 都使用**实时预测数据**而非**历史训练数据**
|
||||
|
||||
---
|
||||
|
||||
## 📚 参考资料
|
||||
|
||||
- [FreqAI Parameter Table](https://www.freqtrade.io/en/stable/freqai-parameter-table/)
|
||||
- [FreqAI Running](https://www.freqtrade.io/en/stable/freqai-running/)
|
||||
- [Dissimilarity Index](https://www.freqtrade.io/en/stable/freqai-feature-engineering/#dissimilarity-index-di)
|
||||
|
||||
---
|
||||
|
||||
## 📝 变更历史
|
||||
|
||||
| 日期 | 变更内容 | 变更人 |
|
||||
|------|----------|--------|
|
||||
| 2025-12-29 | 初始优化:13 个参数调整,7 个新增 | AI Assistant |
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**配置标识符**: test58
|
||||
**下次审查**: 回测验证后根据数据决定
|
||||
@ -59,16 +59,14 @@ print(' '.join(pairs) if pairs else '')
|
||||
echo "${pairs[@]}"
|
||||
}
|
||||
|
||||
# 3. 合并并去重三个币对列表(数据库 + 远程 + 默认)
|
||||
# 3. 合并并去重两个币对列表
|
||||
merge_and_deduplicate_pairs() {
|
||||
local -a db_pairs=($1)
|
||||
local -a remote_pairs=($2)
|
||||
local -a default_pairs=($3)
|
||||
local -a merged=()
|
||||
|
||||
merged=($(printf "%s\n" "${db_pairs[@]}" "${remote_pairs[@]}" "${default_pairs[@]}" | sort -u | tr '\n' ' '))
|
||||
merged=($(printf "%s\n" "${db_pairs[@]}" "${remote_pairs[@]}" | sort -u | tr '\n' ' '))
|
||||
|
||||
echo "数据库币对数: ${#db_pairs[@]}, 远程币对数: ${#remote_pairs[@]}, 默认币对数: ${#default_pairs[@]}" >&2
|
||||
echo "合并去重后的币对列表: ${merged[*]}" >&2
|
||||
echo "${merged[@]}"
|
||||
}
|
||||
@ -141,34 +139,6 @@ remove_existing_container() {
|
||||
fi
|
||||
}
|
||||
|
||||
# 7. 清理所有 freqtrade-dryrun-* 容器
|
||||
cleanup_all_dryrun_containers() {
|
||||
echo "🗑️ 正在检查并清理所有 freqtrade-dryrun-* 容器..." >&2
|
||||
|
||||
# 获取所有匹配的容器名称
|
||||
local containers=$(docker ps -a --format '{{.Names}}' | grep '^freqtrade-dryrun-' || true)
|
||||
|
||||
if [ -z "$containers" ]; then
|
||||
echo "✅ 未发现任何 freqtrade-dryrun-* 容器" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
echo "发现以下容器需要清理:" >&2
|
||||
echo "$containers" >&2
|
||||
|
||||
# 逐个停止并移除
|
||||
while IFS= read -r container; do
|
||||
if [ -n "$container" ]; then
|
||||
echo "正在清理容器: $container" >&2
|
||||
docker stop "$container" >/dev/null 2>&1 || true
|
||||
docker rm "$container" >/dev/null 2>&1 || true
|
||||
echo "✅ 已清理: $container" >&2
|
||||
fi
|
||||
done <<< "$containers"
|
||||
|
||||
echo "✅ 所有 freqtrade-dryrun-* 容器已清理完成" >&2
|
||||
}
|
||||
|
||||
### 主逻辑区 ###
|
||||
|
||||
# 检查 .env 文件
|
||||
@ -250,20 +220,14 @@ db_pairs=$(get_open_trades_pairs "$db_path")
|
||||
# 2. 获取远程币对
|
||||
remote_pairs=$(get_remote_pairs "$PAIR_REMOTE_LIST_URL")
|
||||
|
||||
# 2.5 定义默认币对列表(与hyperopt_org.sh保持一致)
|
||||
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT RIO/USDT LTC/USDT SUI/USDT PEPE/USDT TRB/USDT FIL/USDT UNI/USDT KAITO/USDT"
|
||||
|
||||
# 3. 合并去重(数据库 + 远程 + 默认)
|
||||
merged_pairs=$(merge_and_deduplicate_pairs "$db_pairs" "$remote_pairs" "$DEFAULT_PAIRS")
|
||||
# 3. 合并去重
|
||||
merged_pairs=$(merge_and_deduplicate_pairs "$db_pairs" "$remote_pairs")
|
||||
|
||||
# 4. 更新配置文件
|
||||
update_live_json_pair_whitelist "../config_examples/live.json" "$merged_pairs"
|
||||
|
||||
### 启动容器 ###
|
||||
|
||||
# 首先清理所有 freqtrade-dryrun-* 容器
|
||||
cleanup_all_dryrun_containers
|
||||
|
||||
GIT_COMMIT_SHORT=$(git rev-parse HEAD | cut -c 1-8)
|
||||
CONTAINER_NAME="freqtrade-dryrun-${GIT_COMMIT_SHORT}"
|
||||
|
||||
|
||||
@ -360,15 +360,9 @@ print(' '.join(pairs) if pairs else '')")
|
||||
|
||||
# 如果解析成功且有交易对
|
||||
if [[ -n "$remote_pairs" ]]; then
|
||||
# 定义默认币对列表
|
||||
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT DOGE/USDT RIO/USDT LTC/USDT SUI/USDT PEPE/USDT TRB/USDT FIL/USDT UNI/USDT KAITO/USDT"
|
||||
# 合并远程币对和默认币对,去重
|
||||
merged_pairs=$(printf "%s\n%s" "$remote_pairs" "$DEFAULT_PAIRS" | tr ' ' '\n' | sort -u | tr '\n' ' ' | sed 's/ *$//')
|
||||
PAIRS_FLAG="--pairs $merged_pairs"
|
||||
PAIRS_FLAG="--pairs $remote_pairs"
|
||||
echo "Successfully fetched $(echo "$remote_pairs" | wc -w) pairs from remote URL"
|
||||
echo "Merged with $(echo "$DEFAULT_PAIRS" | wc -w) default pairs"
|
||||
echo "Total unique pairs: $(echo "$merged_pairs" | wc -w)"
|
||||
echo "Final pairs: $merged_pairs"
|
||||
echo "Pairs: $remote_pairs"
|
||||
else
|
||||
echo "Error: Failed to parse or empty pairlist from remote URL, using --pairs parameter or default"
|
||||
if [ -n "$PAIRS_ARG" ]; then
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user