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:
co-authored by
Claude Opus 5
parent
1a67944842
commit
dcdd53b703
@@ -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
|
`_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
|
davor = kein Blackout, disabled) + Live-Fetch verifiziert (EIA lag korrekt auf
|
||||||
Mi 16:30 Berlin).
|
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 = angle−90` **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
|
- **Winkel-vs-EMA-Warnung (nur Konfidenz):** Regressions-Winkel der Basis-TF gegen
|
||||||
die EMA-Richtung → −10 „⚠ Winkel gegen EMA (mögliche Wende)" (nachlaufende EMA!);
|
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
|
dafür → +5. `backtest_angle.py`: dafür/neutral +0,055 vs dagegen +0,025; als Gate
|
||||||
|
|||||||
+19
-9
@@ -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.
|
# +0,025). NUR Konfidenz/Warnung — als hartes Gate senkt es den Gesamtertrag.
|
||||||
_ANGLE_LR = 14 # Regressionsfenster (= ANGLE_LR_BARS)
|
_ANGLE_LR = 14 # Regressionsfenster (= ANGLE_LR_BARS)
|
||||||
_ANGLE_DEAD = 2.0 # Totband um 90° (Grad) → darunter „neutral"
|
_ANGLE_DEAD = 2.0 # Totband um 90° (Grad) → darunter „neutral"
|
||||||
_ANGLE_BONUS = 5 # Winkel bestätigt die EMA-Richtung
|
# ⚠ Namen historisch, Bedeutung 2026-08-04 richtiggestellt (Zahlen unverändert):
|
||||||
_ANGLE_PENALTY = 10 # Winkel klar GEGEN die EMA-Richtung (mögliche Wende)
|
_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
|
# Tageszeit-Gate — REAKTIVIERT 2026-07-13 (User-OK) nach Echtkosten-Messung
|
||||||
# (`backtest_realcosts.py`, Kosten = Bar-Spread/ATR statt pauschal 0,1):
|
# (`backtest_realcosts.py`, Kosten = Bar-Spread/ATR statt pauschal 0,1):
|
||||||
@@ -819,17 +820,26 @@ class WaveRecommender:
|
|||||||
conf -= _H1_AGAINST_PEN
|
conf -= _H1_AGAINST_PEN
|
||||||
reasons.append("H1 gegen Richtung — schwächeres Setup")
|
reasons.append("H1 gegen Richtung — schwächeres Setup")
|
||||||
|
|
||||||
# ── Regressions-Winkel vs nachlaufende EMA (nur Konfidenz/Warnung) ───
|
# ── Kurzfrist-Winkel als PULLBACK-Maß (nur Konfidenz) ────────────────
|
||||||
# Steht der Winkel der Basis-TF klar GEGEN die EMA-Richtung, ist die EMA
|
# ⚠⚠ BESCHRIFTUNG KORRIGIERT 2026-08-04 — die ZAHLEN sind unverändert.
|
||||||
# evtl. am Nachlaufen (Wende) → Warnung. Backtest: Winkel-dafür trägt
|
# `calc_trend_angle` liefert 0°=AUFWÄRTS … 180°=ABWÄRTS, also ist
|
||||||
# klar besser; als Gate aber Gesamtertrag-negativ → nur Konfidenz.
|
# `ad = angle−90` NEGATIV bei steigendem Kurs. Die alten Texte
|
||||||
# (ad = angle − 90 wurde oben in der Reversal-Prüfung bereits berechnet.)
|
# („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):
|
if (d_sig > 0 and ad < -_ANGLE_DEAD) or (d_sig < 0 and ad > _ANGLE_DEAD):
|
||||||
conf -= _ANGLE_PENALTY
|
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):
|
elif (d_sig > 0 and ad > _ANGLE_DEAD) or (d_sig < 0 and ad < -_ANGLE_DEAD):
|
||||||
conf += _ANGLE_BONUS
|
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) —
|
# Hohe Vola dämpfen (oberes ATR-Terzil = schwächster/negativer Edge) —
|
||||||
# nur Konfidenz (Schwelle regime-abhängig, kein hartes Gate).
|
# nur Konfidenz (Schwelle regime-abhängig, kein hartes Gate).
|
||||||
|
|||||||
Reference in New Issue
Block a user