Winkel-Beschriftung korrigiert (Zahlen unveraendert) + Spiegeltest bestanden

Anlass: "pruefe die Logik im umgekehrten Fall, fallender Kurs".

1) Spiegeltest bestanden. Mit reversal_enabled=false ist das Verhalten ueber die
   ganze Ueberdehnungs-Spanne exakt symmetrisch (steigend/LONG <-> fallend/SHORT):
   gleiche Signale, gleiche Konfidenz, gleicher Anti-Ueberdehnungs-Schnitt bei 3,5.

2) Dabei gefunden: die Winkel-Beschriftung war ueberall invertiert.
   calc_trend_angle liefert 0 Grad = AUFWAERTS ... 180 = ABWAERTS, also ist
   ad = angle-90 NEGATIV bei steigendem Kurs. Ein LONG in einem steigenden Markt
   bekam daher "Winkel gegen EMA" (-10), ein LONG in einem fallenden
   "Winkel bestaetigt" (+5).

   ABER: backtest_angle.py benutzt DIESELBE verdrehte Beschriftung
   (a5_dis = a5 < 90-dead fuer LONG heisst "dagegen", ist aber STEIGEND).
   Der dokumentierte Befund "dafuer/neutral +0,055 vs dagegen +0,025" bedeutet
   richtig gelesen: LONG bei FALLENDEM Kurzfrist-Winkel (= Pullback) traegt
   doppelt so gut. Das ist der mehrfach belegte Pullback-Effekt.

   => Die Gewichtung war von Anfang an NUMERISCH RICHTIG. Nicht umgedreht.
   Geaendert wurden nur die Reason-Texte und Kommentare.
   Verifiziert: Konfidenzwerte vorher/nachher identisch (60/70/75 je Richtung).

