feat: ATR-GridBot mit Regime-Filter — Walk-Forward, Gate nicht bestanden

3 fixe Varianten (spacing 1.0/1.5×ATR, ADX<20/15): OOS-PF 0.87/1.03/0.94.
Grid-Stops bei Range-Breakdowns fressen die TP-Gewinne — kein Paper-Deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 06:43:38 +00:00
parent 2dcab7f24d
commit b5dd953afc
7 changed files with 474 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
# trade-kuns — ATR-GridBot mit Regime-Filter (Design)
**Datum:** 2026-06-10
**Status:** Umsetzung Phase Backtest (User-Entscheidung: Walk-Forward-Gate vor Paper-Lauf)
**Lehren aus krypto-kuns-GridBot v1:** Spacing zu eng → Fees fraßen Profit · Level-Chasing/Rebalance-Flapping · kein Regime-Bewusstsein (kaufte in fallende Messer)
## 1. Strategie (long-only Spot, je Pair unabhängig)
**Aktivierung** (auf 4h-Close, kein aktives Grid):
- ADX(14, 4h) < `adxMax` (Seitwärtsregime — komplementär zum Trend-Bot, der ADX ≥ 20 verlangt)
- Center `C` = Close, Spacing `S` = `spacingAtrMult` × ATR(14, 4h) — **eingefroren** für die Grid-Lebensdauer (kein Chasing)
- `N` Buy-Levels bei C k·S (k = 1…N), Budget je Level = (Equity / 4 Pairs) / N; unter 10 USDT keine Aktivierung
**Fills** (auf 15m):
- Sells zuerst, dann Buys — ein im selben 15m-Bar gekaufter Lot kann nicht im selben Bar verkaufen (pessimistisch, keine Intrabar-Reihenfolge-Annahme)
- Buy: Low ≤ Level-Preis und Level frei → Fill zum Level-Preis (+ Slippage + Fee)
- Take-Profit: High ≥ Level-Preis + S → Verkauf genau ein Spacing über dem Einstand; Level wird wieder frei (Re-Buy beim nächsten Dip)
**Deaktivierung** (auf 4h-Close, alle Lots werden zum Close glattgestellt, `grid_stop`):
- Range-Breakdown: Close < C (N+1)·S (harter Stop des gesamten Grids)
- Range-Ausbruch oben: Close > C + (N+1)·S (Re-Center beim nächsten Aktivierungs-Check)
- Trend setzt ein: ADX ≥ `adxMax` + 5 (Hysterese gegen Flapping)
Danach ist Re-Aktivierung an jedem späteren 4h-Close möglich (neues Center).
**Fixe A-priori-Parameter** (keine Grid-Suche — die hat beim Trend-Bot 2.58× Overfitting erzeugt):
`spacingAtrMult` 1.0 · `gridLevels` 4 · `adxMax` 20 · ATR/ADX-Periode 14 · Fees 0.1 % + 5 bps Slippage je Seite (4h-ATR ≈ 13 % → Spacing schlägt die ~0.3 % Round-Trip-Kosten strukturell)
## 2. Umsetzung
- `src/server/backtest/grid.ts``runGridBacktest(candles15ByPair, cfg): BacktestResult`. Eigener Lot-Ledger (mehrere Lots je Pair — `Portfolio` kann nur eine Position je Pair), identische Fee/Slippage-Mathematik, R-Multiple gegen Grid-Stop-Distanz. 15m-Timeline + 4h-Erkennung wie `runner.ts`.
- `exitReason` erweitert um `'grid_tp' | 'grid_stop'`.
- `src/server/scripts/grid-walkforward.ts` — wie `rotation-walkforward.ts`: fixe Params, `buildWindows` + `aggregateOos` + Gate, Persistenz in `backtest_runs` (kind `grid-walkforward`).
- **Gate unverändert** (§5 der Haupt-Spec). Besteht das Grid das Gate, folgt die Paper-Integration als zweite Engine; fällt es durch, ist das ein legitimes Ergebnis.
## 3. Tests
Aktivierung nur bei ADX < adxMax · Fill bei Low-Touch · TP bei High-Touch (nicht im Entry-Bar) · Breakdown liquidiert alles · Oszillation zwischen zwei Levels ist nach Fees profitabel bei S = 1×ATR · Determinismus.

View File

@@ -0,0 +1,29 @@
# Walk-Forward-Ergebnisse: ATR-GridBot — 2026-06-10
**Daten:** 103 799 15m-Candles/Pair, 2023-06-24 → 2026-06-09 (3 Jahre), 32 Fenster (Train 120d / Test 30d).
**Strategie:** ATR-Grid mit ADX-Regime-Filter, long-only (Design: `docs/specs/2026-06-10-grid-bot-design.md`).
**Methodik:** fixe A-priori-Parameter je Variante, kein Grid-Search. CLI: `bun run grid [--spacing X --levels N --adx Y]`. Runs in `backtest_runs` (kind `grid-walkforward`).
| Variante | OOS-PF | Trades | WinRate | MaxDD | Overfit-Ratio | Gate |
|---|---|---|---|---|---|---|
| A: spacing 1.0×ATR, 4 Levels, ADX<20 | 0.87 | 1002 | 64.6 % | 18.4 % | 1.42 | ❌ PF + Fenster |
| B: spacing 1.5×ATR | 1.03 | 514 | 56.0 % | 10.6 % | 1.53 | ❌ PF + Fenster |
| C: ADX<15 (strenger) | 0.94 | 425 | 63.3 % | 6.5 % | 1.24 | ❌ PF + Fenster |
## Befund
Klassische Grid-Pathologie, durch Regime-Filter abgemildert, aber nicht behoben:
hohe WinRate (viele kleine TP-Gewinne à 1 Spacing), doch die `grid_stop`-Verluste
bei Range-Breakdowns (5 Spacings über N Lots) fressen alles. Breiteres Spacing
(B) hebt den PF Richtung Break-even (1.03 ≈ Fees zurückverdient, mehr nicht),
strengerer Filter (C) senkt nur den Drawdown. Schlechtestes Fenster durchgängig
PF ≈ 0.1 — Crash-Monate treffen das Grid voll.
**Schlussfolgerung:** Mean-Reversion-Grids haben auf Krypto-4h über 3 Jahre
keinen handelbaren Edge nach Fees — konsistent mit dem v1-GridBot-Erlebnis
(krypto-kuns) und spiegelbildlich zum Trendfolge-Befund (dünner Edge, weil
Krypto eben trendet/crasht statt sauber zu ranged).
**Entscheidung:** Gate nicht bestanden → **kein Paper-Deploy des GridBots.**
Das Gate wird nicht aufgeweicht. Der laufende Paper-Probelauf des Trend-Bots
(trading.kuns.dev) bleibt das Live-Experiment.