P(break) neu trainiert auf live-spiegelnder Stichprobe (Weg b) - eingebaut

Behebt die am selben Tag gefundene Merkmals-Diskrepanz: das alte Modell war
auf "Anlauf zu einem beim Entry FIXIERTEN Level" trainiert, live waehlt
_draw_levels das Level jede Sekunde neu -> mom3 live 0,15 statt 1,45 ->
Ausgabe immer ~23 % -> Gate seit Inbetriebnahme faktisch nie aktiv.

backtest_pbreak_retrain.py: Stichprobe spiegelt den Live-Pfad (Level
dynamisch mit Hysterese, gesampelt an JEDEM Bar im 0,15xATR-Band, keine
Anlauf-Bedingung). Kontrolle: Merkmalsmittel der Stichprobe (mom6 0,203 /
mom3 0,202) treffen die live rekonstruierten Werte (0,181 / 0,149).

  AUC auf dieser Stichprobe (H2, out-of-sample):
      ALT-Modell  0,368   (schlechter als Zufall, 19,2 % vs real 39,4 %)
      NEU-Modell  0,654   kalibriert

backtest_pbreak_rvalue.py (R-Ertrag, Echtkosten, Baseline = nur Trailing):
NEU schlaegt ALT in BEIDEN Haelften bei JEDER Schwelle. Gegen die Baseline
gewinnt es bei 0,35/0,45/0,55 in beiden (bei 0,60 kippt H1).
Bestwert 0,35: H1 -149 vs -506 (+357), H2 +1308 vs -110 (+1418).
Nebenbefund: das ALTE Modell war in H1 schlechter als gar kein Auto-Close.

EINGEBAUT: neue _PB_MU/_SD/_W (final auf allen 80k gefittet, n=76.542,
Basisrate 37,8 %, nach H1->H2-Validierung; alte Werte als Kommentar) +
sr_close_pbreak 0,55 -> 0,35, Config-Waechter-Anker mitgezogen.
Verifiziert: Chart-Linien zeigen 43 %/36 % statt 8-15 %.

ACHTUNG - invertiert eine alte Projekt-Regel: mom3-Gewicht dreht das
Vorzeichen (+1,4330 -> -0,5420). Alt: "kriecht ans Level -> 26 % Bruch, mit
Schwung -> laufen lassen". Neu: Anlauf-Schub -> 26,5 % (Level absorbiert
ihn und haelt), Schwung weg vom Level -> 51 %. Beides gilt in seiner
Population (fixiertes vs. dynamisches Level); fuer den Live-Pfad gilt die
neue Lesart.

