./hyperopt_org.sh 支持 --spaces 多个参数

This commit is contained in:
zhangkun9038@dingtalk.com 2025-11-21 09:41:18 +08:00
parent 48380afc3d
commit 604e3123fd
2 changed files with 269 additions and 14 deletions

View File

@ -0,0 +1,238 @@
# Hyperopt 多个 --spaces 参数用法指南
## 📋 概述
已升级 `hyperopt_org.sh` 脚本,现已支持多个 `--spaces` 参数,无需用引号包围多个空间参数。
---
## ✅ 支持的调用方式
### **方式1单个 --spaces 参数(原有方式)**
```bash
./hyperopt_org.sh --spaces buy
./hyperopt_org.sh --spaces sell
./hyperopt_org.sh --spaces "buy sell"
```
### **方式2多个 --spaces 参数(新增方式,推荐)**
```bash
# 方式 A多个 --spaces 关键字(最直观)
./hyperopt_org.sh --spaces buy --spaces sell
# 方式 B混合其他参数
./hyperopt_org.sh --spaces buy --spaces sell --epochs 200 --jobs 4
# 方式 C完整示例
./hyperopt_org.sh \
20240101 20241231 \
--spaces buy \
--spaces sell \
--spaces roi \
--epochs 300 \
--random-state 42 \
-j 8 \
--strategy freqaiprimer \
--config basic.json
```
### **方式3混合位置参数和命名参数**
```bash
# 位置参数 + 多个 --spaces
./hyperopt_org.sh 20240101 20241231 \
--spaces buy \
--spaces roi \
--spaces stoploss
```
---
## 📊 参数说明
| 参数 | 类型 | 说明 | 默认值 |
|------|------|------|--------|
| `--spaces` | 多值参数 | 优化空间(可重复多次) | `buy` |
| `--epochs` | 单值参数 | 优化轮次 | `100` |
| `--jobs` / `-j` | 单值参数 | 并行任务数 | `4` |
| `--random-state` | 单值参数 | 随机种子 | `19` |
### **支持的 Space 值**
```
buy - 入场条件优化
sell - 出场条件优化
roi - 收益目标优化
stoploss - 止损优化
trailing - 追踪止损优化
```
---
## 🎯 实际使用示例
### **场景1只优化入场条件**
```bash
./tools/hyperopt_org.sh \
--start-date 20240101 \
--end-date 20241231 \
--spaces buy \
--epochs 200
```
### **场景2优化入场+出场条件**
```bash
./tools/hyperopt_org.sh \
20240101 20241231 \
--spaces buy \
--spaces sell \
--epochs 300 \
-j 8
```
### **场景3完整优化入场+出场+止损+ROI**
```bash
./tools/hyperopt_org.sh \
--start-date 20240101 \
--end-date 20241231 \
--spaces buy \
--spaces sell \
--spaces roi \
--spaces stoploss \
--epochs 500 \
--random-state 42 \
-j 8 \
--strategy freqaiprimer \
--config basic.json \
--pairRemoteList "https://api.example.com/pairs"
```
### **场景4分阶段优化**
```bash
# 第1阶段优化入场条件
./tools/hyperopt_org.sh 20240101 20241231 \
--spaces buy --epochs 200 -j 8
# 第2阶段优化出场条件
./tools/hyperopt_org.sh 20240101 20241231 \
--spaces sell --epochs 200 -j 8
# 第3阶段优化止损和ROI
./tools/hyperopt_org.sh 20240101 20241231 \
--spaces roi \
--spaces stoploss \
--epochs 200 -j 8
```
---
## 🔧 脚本改进说明
### **改进1多值参数支持**
```bash
# 使用数组存储多个 --spaces 值
SPACES_VALUES=()
for arg in "$@"; do
if [[ "$prev_arg" == "--spaces" ]] || [[ "$prev_arg" == "--space" ]]; then
if [[ ! "$arg" =~ ^-- ]]; then
SPACES_VALUES+=("$arg")
fi
fi
prev_arg="$arg"
done
# 合并为空格分隔的字符串
if [ ${#SPACES_VALUES[@]} -gt 0 ]; then
SPACES="${SPACES_VALUES[@]}"
fi
```
### **改进2参数跳过优化**
原来的 `shift 2` 可能会跳过下一个实际参数,现在改为:
```bash
shift
if [[ $# -gt 0 ]] && [[ ! "$1" =~ ^-- ]]; then
shift
fi
```
这样可以正确处理参数链式调用。
### **改进3后向兼容**
仍然支持原有的单个 --spaces 和带引号的形式:
```bash
./hyperopt_org.sh --spaces "buy sell roi"
```
---
## 📈 性能建议
根据优化的 space 数量,推荐的参数配置:
| Space个数 | 推荐epochs | 推荐jobs | 预期时间 |
|----------|-----------|---------|---------|
| 1个 | 100-200 | 4-8 | 10-30分钟 |
| 2个 | 200-300 | 8 | 30-60分钟 |
| 3个 | 300-500 | 8-16 | 60-120分钟 |
| 4个+ | 500+ | 16+ | 2小时+ |
---
## ✨ 调试技巧
### **查看脚本处理的参数**
在脚本中添加 `set -x` 查看参数处理过程:
```bash
set -x # 启用调试输出
./hyperopt_org.sh --spaces buy --spaces sell
set +x # 禁用调试输出
```
### **检查最终生成的命令**
脚本会在执行前输出完整的 docker-compose 命令,检查 `--spaces` 是否正确合并:
```
docker-compose run --rm freqtrade hyperopt ... \
--spaces buy sell \
...
```
### **验证输出**
查看日志确认优化的 space
```bash
tail -f freqtrade/user_data/logs/freqtrade.log | grep -i "space"
```
---
## ⚠️ 常见问题
### **Q1为什么我的 --spaces 参数没有生效?**
A检查是否在 --spaces 值后面跟了其他参数而没有使用 `--`
```bash
# ❌ 错误sel 被当作了新参数
./hyperopt_org.sh --spaces buy --epochs 200 sel
# ✅ 正确:使用多个 --spaces
./hyperopt_org.sh --spaces buy --spaces sell --epochs 200
```
### **Q2能否同时优化多个 space**
A可以freqtrade 会自动按照指定的 space 进行联合优化:
```bash
./hyperopt_org.sh --spaces buy --spaces sell --spaces roi
```
### **Q3优化顺序重要吗**
A不重要freqtrade 会同时优化所有指定的 space。但可以分阶段优化以获得更好的结果。
---
## 📝 更新日志
### v2.0 - 2025-11-20
- ✅ 添加多个 --spaces 参数支持
- ✅ 改进参数跳过逻辑
- ✅ 增强后向兼容性
- ✅ 优化参数处理算法
### v1.0 - 原始版本
- 仅支持单个 --spaces 参数
- 需要使用引号包围多个值

