Kegel mit Adaptive Conformal Inference nachkalibriert (v=158)

Der Kegel war seit dem 31.07. dokumentiert 3-5 Pp ZU ENG - 80 % nominal gegen
real 76,7 / 76,6 / 75,3 % - und blieb es, weil Nachfitten das Problem nur
verschiebt. ACI justiert stattdessen ONLINE nach jedem aufgeloesten Fenster und
konvergiert nachweislich gegen die Zielabdeckung, auch unter Drift.

EHRLICH ZUR BAUART: die Lehrbuch-Form justiert alpha und schlaegt das Quantil
nach. Hier liegt nur eine feste Quantil-Tabelle vor, kein Verteilungsobjekt -
umgesetzt ist die multiplikative Variante:
    s <- s * exp(gamma * (1{verfehlt} - alpha_ziel)),  gamma 0,02, Deckel 0,7-2,0
Dieselbe Regelungsidee, aber die Konvergenz-GARANTIE der Originalform ist damit
nicht woertlich uebertragen.

Verifiziert: bei exakt 20 % Verfehlern bleibt die Skala bei 1,0000 - der
Fixpunkt stimmt. Simulation aus der dokumentierten Lage (76,6 %): nach ~50
Checks um 80 %. Die Skala pendelt um das Ziel statt exakt zu treffen - das ist
das bekannte ACI-Verhalten (garantiert ist die Langfrist-Abdeckung).

NICHT-UEBERLAPPEND geloggt (neue Tabelle cone_checks): ein 120-min-Fenster alle
5 min waere 24-fach ueberlappend - genau die Cluster-Verzerrung, an der
analyze_hl_funding.py aufgelaufen ist und die die Faelligkeitsbedingung
pbreak_accuracy_v2 um das Zehnfache danebenliegen liess. Je Horizont startet ein
neuer Check erst, wenn der vorige ablief -> 48/24/12 Checks je Tag.

Neustart-fest ueber runtime_state.json. build() ohne skalen liefert bitgenau die
alten Werte (additiv geprueft).

ZWEI EIGENE PLATZIERUNGSFEHLER, beide gefangen: der Lade-Block landete zuerst
HINTER den except-Klauseln von _load_runtime_state, wo st nicht mehr existiert;
und beim M15-Setup landete ein Block mitten in einem mehrzeiligen Aufruf. Der
erste waere stillschweigend nie gelaufen - gefunden nur, weil ich die Funktion
danach gelesen habe statt dem gruenen py_compile zu trauen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-08 23:45:26 +02:00
co-authored by Claude Opus 5
parent 86c432f791
commit b8705e297f
6 changed files with 244 additions and 11 deletions
+8 -1
View File
@@ -572,10 +572,17 @@ function renderCone(cn) {
.sort((a, b) => a.minutes - b.minutes);
if (!b80.length) { el.innerHTML = ""; return; }
const cov = b80[0].coverage != null ? `${fmt(b80[0].coverage, 0)} %` : "~";
// ⚠ ACI (2026-08-08): die Bänder waren dokumentiert 35 Pp ZU ENG (80 %
// nominal → real 76,7/76,6/75,3). Adaptive Conformal Inference justiert das
// jetzt online nach; die Skala zeigt, wie stark. 1,00 = noch unverändert.
const sk = b80.map(x => x.skala).filter(v => v != null);
const skTxt = (sk.length && sk.some(v => Math.abs(v - 1) > 0.005))
? `<span class="kx-cone-cov">ACI ×${fmt(sk.reduce((a, b) => a + b, 0) / sk.length, 2)}</span>`
: "";
el.innerHTML = `<span class="kx-cone-lbl">📐 erwartete Spanne</span>`
+ b80.map(x => `<span class="kx-cone-item"><i>${x.minutes}</i>`
+ `${fmt(x.lo, 2)}${fmt(x.hi, 2)}</span>`).join("")
+ `<span class="kx-cone-cov">trifft ${cov}</span>`;
+ `<span class="kx-cone-cov">trifft ${cov}</span>` + skTxt;
// Die Einordnung gehört an die Zahl, nicht in einen Absatz darunter — sonst
// liest jemand die Spanne als Richtungsprognose.
el.title = "STREUUNG, nicht Richtung: wie WEIT der Kurs plausibel läuft, nicht "
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="theme-color" content="#0d1117">
<title>Oil · MT5</title>
<link rel="manifest" href="manifest.json">
<link rel="stylesheet" href="style.css?v=157">
<link rel="stylesheet" href="style.css?v=158">
</head>
<body>
<!-- Modul-Menü (ganz oben) -->
@@ -347,6 +347,6 @@
</div>
<div id="toast" class="toast hidden"></div>
<script src="app.js?v=157"></script>
<script src="app.js?v=158"></script>
</body>
</html>