P(break) Live-Auswertung: Modell haelt nicht - das Gate gatet nicht (B5)

analyze_pbreak_live.py, 2275 ausgewertete Vorhersagen seit 23.07.

  AUC 0,539 (Backtest-Erwartung 0,71) · entkoppelt 0,443 · M30-Teil 0,399
  Trefferquote 58,5 % vs 59,0 % fuer "immer Abprall" -> Ueberschuss -0,5 Pp
  Kalibrierung: Bucket 0-19 % sagt 8 % voraus, real 39,1 % (Faktor 5);
  Bucket 65-100 % sagt 74,5 %, real 48,0 % (invertiert)

KERNBEFUND: die Bruchrate der GESCHLOSSENEN Gruppe ist bei JEDER Schwelle
38-40 %, identisch zur Basisrate. Es findet live keine Auswahl statt. Bei
der ini-Schwelle 0,55 werden 91,2 % aller Beruehrungen geschlossen -> der
"P(break)-gegatete Close" ist faktisch der pauschale S/R-Close, und DER ist
2x gemessen und verworfen (backtest_srclose.py). Erklaert die
kontrafaktische Messung vom Vortag (-8 EUR/Trade, 43 % zu frueh).

Pipeline gegen das Training geprueft, KEIN Bug: dist in beiden
entry-basiert, mom6/mom3 in beiden am Touch-Bar, confirm/reject dieselbe
+-0,5xATR-Definition, Timeout zaehlt in beiden als Abprall. Plausibelste
Ursache: andere Stichproben-Population (2275 roh -> 307 entkoppelt, live
dominieren Chop-am-Level-Faelle). Entlastet das Modell aber nicht -
entkoppelt ist die AUC sogar schlechter.

TOUCH-ZAHL (User-Idee): auf Live-Daten in BEIDEN Haelften bestaetigt, aber
mit Umkehr - 1. Beruehrung 38,3/41,7 %, 4. 45,1/47,4 % (monoton, +6/+4 Pp),
aber 5.+ faellt auf 37,8/41,8 % zurueck (unter Basis, groesste Gruppe).
Umgekehrtes U: 2-4 Beruehrungen machen das Level muerbe, ab 5 in 30 min ist
es eine Range und haelt. Das Modell sieht davon nichts (~23 % konstant) ->
echte orthogonale Information. Belastbarkeit begrenzt (Haelften nur 4 Tage
auseinander, n=82-139). Naechster Schritt: als 5. Merkmal in
backtest_srclose_prob.py aufnehmen, ueber 34.771 Touches / 2 Halbjahre
neu fitten.

Empfehlung: auto_sr_close=false. Eine reine Schwellensenkung repariert es
nicht (aendert die Anzahl, nicht die Auswahl).

Reminder: Punkt erledigt, Wiedervorlage als pbreak_accuracy_v2 (800
Vorhersagen ab 01.08., nach einem Nachtraining).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-31 08:39:31 +02:00
co-authored by Claude Opus 5
parent f81cc63dc7
commit 92995b08d7
3 changed files with 212 additions and 8 deletions
+16 -8
View File
@@ -50,14 +50,22 @@ def _days_since(iso: str) -> float:
# cmd = was zu tun ist, wenn fällig
CHECKS = [
{
"key": "pbreak_accuracy",
"title": "P(break)-Prognose-Genauigkeit auswerten",
"why": "Seit 2026-07-23 wird jede Level-Vorhersage mitgeloggt und gegen den "
"echten Ausgang geprüft. Zeigt, ob das Modell live so trifft wie im "
"Backtest (AUC 0,72) — und ob die M30-Umstellung es verbessert hat.",
"have": lambda: _q("SELECT COUNT(*) FROM pbreak_predictions WHERE outcome IS NOT NULL"),
"need": 500, "unit": "ausgewertete Vorhersagen",
"cmd": "GET /api/pbreak_accuracy?period=all · history.pbreak_accuracy()",
# ERLEDIGT 2026-07-31 (analyze_pbreak_live.py, 2275 Vorhersagen): das Modell
# hält live NICHT — AUC 0,539 statt 0,71, Kalibrierung sagt 8 % wo 39 %
# eintreten, und die Bruchrate der geschlossenen Gruppe ist bei JEDER
# Schwelle ~38 % → das Gate gatet nicht. Wiedervorlage mit HÖHERER Schwelle,
# damit ein evtl. nachtrainiertes Modell auf frischen Daten geprüft wird.
"key": "pbreak_accuracy_v2",
"title": "P(break) erneut auswerten (nach Nachtraining)",
"why": "Erste Auswertung 2026-07-31 fiel durch (AUC 0,539, Gate ohne "
"Trennschärfe). Offene Baustelle: Touch-Zahl als 5. Merkmal in "
"backtest_srclose_prob.py aufnehmen und neu fitten (live in beiden "
"Hälften +6/+4 Pp für die 2.4. Berührung, 5.+ fällt zurück). "
"Danach mit frischen Live-Daten gegenprüfen.",
"have": lambda: _q("SELECT COUNT(*) FROM pbreak_predictions "
"WHERE outcome IS NOT NULL AND ts >= strftime('%s','2026-08-01')"),
"need": 800, "unit": "Vorhersagen seit 01.08.",
"cmd": "python analyze_pbreak_live.py",
},
{
"key": "verdict_votes",