Bibliotheken geprueft: zwei Ertraege, keine neue Laufzeit-Abhaengigkeit
Nicht nach Katalog beantwortet, sondern gegen die dokumentierten Schwachstellen des Projekts - und beide Kandidaten wurden GEMESSEN, nicht empfohlen. ERTRAG 1 - BLOCK-BOOTSTRAP (core/stichprobe.block_ci95), braucht GAR KEINE Bibliothek. Die Luecke stand seit dem 07.08. woertlich in backtest_cost_gate: "fuer ueberlappende Beobachtungen zu optimistisch ... dafuer braeuchte es einen Block-Bootstrap". Behelf war entkoppeln(). Auf echten Daten (pbreak_predictions): naiv, alle Zeilen n=4702 Breite 0,028 <- 3x zu eng entkoppelt (bisher) n= 552 Breite 0,083 <- 88 % Datenverlust Block L=30 n=4702 Breite 0,081 <- gleiche Breite, ALLE Daten Und das Entkoppeln kostet nicht nur Genauigkeit, es VERSCHIEBT die Schaetzung (0,399 gegen 0,427) - es nimmt systematisch die ERSTE Beruehrung je Level+Stunde. KALIBRIERUNG GEMESSEN (AR(1), bekanntes Mittel, 200 Laeufe, Soll 95 %): rho naiv L=10 L=30 L=60 0,00 94 % 94 % 91 % 92 % 0,50 76 % 92 % 91 % 91 % 0,90 40 % 80 % 89 % 90 % 0,97 18 % 55 % 74 % 83 % Die naive Zeile ist der Befund: bei rho=0,97 behauptet sie 95 % Sicherheit und liegt in 18 % der Faelle richtig. Ehrlich zu den Grenzen: bei unabhaengigen Daten kostet der Block ~3 Punkte (dort bleibt ci95 besser), und bei rho=0,97 deckt auch er nur 83 % - eine Verbesserung, keine Garantie. ERTRAG 2 - hypothesis (dev-only), aufgenommen NACH einer Gegenprobe. Die Suite prueft bisher BEISPIELE, und die waehle ich selbst aus. Die teuersten Fehler sassen auf GRENZEN: room_info musste `frei` auf dem UNGERUNDETEN Abstand entscheiden, weil 0,5951 gerundet durchs 0,6-Gate rutscht. hypothesis findet genau diesen Fall (dist=0.59765625) in Sekunden. Erst danach aufgenommen. Neu tests/test_invarianten.py (4 Eigenschafts-Tests auf REINEN Funktionen), per importorskip - die Suite laeuft auch ohne. Beim ersten Lauf fielen zwei Tests, beide waren MEINE Fehler: cluster rundet auf 3 Stellen (Invariante zu streng) und zwei inhaltsgleiche dicts sind == (Reihenfolge muss ueber die Identitaet geprueft werden). Genau dafuer sind Property-Tests da. Mutationsprobe: Rundung verbogen -> 2 Tests fallen. BEGRUENDET ABGELEHNT: numba (Backtests 11 s/12k Bars = nicht der Engpass, und ein Rewrite verletzt die Bit-Gleichheits-Regel) · statsmodels/arch (jetzt 15 Zeilen stdlib mit eigener Kalibrierung) · polars/pyarrow (kein DataFrame- Workload) · loguru/structlog/rich (das Logformat ist forensisch tragend) · tenacity (Wiederholungen haben eigene Semantik, _mark_dead) · httpx (requests laeuft) · pandas_ta (Indikatoren sind validiert, ein Austausch verschoebe jede dokumentierte Zahl) · mypy (kaum Annotationen, ty deckt die Aritaet ab). requirements.txt (Laufzeit) bleibt UNVERAENDERT - auf einer frischen Maschine soll der Bot mit moeglichst kleiner Oberflaeche wieder laufen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
0386497a79
commit
3391e04f32
@@ -9184,6 +9184,79 @@ geändert — Sizing/Alarm sind User-Entscheidungen):
|
||||
nichts: die Vormerkung hängt an `_close_notify_min > 0`. **Der Bot meldet
|
||||
derzeit gar keinen Trade-Abschluss.**
|
||||
|
||||
## ⚠⚠ WEITERE PYTHON-BIBLIOTHEKEN? — ZWEI ERTRÄGE, KEINE NEUE LAUFZEIT-ABHÄNGIGKEIT (2026-08-20)
|
||||
|
||||
User-Frage. **Nicht nach Katalog beantwortet, sondern gegen die dokumentierten
|
||||
Schwachstellen des Projekts** — und die beiden Kandidaten, die durchkamen,
|
||||
wurden vorher **gemessen**, nicht empfohlen.
|
||||
|
||||
✅✅ **ERTRAG 1 — BLOCK-BOOTSTRAP (`core/stichprobe.block_ci95`), und er braucht
|
||||
GAR KEINE Bibliothek.** Die Lücke stand seit dem 07.08. wörtlich in
|
||||
`backtest_cost_gate.ci95`: *„für überlappende Beobachtungen ist er ZU
|
||||
OPTIMISTISCH … dafür bräuchte es einen Block-Bootstrap — `ci95` ist dafür NICHT
|
||||
gedacht."* Behelf war bisher `entkoppeln()`. **Auf echten Projektdaten
|
||||
(`pbreak_predictions`, Bruchrate) kostet der Behelf dramatisch:**
|
||||
| Verfahren | n | 95-%-KI | Breite |
|
||||
|---|---|---|---|
|
||||
| naiv, alle Zeilen | 4.702 | [0,413 … 0,442] | **0,028** ⚠ 3× zu eng |
|
||||
| **entkoppelt (bisheriger Weg)** | **552** | [0,357 … 0,440] | 0,083 |
|
||||
| **Block-Bootstrap L=30** | **4.702** | [0,387 … 0,469] | **0,081** |
|
||||
**Der Block-Bootstrap trifft die Breite des entkoppelten Verfahrens — behält
|
||||
aber alle 4.702 Beobachtungen statt 552 (88 % Datenverlust).**
|
||||
⚠⚠ **Und das Entkoppeln kostet nicht nur Genauigkeit, es VERSCHIEBT die
|
||||
Schätzung**: 0,399 gegen 0,427. Es nimmt systematisch die ERSTE Berührung je
|
||||
Level+Stunde — eine verzerrte Teilstichprobe, kein neutraler Ausschnitt.
|
||||
|
||||
✅ **KALIBRIERUNG GEMESSEN statt behauptet** (AR(1)-Reihen mit bekanntem Mittel,
|
||||
200 Läufe je Zelle, Soll 95 %):
|
||||
| ρ | naiv | L=10 | L=30 | L=60 |
|
||||
|---|---|---|---|---|
|
||||
| 0,00 | 94 % | 94 % | 91 % | 92 % |
|
||||
| 0,50 | **76 %** | 92 % | 91 % | 91 % |
|
||||
| 0,90 | **40 %** | 80 % | 89 % | **90 %** |
|
||||
| 0,97 | **18 %** | 55 % | 74 % | **83 %** |
|
||||
⚠⚠ Die naive Zeile ist der eigentliche Befund: bei ρ=0,97 behauptet sie 95 %
|
||||
Sicherheit und liegt in **18 %** der Fälle richtig.
|
||||
⚠ **Ehrlich zu den Grenzen:** (a) bei UNABHÄNGIGEN Daten kostet der Block ~3
|
||||
Punkte Überdeckung — dort bleibt `ci95` die bessere Wahl; (b) bei ρ=0,97 deckt
|
||||
auch er nur 83 %. **Eine Verbesserung, keine Garantie** — genau so steht es im
|
||||
Docstring.
|
||||
⚠ Blocklänge wird aus der gemessenen Lag-1-Autokorrelation gewählt (auf den
|
||||
Live-Daten: ρ=0,762 → L=95). 4 Tests, darunter die Überdeckungs-Probe.
|
||||
|
||||
✅✅ **ERTRAG 2 — `hypothesis` (dev-only), aufgenommen NACH einer Gegenprobe.**
|
||||
Die Suite prüft bisher **Beispiele**, und die wähle ich selbst aus — genau dort
|
||||
sitzt der blinde Fleck. Die teuersten Fehler des Projekts saßen auf **Grenzen**:
|
||||
`room_info` (10.08.) musste `frei` auf dem UNGERUNDETEN Abstand entscheiden,
|
||||
weil 0,5951 gerundet durchs 0,6-Gate rutscht.
|
||||
**Gegenprobe: hypothesis findet genau diesen Fall — `dist=0.59765625` — in
|
||||
Sekunden.** Erst danach aufgenommen.
|
||||
⚠ **Neu `tests/test_invarianten.py`** (4 Eigenschafts-Tests auf REINEN
|
||||
Funktionen: `sr_levels.cluster`, `stichprobe.entkoppeln`, `autokorrelation`).
|
||||
Per `importorskip` — **die Suite läuft auch ohne die Bibliothek**.
|
||||
⚠⚠ **Beim ersten Lauf fielen zwei Tests — beide waren MEINE Fehler, nicht die
|
||||
des Codes**, und das ist genau der Nutzen: (1) `cluster` rundet auf 3 Stellen
|
||||
(dokumentiert), das Ergebnis darf also 0,0005 ausserhalb der Eingabespanne
|
||||
liegen — meine Invariante war zu streng; (2) zwei inhaltsgleiche dicts sind
|
||||
`==`, meine Reihenfolge-Prüfung musste über die **Identität** laufen.
|
||||
✅ Mutationsprobe: Rundung in `sr_levels` verbogen → **2 Tests fallen**.
|
||||
|
||||
⚠⚠ **WAS BEGRÜNDET ABGELEHNT WURDE — jeweils mit Messung oder Regelbezug:**
|
||||
| Kandidat | Urteil |
|
||||
|---|---|
|
||||
| **numba** (installiert, ungenutzt) | Backtests laufen 11 s / 12k Bars — **nicht der Engpass**. Und ein Loop-Rewrite verletzt die Migrations-Regel (Bit-Gleichheit). |
|
||||
| **statsmodels / arch** | hätten HAC bzw. Block-Bootstrap — jetzt in **15 Zeilen stdlib** erledigt, mit eigener Kalibrierung. Kleinere Oberfläche schlägt fremde Abhängigkeit. |
|
||||
| **polars / pyarrow** | es gibt keinen DataFrame-Workload; die Backtests laufen auf Listen. |
|
||||
| **loguru / structlog / rich** | das Logformat ist **forensisch tragend** (18-h-Copilot-Ausfall, stille Fehlbuchung, die 269 Pending-Zeilen). Es umzustellen kostet Beweismaterial. |
|
||||
| **tenacity** | Wiederholungen haben hier eigene Semantik (`agent._mark_dead`: hart 401/402/403/404 → 30 min, Timeout/429 bewusst NICHT). |
|
||||
| **httpx** (schon da als openai-Abhängigkeit) | `requests` läuft; ein Wechsel ohne Anlass ist Bewegung ohne Ertrag. |
|
||||
| **pandas_ta** (installiert!) | alle Indikatoren sind handgeschrieben und **validiert**; ein Austausch würde jede dokumentierte Zahl verschieben. |
|
||||
| **mypy** | kaum Annotationen vorhanden; `ty` deckt seit 19.08. die Aritäts-Fälle ab. |
|
||||
|
||||
✅ **`requirements.txt` (Laufzeit) bleibt unverändert** — das war die Vorgabe an
|
||||
mich selbst: auf einer frischen Maschine soll der Bot mit möglichst kleiner
|
||||
Oberfläche wieder laufen. Ergänzt wurde ausschliesslich `requirements-dev.txt`.
|
||||
|
||||
## ⚠⚠⚠ P(break) IST LIVE **INVERTIERT** — und es steuert echtes Geld (2026-08-19)
|
||||
|
||||
Die fällige Messung ist entscheidbar geworden: **n=530 entkoppelt** gegen die
|
||||
|
||||
Reference in New Issue
Block a user