Lehre: der erste Verdacht "systematisch invertierte Logik" war falsch - die
Zahlen stimmten, die Sprache log. Bei einer verdrehten Konvention erst pruefen,
ob die MESSUNG dieselbe Verdrehung teilt, bevor man den Code "repariert".
Beim Reversal war es anders: dort wies die eigenstaendige Messung das Setup
unabhaengig von der Beschriftung als negativ aus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-04 11:28:38 +02:00
co-authored by Claude Opus 5
parent 1a67944842
commit dcdd53b703
2 changed files with 45 additions and 9 deletions
+26
View File
@@ -385,6 +385,32 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
`_after_min`. Mit 4 synthetischen Szenarien getestet (5 min vor/nach Event, 50 min
davor = kein Blackout, disabled) + Live-Fetch verifiziert (EIA lag korrekt auf
Mi 16:30 Berlin).
- **⚠⚠ WINKEL-BESCHRIFTUNG WAR ÜBERALL INVERTIERT — Text korrigiert 2026-08-04, ZAHLEN
unverändert.** Beim Spiegeltest (User: „prüfe die Logik im umgekehrten Fall, fallender
Kurs") kam heraus: `calc_trend_angle` liefert **0°=AUFWÄRTS … 180°=ABWÄRTS**, also ist
`ad = angle90` **negativ bei STEIGENDEM** Kurs. Damit sagten die Texte das Gegenteil
dessen, was passierte — ein LONG in einem steigenden Markt bekam „⚠ Winkel gegen EMA"
(10), ein LONG in einem fallenden „Winkel bestätigt" (+5).
⚠ **Und `backtest_angle.py` benutzt DIESELBE verdrehte Beschriftung**
(`a5_dis = a5 < 90-dead` für LONG heißt „dagegen", ist aber STEIGEND). Der
dokumentierte Befund „Winkel dafür/neutral +0,055 vs dagegen +0,025" bedeutet richtig
gelesen: **LONG bei FALLENDEM Kurzfrist-Winkel (= Pullback) trägt doppelt so gut wie
bei bereits steigendem.** Das ist der im Projekt mehrfach belegte **Pullback-Effekt**
(vgl. „⭐ tiefer Pullback" und den RSI-Befund: *bestätigende* Oszillatoren sind
schlechter).
✅ **Konsequenz: die Gewichtung war von Anfang an NUMERISCH RICHTIG** — nur hieß der
Bonus „bestätigt", obwohl er den Gegen-Winkel belohnt. **Nicht umdrehen.** Geändert
wurden ausschließlich die Reason-Texte („⭐ Pullback (Kurzfrist-Winkel gegen den
Trend)" / „kein Pullback — Kurs läuft dem Signal schon davon") und die Kommentare.
Verifiziert: Konfidenzwerte vorher/nachher identisch (60/70/75 je Richtung).
⚠ **Lehre:** Der erste Verdacht lautete „systematisch invertierte Logik" — er war
falsch. Die Zahlen stimmten, die Sprache log. Bei einer verdrehten Konvention muss man
prüfen, ob die MESSUNG dieselbe Verdrehung teilt, bevor man den Code „repariert".
(Beim Reversal war es anders: dort hat die eigenständige Messung das Setup unabhängig
von der Beschriftung als negativ ausgewiesen.)
✅ **Spiegeltest bestanden:** Mit `reversal_enabled=false` ist das Verhalten über die
ganze Überdehnungs-Spanne **exakt symmetrisch** (steigend/LONG ↔ fallend/SHORT):
gleiche Signale, gleiche Konfidenz, gleicher Anti-Überdehnungs-Schnitt bei 3,5.
- **Winkel-vs-EMA-Warnung (nur Konfidenz):** Regressions-Winkel der Basis-TF gegen
die EMA-Richtung → 10 „⚠ Winkel gegen EMA (mögliche Wende)" (nachlaufende EMA!);
dafür → +5. `backtest_angle.py`: dafür/neutral +0,055 vs dagegen +0,025; als Gate
+19 -9
View File
@@ -94,8 +94,9 @@ _H1_AGAINST_PEN = 8 # H1 steht gegen die Richtung (M30 ok/neutral) → sc
# +0,025). NUR Konfidenz/Warnung — als hartes Gate senkt es den Gesamtertrag.
_ANGLE_LR = 14 # Regressionsfenster (= ANGLE_LR_BARS)
_ANGLE_DEAD = 2.0 # Totband um 90° (Grad) → darunter „neutral"
_ANGLE_BONUS = 5 # Winkel bestätigt die EMA-Richtung
_ANGLE_PENALTY = 10 # Winkel klar GEGEN die EMA-Richtung (mögliche Wende)
# ⚠ Namen historisch, Bedeutung 2026-08-04 richtiggestellt (Zahlen unverändert):
_ANGLE_BONUS = 5 # Kurzfrist-Winkel läuft GEGEN das Signal = PULLBACK → besser
_ANGLE_PENALTY = 10 # Kurzfrist-Winkel läuft schon MIT = kein Pullback → schlechter
# Tageszeit-Gate — REAKTIVIERT 2026-07-13 (User-OK) nach Echtkosten-Messung
# (`backtest_realcosts.py`, Kosten = Bar-Spread/ATR statt pauschal 0,1):
@@ -819,17 +820,26 @@ class WaveRecommender:
conf -= _H1_AGAINST_PEN
reasons.append("H1 gegen Richtung — schwächeres Setup")
# ── Regressions-Winkel vs nachlaufende EMA (nur Konfidenz/Warnung) ───
# Steht der Winkel der Basis-TF klar GEGEN die EMA-Richtung, ist die EMA
# evtl. am Nachlaufen (Wende) → Warnung. Backtest: Winkel-dafür trägt
# klar besser; als Gate aber Gesamtertrag-negativ → nur Konfidenz.
# (ad = angle 90 wurde oben in der Reversal-Prüfung bereits berechnet.)
# ── Kurzfrist-Winkel als PULLBACK-Maß (nur Konfidenz) ────────────────
# ⚠⚠ BESCHRIFTUNG KORRIGIERT 2026-08-04 — die ZAHLEN sind unverändert.
# `calc_trend_angle` liefert 0°=AUFWÄRTS … 180°=ABWÄRTS, also ist
# `ad = angle90` NEGATIV bei steigendem Kurs. Die alten Texte
# („Winkel bestätigt" / „⚠ Winkel gegen EMA") sagten deshalb genau das
# GEGENTEIL dessen, was hier passiert — und `backtest_angle.py` benutzt
# dieselbe verdrehte Beschriftung („Winkel klar dagegen" = `a5 < 90-dead`
# = in Wahrheit STEIGEND). Der gemessene Befund lautet richtig gelesen:
# LONG bei FALLENDEM/flachem Kurzfrist-Winkel (= Pullback) → ØR +0,055
# LONG bei bereits STEIGENDEM Winkel (kein Pullback) → ØR +0,025
# Das ist der im Projekt mehrfach belegte Pullback-Effekt (vgl. „⭐ tiefer
# Pullback" und den RSI-Befund: bestätigende Oszillatoren sind schlechter).
# Die Gewichtung war also von Anfang an numerisch RICHTIG; nur hieß der
# Bonus „bestätigt", obwohl er den Gegen-Winkel belohnt. NICHT umdrehen.
if (d_sig > 0 and ad < -_ANGLE_DEAD) or (d_sig < 0 and ad > _ANGLE_DEAD):
conf -= _ANGLE_PENALTY
reasons.append("⚠ Winkel gegen EMA (mögliche Wende)")
reasons.append("kein Pullback — Kurs läuft dem Signal schon davon")
elif (d_sig > 0 and ad > _ANGLE_DEAD) or (d_sig < 0 and ad < -_ANGLE_DEAD):
conf += _ANGLE_BONUS
reasons.append("Winkel bestätigt")
reasons.append("⭐ Pullback (Kurzfrist-Winkel gegen den Trend)")
# Hohe Vola dämpfen (oberes ATR-Terzil = schwächster/negativer Edge) —
# nur Konfidenz (Schwelle regime-abhängig, kein hartes Gate).