P(break) Niveau-Reparatur gemessen: beide Varianten fallen durch
Folgeauftrag zur B4-Pruefung. Hypothese war: das Modell rankt brauchbar, nur
sein Niveau haengt an einer wandernden Basisrate. Geprueft wurden ein
Regime-Merkmal (ATR/gleitender Median) und ein laufend nachgefuehrter
Achsenabschnitt, Regel vorab fixiert.
collect() in backtest_pbreak_retrain.py hat dafuer einen ADDITIVEN
REG-Parameter bekommen (Default None), Ausgabe ohne ihn bitgenau geprueft
(4371 Zeilen, 0 Abweichungen).
Auf Backtest-Daten besteht die Roll-Achse (Kalib 2,61->1,95 und 10,51->3,25 Pp,
AUC leicht besser), das Regime-Merkmal faellt durch (H2->H1 schlechter).
Auf LIVE-Daten (n=921 ab 01.08.) faellt auch die Roll-Achse durch: Kalib
14,16 -> 10,64 Pp (also nicht repariert), AUC 0,531 -> 0,516 (ueber der
Toleranz), und der Nachbar n=800 kippt auf 15,14 Pp = schlechter als der
Ausgangswert.
Grund: die oberste Klasse bleibt INVERTIERT (69 % vorhergesagt, 17,2 % real).
Eine Niveau-Verschiebung kann eine invertierte Klasse nicht reparieren. Die
Ausgangshypothese ist damit widerlegt.
Drei Erklaerungen fuer die Basisraten-Luecke geprueft, alle widerlegt:
Sammelart (live 1x je Beruehrung vs Backtest jeder Bar): -1,7 Pp, falsche
Richtung
Vola-Regime: Bruchrate ueber 5 Quintile flach (37,0 bis 39,2 %)
aktuelles Regime ungewoehnlich: letzte 7 Tage Median 0,96 = normal
Der flache Vola-Befund erklaert zugleich, warum das Regime-Merkmal nichts
bringt.
Kontrolle: das Modell VOR dem 31.07. hat auf diesen Daten AUC 0,364/0,406 -
unter 0,5, also invertiert. Reproduziert exakt den Grund fuer das
Nachtrainieren.
Nichts gebaut. Naechster Schritt ist kein drittes Fitten, sondern die einzige
ungeprueft gebliebene Divergenz: die Level-Auswahl selbst (Backtest baut sie
mit pick_level/_cluster nach, live entscheidet _draw_levels).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
908e20a9d0
commit
2e89724368
@@ -150,8 +150,13 @@ def outcome(H, L, level, atr, j, d):
|
||||
return 0
|
||||
|
||||
|
||||
def collect(a, b, H, L, C, EF, ES, AT, LV):
|
||||
"""Live-spiegelnde Stichprobe: jeder Bar im 0,15×ATR-Band um das dyn. Level."""
|
||||
def collect(a, b, H, L, C, EF, ES, AT, LV, REG=None):
|
||||
"""Live-spiegelnde Stichprobe: jeder Bar im 0,15×ATR-Band um das dyn. Level.
|
||||
|
||||
⚠ `REG` ist ADDITIV (2026-08-07, für `backtest_pbreak_regime.py`): wird eine
|
||||
Regime-Reihe übergeben, bekommt jede Zeile zusätzlich `"reg"`. OHNE das
|
||||
Argument ist die Ausgabe **bitgenau wie vorher** — die dokumentierten Zahlen
|
||||
dieses Skripts dürfen sich nicht verschieben (Migrations-Regel)."""
|
||||
TH = _REVERSAL_STRETCH
|
||||
out = []
|
||||
i = max(a, _N_BARS, 320)
|
||||
@@ -201,9 +206,12 @@ def collect(a, b, H, L, C, EF, ES, AT, LV):
|
||||
(C[j] - C[max(0, j - 3)]) * d / aj,
|
||||
1.0 if (EF[j] - ES[j]) * d > 0 else 0.0,
|
||||
abs(level - entry) / aj]
|
||||
out.append({"feat": feat, "y": y, "tc": tc,
|
||||
"feat5": feat + [1.0 if 2 <= tc <= 4 else 0.0,
|
||||
1.0 if tc >= 5 else 0.0]})
|
||||
zeile = {"feat": feat, "y": y, "tc": tc,
|
||||
"feat5": feat + [1.0 if 2 <= tc <= 4 else 0.0,
|
||||
1.0 if tc >= 5 else 0.0]}
|
||||
if REG is not None:
|
||||
zeile["reg"] = REG[min(j, len(REG) - 1)]
|
||||
out.append(zeile)
|
||||
i += 12 # nächste „Position" versetzt starten (weniger Überlappung)
|
||||
return out
|
||||
|
||||
|
||||
Reference in New Issue
Block a user