Muster-Verdict-Gewicht 1,0 -> 0,25 (5%) + Korrektur der adverse15-Anekdote

Muster-Stimme (User-Vorgabe "geben wir dem Muster doch 5%"):
_PAT_W = 0.25 statt fest 1,0; "forming" weiter die Haelfte. Empirisch gesetzt:
ueber die letzten 4.000 verdict_votes liegt die Gewichtssumme der uebrigen
Module im Median bei 4,50 -> Anteil 5,3 % (vorher 18,2 %). Muster hat in 24,7 %
der Verdicts ueberhaupt eine Richtung, max. Nadel-Verschiebung 0,053.
Reine Anzeige - der Bias steuert keine Order.

Korrektur in CLAUDE.md: Die Anekdote zum Abschalten der 15-Minuten-Regel war
falsch. "+19,28/+17,60 moeglich" und "32 EUR weiter dagegen" waren MAXIMALE
AUSLENKUNG, nicht das, was der Exit gefangen haette. Mit core/exit_model.py
nachgerechnet waere der 11:44-Trade OHNE Regel besser gewesen (-21,43 statt
-26,31) und der 20:00-Squeeze schlechter (-23,27 statt -13,77). Ueber alle 7
Bot-Trades des 31.07. haette das Abschalten -16,42 EUR gekostet.
Die Entscheidung bleibt richtig - sie ruht auf backtest_adverse15_squeeze.py
(16/16 Kombinationen in beiden Haelften negativ), nicht auf einem Tag mit n=3.
Der Tagesgewinn kam aus Trail 1,5 -> 1,0 (+24,86 EUR auf denselben Trades).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-01 17:42:25 +02:00
co-authored by Claude Opus 5
parent 7d68dfc4db
commit d0f3b78796
2 changed files with 42 additions and 9 deletions
+22 -5
View File
@@ -72,6 +72,11 @@ _MIN_CONF_DISPLAY = 70 # Konfidenz-Schwelle für die "Order ohne Sign
# Trader beheimatet, hier als eigener Wert erhalten)
_BERLIN = ZoneInfo("Europe/Berlin")
_OB_IMB_MIN = 0.30 # Orderbuch-Imbalance darunter = zu schwach fuer eine Stimme
_PAT_W = 0.25 # Verdict-Gewicht der Chartmuster-Stimme (bestaetigt; `forming`
# zaehlt halb). User-Vorgabe 2026-08-01 „5 %" — empirisch aus den
# letzten 4.000 `verdict_votes`: Median der uebrigen Gewichte 4,50
# → 0,25/(4,50+0,25) = 5,3 % Anteil an der Bias-Nadel (vorher 1,0
# = 18,2 %). Begruendung + Beleglage bei der Stimme in `_verdict`.
_SQUEEZE_NIGHT = (0, 1, 2, 3, 4, 5, 6, 7) # Auto-Squeeze-Nacht-Sperre (Kostenfalle)
_SQUEEZE_SR_COOLDOWN_S = 180.0 # nach S/R-Close kein Auto-Squeeze in GLEICHER Richtung
# (sonst Close-„Level hält" vs. Entry-„Level bricht"-
@@ -2538,10 +2543,22 @@ class TradingEngine:
# BEIDEN Hälften positiven, aber kleinen Zusatz über einen GENERISCHEN
# Breakout hinaus liefern — Muster ØR +0,206/+0,328 vs. beliebiger Swing-Bruch
# +0,184/+0,220 (Delta nur +0,022 in H1, +0,108 in H2). Der Löwenanteil des
# Ertrags kommt also vom Breakout+Trailing, nicht vom Muster. Deshalb 1,0
# (wie Elliott/KI) statt 2,0 (Squeeze) — und `forming` zählt nur halb, weil
# das Muster dort noch nicht bestätigt ist. Ziel-Trefferquote bleibt niedrig
# (2326 %), die Stimme sagt also „Richtungstendenz", nicht „Kursziel".
# Ertrags kommt also vom Breakout+Trailing, nicht vom Muster. `forming` zählt
# nur halb, weil das Muster dort noch nicht bestätigt ist. Ziel-Trefferquote
# bleibt niedrig (2326 %), die Stimme sagt also „Richtungstendenz", nicht
# „Kursziel".
# ⚠ ABGESENKT 1,0 → `_PAT_W`=0,25 (User-Vorgabe 2026-08-01 „geben wir dem
# Muster doch 5 %"). Anlass war die Nachmessung der 2026-07-31 ergänzten
# Handbuch-Muster: von den 8 gemessenen Alt-Typen schlägt nur `cup` die
# Kontrolle, und unter 6 neu getesteten Typen war `wedge_rise` der einzige
# Treffer — bei 6 Vergleichen ist das gut mit Zufall vereinbar. Empfehlung war
# Gewicht 0 (reine Anzeige); der User wollte die Stimme behalten, aber klein.
# 0,25 ist EMPIRISCH gesetzt, nicht geraten: über die letzten 4.000
# `verdict_votes` liegt die Gewichtssumme der übrigen Module im Median bei
# 4,50 → Anteil 0,25/(4,50+0,25) = **5,3 %** (die alten 1,0 waren 18,2 %).
# Ändert sich das Modul-Gefüge, mit derselben Rechnung nachziehen.
# REINE ANZEIGE — der Bias steuert keine Order (die hängt an der Wellen-
# Headline); die Stimme wird in `verdict_votes` weiter mitgeloggt.
pv, pdet, pw = 0, "", 0.0
try:
_pats = (snap_parts_patterns or {}).get("patterns") or []
@@ -2560,7 +2577,7 @@ class TradingEngine:
if _p0:
pv = 1 if _p0["dir"] == "bull" else -1
_conf = _p0.get("status") == "confirmed"
pw = 1.0 if _conf else 0.5
pw = _PAT_W if _conf else _PAT_W / 2
pdet = f"{_p0.get('name', '')} · {'bestätigt' if _conf else 'bildet sich'}"
except Exception:
pass