# 趋势网格策略迭代记录

> 本文只记录趋势网格研究；波动突破生产策略见
> [`strategy-iterations.md`](./strategy-iterations.md)。顶部「速览」是当前状态的唯一
> 权威位置，正文按时间追加，历史结论不回改。

## 速览（最后更新 2026-07-15）

- **当前状态：未部署，研究否决。** bot3 保持停止，不以网格替换已退役的 Grok 线。
- 研究标的：BTC/ETH/SOL/BNB USDT-M，5m 主周期，1m 明细成交模拟，2x isolated。
- 已测仓位：等权 `1:1:1:1`、顺向封顶 `1:1:2:3`、库存递减 `3:2:1:1`、
  有界 LIFO、宽 ATR 网格，以及只在浮盈方向加仓的 `2:1:1` 金字塔。所有方案的总风险
  预算固定，不允许无限马丁。
- 最好标准费率结果是库存递减版：训练 +0.76% / PF 1.05，验证 +1.48% / PF 1.20；
  单边费率由 0.035% 提高到 0.05% 后验证变为 -0.06% / PF 0.99，不满足部署标准。
- 第二轮宽网格训练 -5.33% / PF 0.73；盈利金字塔训练 +1.26% / PF 1.04、验证
  -2.23% / PF 0.90。前者仍被越界尾损压倒，后者的低回撤主要来自缩小核心仓位，均否决。
- 服务器回测归档：`/data/freqtrade/user_data/backtest_results/trend-adaptive-grid/`；
  第二轮归档：`/data/freqtrade/user_data/backtest_results/trend-grid-round2/`。被否决策略文件
  已从运行目录清理，参数与结果由本文和回测归档保留。

## 设计原则

本轮没有采用固定价格上下沿或无限补仓。实现遵循以下约束：

1. 空仓时用 EMA48 作为移动中心，ATR 决定格距，12 小时滚动窗口判断区间是否适合；
   价格移动后，下一笔交易自动得到新的中心、天花板和地板。
2. 首单成交后冻结中心、格距和上下沿。持仓期间不把网格追着亏损方向平移；越过冻结
   边界直接退出，48 小时未完成也退出。
3. EMA200 方向/斜率、ADX 12~35 与 BTC 日线 200DMA 共同做趋势和市况过滤；仅测试
   四个高流动性主流币。
4. 每笔账户风险预算 0.75%，活动网格总保证金不超过钱包 18%，最多四层、2x 杠杆。
   所谓斐波那契只是固定总预算内的权重，不增加总风险上限。
5. 回测使用 5m 信号与 1m `--timeframe-detail`，避免假设同一根 5m K 线里的多次网格
   成交顺序；标准费率为单边 0.035%，另做 0.05% 执行成本压力。