Offen: auch NEU schliesst bei 0,35 noch ~94-97 % der Positionen (waehlt vor
allem den besseren Moment). Touch-Zahl bringt im neuen Modell nichts mehr
(0,652 vs 0,654) - die dynamische Level-Wahl erfasst den Effekt bereits.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-31 08:57:16 +02:00
co-authored by Claude Opus 5
parent b137967a68
commit 0944b1c13a
5 changed files with 557 additions and 11 deletions
+35 -4
View File
@@ -1511,10 +1511,41 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
(allerdings ohne Fenster-Definition und ohne die 5+-Umkehr). **Nächster Schritt: als
5. Merkmal in `backtest_srclose_prob.py` aufnehmen und über die 34.771 Touches / 2
echten Halbjahre neu fitten** — dort ist messbar, ob die AUC steigt.
**Empfehlung: `auto_sr_close=false`** (zurück auf reines
Trailing = der gemessene Vergleichsmaßstab). Eine reine Schwellensenkung repariert es
NICHT (sie ändert die Anzahl, nicht die Auswahl); 0,250,35 wäre nur ein Kompromiss,
falls die Mechanik erhalten bleiben soll.
**✅ BEHOBEN am selben Tag (Weg b, User-Entscheidung): MODELL NEU TRAINIERT.**
`backtest_pbreak_retrain.py` erzeugt eine **live-spiegelnde Stichprobe** — Level
dynamisch mit Hysterese wie `_draw_levels`, gesampelt an JEDEM Bar im 0,15×ATR-Band
(KEINE Anlauf-Bedingung), Ausgang/Fenster wie live. Kontrolle: die Merkmalsmittel
dieser Stichprobe (mom6 0,203 · mom3 0,202) treffen die live rekonstruierten Werte
(0,181 · 0,149) — sie bildet den Live-Pfad also wirklich ab.
| | ALT-Modell | NEU-Modell |
|---|---|---|
| AUC auf live-spiegelnder Stichprobe (H2, oos) | **0,368** | **0,654** |
| Ø-Vorhersage vs. real | 19,2 % vs 39,4 % | kalibriert |
**R-Ertrag (`backtest_pbreak_rvalue.py`, Echtkosten, Baseline = nur Trailing):** NEU
schlägt ALT in **BEIDEN Hälften bei JEDER Schwelle**; gegen die Baseline gewinnt es
bei 0,35/0,45/0,55 in beiden (bei 0,60 kippt H1). **Bestwert 0,35** — H1 149 vs
Baseline 506 (**+357**), H2 +1308 vs 110 (**+1418**). ⚠ Nebenbefund: das ALTE
Modell war in H1 **schlechter als gar kein Auto-Close** (653 vs 506), in H2 besser
(+576 vs 110) — genau die Regime-Abhängigkeit, die live als 8 €/Trade sichtbar war.
**Eingebaut:** neue `_PB_MU/_SD/_W` in `engine.py` (final auf allen 80k Bars gefittet,
n=76.542, Basisrate 37,8 %, nachdem H1→H2 validiert war; alte Werte als Kommentar für
den Rückweg) + **`sr_close_pbreak=0.35`** (Config-Wächter-Anker mitgezogen).
Verifiziert: Chart-Linien zeigen jetzt 43 %/36 % statt 815 %.
⚠⚠ **DAS NEUE MODELL INVERTIERT EINE ALTE PROJEKT-REGEL — bewusst so:** das Gewicht
von mom3 dreht das Vorzeichen (**+1,4330 → 0,5420**). Der alte Befund
(`backtest_srbreak.py`) lautete „Kurs KRIECHT ans Level → P(break) nur 26 %, mit
Schwung → laufen lassen (4143 %)". Das neue Modell sagt das Gegenteil: Anlauf-Schub
→ 26,5 % (das Level ABSORBIERT den Schub und hält), Schwung weg vom Level → 51 %.
**Beides gilt in seiner eigenen Population** — die alte Messung betraf den Anlauf zu
einem FIXIERTEN Level, die neue das Verweilen an einem DYNAMISCH gewählten. Für den
Live-Pfad gilt die neue Lesart; die alte Faustregel weiter oben im Text bezieht sich
auf die Anlauf-Situation und ist dort nicht widerlegt.
**Weiterhin offen:** auch das neue Modell schließt bei 0,35 noch ~9497 % der
Positionen (es wählt vor allem den BESSEREN Moment, ist also kein wirklich selektives
Gate). Und die **Touch-Zahl bringt im neuen Modell nichts mehr** (AUC 0,652 vs 0,654)
— die dynamische Level-Wahl erfasst denselben Effekt bereits; die User-Idee hat auf
den Fehler GEZEIGT, die Ursache lag eine Ebene tiefer. **B4/B5-Pflicht:** Live-AUC in
~2 Wochen gegen 0,65 halten (Reminder `pbreak_accuracy_v2`, 800 Vorhersagen ab 01.08.).
- **P(Trendumkehr) = GEMESSEN, NICHT BERECHENBAR (`analyze_reversal.py`, 2026-07-31,
User-Frage „können wir die Trendumkehr-Wahrscheinlichkeit berechnen?"):** Aufgebaut
exakt wie das erfolgreiche P(break)-Modell — mechanisch scharfes **Barriere-Rennen**