Level-Auswahl: Nachbau behoben (core/sr_levels.py) - Luecke bleibt offen

Auftrag zum benannten naechsten Schritt: die Backtests bauten die
Live-Level-Auswahl nach, statt sie zu benutzen. Drei echte Abweichungen:

  1. Der Nachbau clusterte den GEMISCHTEN Rohpool (sorted(ch+cl)); live werden
     ph und pl GETRENNT geclustert. Das ist exakt der Fehler, den der Live-Code
     als behoben dokumentiert ("nicht vorher zusammenlegen!" - Ketten-Mega-
     Cluster in dichten Zonen). Gemessen: 4,5 % aller Zeitpunkte hatten einen
     anderen Widerstand.
  2. Live rundet jede Linie auf 3 Stellen, der Nachbau nicht.
  3. Live fuehrt Widerstand und Unterstuetzung mit getrennter Hysterese.

Geloest ueber core/sr_levels.py (cluster/linien/naechste/halten).
engine._draw_levels ruft es auf, Verhalten bitgenau unveraendert
(tests/test_sr_levels.py, 6 Tests, je 300-400 Zufallsfaelle). Der Test enthaelt
die Gegenprobe, dass der Nachbau wirklich abwich - sonst waere nicht belegt,
dass es etwas zu beheben gab.

backtest_pbreak_retrain.build_levels bleibt unveraendert (Migrations-Regel: die
daraus gefitteten Live-Gewichte duerfen sich nicht rueckwirkend verschieben).
Daneben neu: build_levels_live fuer kuenftige Fits.

ABER die Korrektur schliesst die Basisraten-Luecke nicht: 38,0 -> 38,3 %,
live 52,7 %.

Damit fuenf Hypothesen geprueft und alle widerlegt:
  Niveau/Achsenabschnitt   Roll-Achse faellt live durch
  Vola-Regime              ueber 5 Quintile flach (37,0-39,2 %)
  Sammelart                -1,7 Pp, falsche Richtung
  ATR-Floor-Artefakt       +2,8 Pp; bei live-gleichem ATR erst 40,1 %
  Level-Auswahl            +0,4 Pp

Nebenbefund: 53,9 % aller Backtest-Bars sitzen auf dem ATR-Floor 0,12, live nur
5,4 % - der Backtest-Zeitraum ist deutlich ruhiger. Der ATR selbst stimmt aber
ueberein (Median live 0,2167 gegen letzte 7 Tage 0,2174).