这些原则与动态重置网格、库存风险管理的研究方向一致。动态网格论文也指出简单假设下
传统网格的期望收益接近零，改进点在动态重置而不是无限摊平；做市库存模型则强调报价
和风险应随库存与波动变化，而非只按价格层数扩大仓位。参见
[Dynamic Grid Trading Strategy](https://arxiv.org/abs/2506.11921) 与
[Avellaneda–Stoikov](https://math.nyu.edu/inmemoriam/avellaneda/HighFrequencyTrading.pdf)。

## 社区实现审计（2026-07-15）

### LazyPigPig/freqtrade-grid

审计仓库 [`LazyPigPig/freqtrade-grid`](https://github.com/LazyPigPig/freqtrade-grid)，
main HEAD `d09269e`（2025-01-31）。可借鉴点是用成交订单维护网格层、反弹后按 LIFO
释放最近一层；但原代码不适合直接运行：

- 主 Future 版名字写 ADX，实际计算的是 `PLUS_DI/MINUS_DI`；固定 10 USDT 首单、3x、
  `max_entry_position_adjustment=-1`，止损为 -100%，没有钱包级总仓位上限。
- v7 是 1m、10x、0.1% 固定小格、无限加仓；30 日高低窗口只用于首单金额比例，
  并没有动态移动网格边界。
- 主版 `list.append(a, b)` 会在运行时抛错；部分退出直接返回币数量，而 Freqtrade
  回调要求返回保证金币种金额，单位不一致。
- 仓库没有给出可核验的训练/样本外回测表。

本轮只独立实现了“成交层账本 + LIFO”思想，并补上活动层、生命周期订单、总风险和
越界退出限制；训练仍为负，见下表。

### hengxuZ/spot-trend-grid

审计仓库 [`hengxuZ/spot-trend-grid`](https://github.com/hengxuZ/spot-trend-grid)，最后代码
提交停在 2022-05-07。它会用近 20 根 4h K 线平均振幅动态更新买卖间距，并在空仓且
价格上涨越过卖线时抬高下一组网格，这是可借鉴的“空仓移动窗口”。但：

- 主循环中的 `calcAngle` 趋势判断已被注释，实际运行不含宣称的趋势过滤。
- `get_atr()` 是平均 `(high-low)/close`，不是 True Range ATR。
- 数量数组耗尽后永久重复最后一个数量，没有总仓位上限、边界止损或可复现回测；
  直接调用旧版 Binance API，也不是 Freqtrade 策略。

因此只借鉴空仓重置和波动率格距概念，不采用其实现或收益宣传。

### Henry Lin 教程

审计 [`henrylin99/freqtrade-tutorials`](https://github.com/henrylin99/freqtrade-tutorials)
中的 `GridTradingStrategy.py` 与第 28 课。ATR 格距、ADX 排除强趋势、滚动区间和费用
警告有教学价值；但示例没有启用 `position_adjustment_enable`，所以一个 pair 仍只是
单笔 Freqtrade 仓位，本质是带网格指标的均值回归，不是多层网格。教程示例也没有
提供可审计的样本外收益，不能作为上线证据。

## 自研候选与回测（2026-07-15，全部否决）

统一协议：1000 USDT、BTC/ETH/SOL/BNB、5m + 1m 明细、2x isolated、最多 4 仓、
启用 StoplossGuard、`--fee 0.00035 --cache none`。训练段为
`2026-01-01~05-01`，训练胜者才进入 `2026-05-01~07-10` 验证段。

| 候选/区间 | 交易数 | 收益 | PF | 胜率 | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---:|---|
| 等权 `1:1:1:1` / 训练 | 500 | +0.01% | 1.00 | 90.0% | 2.74% | 无 edge |
| 顺向 `1:1:2:3` / 训练 | 432 | -0.78% | 0.91 | 91.9% | 2.43% | 马丁尾损，否决 |
| 库存递减 `3:2:1:1` / 训练 | 499 | +0.76% | 1.05 | 89.2% | 3.14% | 训练胜者 |
| 库存递减 `3:2:1:1` / 验证 | 262 | +1.48% | 1.20 | 89.7% | 2.09% | edge 过薄 |
| 同上 / 验证，费率 0.05% | 262 | -0.06% | 0.99 | 89.7% | 2.60% | 成本即失效 |
| 有界 LIFO / 训练 | 470 | -0.28% | 0.98 | 86.6% | 3.63% | 否决，不进验证 |

库存递减版在标准费率验证段成交额约 10.2 万 USDT，仅产生 14.81 USDT 净利；单边费用
增加 1.5bp 后即变成 -0.58 USDT。它还没有计入真实滑点、挂单未成交和 live 模式每
约 5 秒调用仓位调整所造成的差异。Freqtrade 官方也明确说明，额外仓位调整会产生费用，
live 与 backtest 的回调频率不同，逻辑不严会重复下单；详见
[Position adjustment callback](https://docs.freqtrade.io/en/latest/strategy-callbacks/#adjust-trade-position)。

胜率 89%~92% 并不代表策略优良：标准费率下，库存递减验证段 235 笔反弹止盈赚
+8.99%，27 笔越界亏 -7.51%；更现实的费用直接吃掉剩余差额。与生产 D48 的训练
+18.97% / PF 1.14、验证 +14.25% / PF 1.23 相比，网格没有足够机会成本优势。

## 第二轮：宽网格与盈利金字塔（2026-07-15，全部否决）

第二轮专门验证两个假设，而不是继续缩小格距：

1. **宽 ATR 网格**：格距取 `max(1.35 ATR, 0.45%)`，首单与两次逆向补仓权重为
   `2:1:1`，冻结边界为中心上下 `3.25` 格，单次反弹一格止盈。账户风险、18% 总保证金
   上限、2x 杠杆和趋势过滤保持不变。
2. **盈利金字塔**：完整复用 D48 信号、止损、移动止盈和同向持仓限制；只把计划仓位拆成
   `2:1:1`。价格先向有利方向运行 1 ATR、2 ATR 才加仓，每个新增层再运行 1 ATR 后单独
   止盈，绝不向亏损方向摊平。`TrendPyramidControl` 保持 D48 原仓位作为同期控制组。

统一使用服务器四币种、5m 信号 + 1m 明细、1000 USDT、单边费率 0.035%、
`--cache none --enable-protections`。训练段为 `2026-01-01~05-01`，只有训练为正的盈利
金字塔进入 `2026-05-01~07-10` 验证；宽网格按协议不进入验证。

| 候选/区间 | 交易数 | 收益 | PF | 胜率 | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---:|---|
| D48 控制组 / 训练 | 153 | +7.15% | 1.11 | 54.9% | 14.24% | 同期基准 |
| 宽 ATR 网格 / 训练 | 199 | -5.33% | 0.73 | 70.9% | 6.12% | 否决，不进验证 |
| 盈利金字塔 / 训练 | 155 | +1.26% | 1.04 | 50.3% | 6.35% | 进入验证 |
| D48 控制组 / 验证 | 95 | -0.62% | 0.98 | 51.6% | 8.56% | 同期基准 |
| 盈利金字塔 / 验证 | 90 | -2.23% | 0.90 | 43.3% | 6.54% | 否决 |

宽网格训练中 141 笔反弹止盈合计 +14.06%，58 笔越界退出合计 -19.39%；平均一笔
越界亏损约为一笔止盈的 3.35 倍，实际 70.9% 胜率低于约 77.0% 的盈亏平衡胜率。
因此本轮失败不再是“网格太小、纯被费率吃掉”，而是均值回归网格本身的尾部盈亏结构
没有通过。加宽格距减少交易频率，不能修复单边突破造成的大额亏损。

盈利金字塔确实发生了动态加仓，并非回调未生效：训练段 102/155 笔交易触发 186 次
加仓与 161 次分层止盈；验证段 50/90 笔触发 91 次加仓与 80 次分层止盈。但训练收益
只有控制组的约 18%，验证还比控制组少 1.61 个百分点。最大回撤下降来自首单仅使用计划
仓位的一半；动态仓位没有提供样本外正 edge。斐波那契或其他权重只能重新分配已有风险，
不能把负期望的入场/退出结构变成正期望。

第二轮没有进入 0.05% 费率压力、黑天鹅压力或 dry-run：宽网格训练失败，盈利金字塔验证
失败，已满足提前终止条件。若未来重开，应先提出新的收益来源，例如可核验的 maker 成交
模型、基于订单簿/库存的报价偏移，或独立样本上能降低越界损失的趋势切换机制；不再只调
ATR 倍数、层数或仓位权重。

## 最终决定

1. 不部署任何网格候选，不启动 bot3，不做黑天鹅压力测试或 live/dry-run 前向；第一轮
   费用压力和第二轮训练/验证门槛均已失败，继续调参只会扩大过拟合空间。
2. Grok bot3 单独按波动策略文档结案。网格研究没有接管其服务名、端口或数据库。
3. 被否决研究策略从本地与服务器 `strategies/research/` 清理；1m 数据和回测 zip 保留，
   便于未来出现新机制时复核，不把失败代码留在运行目录。
4. 后续若重开，只接受两类新证据：可验证的 maker 成交模型，或在冻结总风险下显著
   降低越界尾损的机制；不再测试无限层数、顺向放大仓位或固定百分比小格。

## 复现命令

```bash
cd /data/freqtrade

# 下载四个主流币的 1m 明细（本轮每币 275,040 根）
docker compose run --rm --no-deps freqtrade download-data \
  --config user_data/config.json \
  --pairs BTC/USDT:USDT ETH/USDT:USDT SOL/USDT:USDT BNB/USDT:USDT \
  --timeframes 1m --timerange 20260101-20260711

# 标准训练/验证命令骨架；策略文件已按否决清理，参数由本文保留
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/research \
  --strategy <candidate> \
  --pairs BTC/USDT:USDT ETH/USDT:USDT SOL/USDT:USDT BNB/USDT:USDT \
  --timeframe 5m --timeframe-detail 1m \
  --timerange <train-or-validation> \
  --fee 0.00035 --cache none --enable-protections --export trades
```