View File

@ -60,21 +60,35 @@ fi
STRATEGY_NAME=${STRATEGY_NAME:-TheForceV7}
CONFIG_FILE=${CONFIG_FILE:-basic.json}
TEST_BRANCH=${TEST_BRANCH:-develop}
# --- 新增:解析 --spaces 或 --space 参数 ---
SPACES_ARG=$(get_param_value "--spaces" "$@")
# 如果没有提供 --spaces尝试获取 --space 参数
if [ -z "$SPACES_ARG" ]; then
SPACES_ARG=$(get_param_value "--space" "$@")
# --- 新增:解析多个 --spaces 参数 ---
# 提取所有 --spaces 后的值(支持多个 --spaces 参数)
SPACES_VALUES=()
for arg in "$@"; do
if [[ "$prev_arg" == "--spaces" ]] || [[ "$prev_arg" == "--space" ]]; then
if [[ ! "$arg" =~ ^-- ]]; then
SPACES_VALUES+=("$arg")
fi
fi
prev_arg="$arg"
done
# 如果有多个 --spaces 值,合并为空格分隔的字符串
if [ ${#SPACES_VALUES[@]} -gt 0 ]; then
SPACES="${SPACES_VALUES[@]}"
else
# 使用get_param_value作为备选方案兼容旧格式
SPACES_ARG=$(get_param_value "--spaces" "$@")
if [ -z "$SPACES_ARG" ]; then
# 如果没有提供任何参数,则默认为 "buy"
SPACES="buy"
SPACES_ARG=$(get_param_value "--space" "$@")
if [ -z "$SPACES_ARG" ]; then
SPACES="buy"
else
SPACES="$SPACES_ARG"
fi
else
# 使用 --space 参数提供的值
SPACES="$SPACES_ARG"
fi
else
# 使用 --spaces 参数提供的值
SPACES="$SPACES_ARG"
fi
echo "Using hyperopt spaces: $SPACES"
EPOCHS_ARG=$(get_param_value "--epochs" "$@")
@ -179,9 +193,12 @@ while [ $# -gt 0 ]; do
shift
fi
;;
--spaces | --space | --epochs | --random-state)
# 这些参数已经在前面处理过了,直接跳过
shift 2
--spaces | --space | --epochs | --random-state | --jobs | -j)
# 这些参数已经在前面处理过了,跳过参数及其值
shift
if [[ $# -gt 0 ]] && [[ ! "$1" =~ ^-- ]]; then
shift
fi
;;
*)
shift