Kein Notfall: auto_sr_close ist false, das Modell schliesst keine Trades.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-07 11:30:07 +02:00
co-authored by Claude Opus 5
parent 2e89724368
commit aefac274d3
5 changed files with 328 additions and 25 deletions
+60
View File
@@ -4911,6 +4911,66 @@ Modell schliesst keine Trades.
„die Rangfolge ist kaputt" ist **nicht** belegt; belegt ist nur die
Basisraten-/Kalibrierungslücke.
## ⚠⚠ LEVEL-AUSWAHL: NACHBAU BEHOBEN — die Basisraten-Lücke bleibt UNERKLÄRT (2026-08-07)
Auftrag „behebe das" zum benannten nächsten Schritt: die Backtests bauten die
Live-Level-Auswahl nach, statt sie zu benutzen.
✅ **DREI ECHTE ABWEICHUNGEN GEFUNDEN — und die erste ist ein Lehrstück:**
| # | Nachbau (`backtest_pbreak_retrain.py`) | LIVE (`_draw_levels`) |
|---|---|---|
| 1 | clustert den **GEMISCHTEN** Rohpool (`sorted(ch+cl)`) | ph und pl **GETRENNT**, dann zusammenführen |
| 2 | keine Rundung | `round(…, 3)` je Linie |
| 3 | EINE Hysterese je Trade-Richtung | Widerstand und Unterstützung **getrennt** |
⚠⚠ **Punkt 1 ist genau der Fehler, den der Live-Code als BEHOBEN dokumentiert:**
„ph/pl bleiben GETRENNT geclustert (**nicht vorher zusammenlegen!**) — ein erster
Versuch clusterte den kombinierten Rohpool direkt, was in dichten Zonen zu
**Ketten-Mega-Clustern** führte." Der Nachbau machte also weiter das, was live
erkannt und repariert worden war. **Gemessen: 4,5 % aller Zeitpunkte hatten einen
anderen Widerstand** (13.283 Vergleichspunkte, Ø-Linienzahl 8,1 statt 8,4).
**GELÖST: `core/sr_levels.py`** (`cluster` · `linien` · `naechste` · `halten`).
`engine._draw_levels` ruft es auf; **Verhalten bitgenau unverändert**
(`tests/test_sr_levels.py`, 6 Tests über je 300400 Zufallsfälle inkl. Hysterese
in beide Richtungen). ⚠ Der Test enthält bewusst auch die **Gegenprobe**, dass der
Nachbau wirklich abwich — ohne sie wäre nicht belegt, dass es etwas zu beheben gab.
`backtest_pbreak_retrain.build_levels` bleibt **unverändert** (Migrations-Regel:
seine Zahlen und die daraus gefitteten Live-Gewichte `_PB_*` dürfen sich nicht
rückwirkend verschieben). Daneben steht jetzt **`build_levels_live`** — **neue Fits
gehören dorthin**, zusammen mit `core.sr_levels.linien` statt `_cluster`.
⚠⚠ **ABER: DIE KORREKTUR SCHLIESST DIE LÜCKE NICHT — +0,4 Pp.**
| | Basisrate |
|---|---|
| Nachbau (gemischter Pool) | 38,0 % |
| korrigiert (live-treu) | **38,3 %** |
| **LIVE ab 01.08.** | **52,7 %** |
⚠⚠⚠ **FÜNF HYPOTHESEN, FÜNF WIDERLEGUNGEN — die 15-Pp-Lücke ist OFFEN:**
| Hypothese | Ergebnis |
|---|---|
| Niveau/Achsenabschnitt driftet | Roll-Achse fällt live durch, oberste Klasse bleibt invertiert |
| Vola-Regime | Bruchrate über 5 Quintile **flach** (37,039,2 %) |
| Sammelart (je Berührung ↔ je Bar) | **1,7 Pp**, falsche Richtung |
| **ATR-Floor-Artefakt** | **+2,8 Pp**; bei live-gleichem ATR (≥0,20) erst **40,1 %** |
| **Level-Auswahl (dieser Fix)** | **+0,4 Pp** |
⚠ Der ATR-Befund ist trotzdem bemerkenswert: **53,9 % aller Backtest-Bars sitzen
auf dem Floor 0,12**, live nur **5,4 %** — der Backtest-Zeitraum ist also viel
ruhiger als die Live-Woche. Der ATR selbst stimmt dagegen überein (Median live
0,2167 gegen letzte 7 Tage 0,2174, Verhältnis **1,00**).
**Stand: der Fix ist richtig und gebaut, erklärt den Live-Fehler aber nicht.**
Die Live-Bruchrate von 52,7 % liegt ausserhalb der gesamten 9-Monats-Spanne
(33,6…41,1 %) und ist nach fünf geprüften Erklärungen weiterhin offen.
⚠ Nächste ungeprüfte Kandidaten: die **M1-gegen-M5-Auflösung** bei der
Ausgangsbestimmung (live wertet gegen `candles_m1` aus, der Backtest gegen
M5-Bars — innerhalb eines M5-Bars prüft der Backtest `confirm` VOR `reject`,
was ihn *zugunsten* von „break" verzerrt, also in die falsche Richtung), und die
Frage, ob `wave.pb_levels30` live überhaupt dieselben Pivots liefert wie
`build_levels`. **Beides nicht gemessen.**
⚠ Weiterhin **kein Notfall**: `auto_sr_close = false`, das Modell schliesst keine
Trades.
## ⚠⚠ LIVE-CODE HING AN EINEM BACKTEST-SKRIPT — behoben 2026-08-07
**Befund:** `core/engine.py` (`squeeze_monitor`) und `weekly_review.py` importierten