Der Engpass war nie die Mathematik: quadratische Schleife, ~9 min -> 8,9 s
Anlass war die Frage nach numpy. Statt zu vermuten wurde profiliert — und das
Ergebnis war ein anderes als erwartet: von 10,07 s Gesamtlaufzeit steckten
8,17 s in der EIGENZEIT der Backtest-Schleife, nur 0,44 s in _build.
Ursache:
[C[j] for j in PH if i - _PIV_LOOK <= j <= i - _PIV_K] # je BAR, ganze Liste
Das ist O(Bars x Pivots) — bei 80k Bars hunderte Millionen Vergleiche, und
genau daher kamen die 9-20-Minuten-Laeufe. PH/PL sind sortiert, also genuegen
zwei Binaersuchen fuer dieselbe Menge in O(log n).
Gemessen: backtest_signal_touchfill.py ueber 80k Bars von ~9 min auf 8,9 s
(~60x), bei 8k Bars 10,07 s -> 1,43 s. Das Ergebnis bleibt inhaltlich
identisch (alle sechs Felder negativ); die Handvoll Trades Unterschied ist die
bekannte Live-Bar-Drift, nicht der Umbau.
MIGRATIONS-REGEL ERNST GENOMMEN: ein Vorher/Nachher-Vergleich zweier LAEUFE
taugt hier nicht, weil copy_rates_from_pos am neuesten Bar ankert und
eintreffende Live-Bars das Fenster verschieben. Die Gleichheit wird deshalb
DIREKT auf der Datenstruktur bewiesen — tests/test_pivotfenster.py mit vier
Faellen: 4.000 Bars x 400 Pivots, Randfaelle, leere Liste, beidseitig
inklusive Grenzen.
Angewandt auf 7 Skripte (auto_signal_v3, breakout_gated, dist_gated, htf_vola,
metalabel, sl_width, trail_be) — mechanisch identische Transformation, alle
kompilieren, Stichprobe gegengelaufen (dist_gated 20k in 1,1 s).
Lehre: die naheliegende Antwort (numpy) war die falsche. Ein Profil kostet zwei
Minuten und haette diese Bremse jederzeit gezeigt — sie lag seit Monaten in
jedem gegateten Backtest.
17 Tests gruen, n-Falle-Scan sauber.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9887e3d5da
commit
cddcefa463
@@ -259,7 +259,33 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
||||
Anteil, WR-Verfall, PF<1, Einzelverlust). **Wöchentlich** laufen lassen (B4/B5).
|
||||
- **Vor „fertig":** immer `python -m py_compile <datei>`; JS grob via Klammern-
|
||||
Balance prüfen (kein node im Env).
|
||||
- **⚠⚠ TEST-SUITE (`pytest`, `tests/`, seit 2026-08-07) — 13 Tests, ~1 s.**
|
||||
- **⚠⚠ DER ENGPASS DES PROJEKTS WAR NIE DIE MATHEMATIK — er war eine
|
||||
quadratische Schleife (Profil 2026-08-07, ~9 min → 8,9 s).** Anlass war die
|
||||
Frage nach numpy. Statt zu vermuten wurde profiliert, und das Ergebnis war ein
|
||||
anderes als erwartet: von 10,07 s Gesamtlaufzeit steckten **8,17 s in der
|
||||
EIGENZEIT der Backtest-Schleife**, nur 0,44 s in `_build`. Ursache:
|
||||
```python
|
||||
[C[j] for j in PH if i - _PIV_LOOK <= j <= i - _PIV_K] # je BAR, ganze Liste
|
||||
```
|
||||
Das ist **O(Bars × Pivots)** — bei 80k Bars hunderte Millionen Vergleiche, und
|
||||
genau daher kamen die 9–20-Minuten-Läufe. PH/PL sind **sortiert**, also genügen
|
||||
zwei Binärsuchen (`bisect_left`/`bisect_right`) für **dieselbe Menge** in
|
||||
O(log n).
|
||||
**Gemessen: `backtest_signal_touchfill.py` über 80k Bars von ~9 min auf 8,9 s**
|
||||
(~60×), bei 8k Bars 10,07 s → 1,43 s.
|
||||
⚠⚠ **Die Migrations-Regel verlangt Bit-Gleichheit — und ein Vorher/Nachher-
|
||||
Vergleich zweier LÄUFE taugt dafür NICHT**: `copy_rates_from_pos` ankert am
|
||||
neuesten Bar, zwischenzeitlich eintreffende Live-Bars verschieben das Fenster
|
||||
(real ein Trade Unterschied, s. 06.08.). Die Gleichheit wird deshalb **direkt
|
||||
auf der Datenstruktur** bewiesen — `tests/test_pivotfenster.py` (4 Tests:
|
||||
4.000 Bars × 400 Pivots, Randfälle, leere Liste, beidseitig inklusive Grenzen).
|
||||
✅ Angewandt auf **7 Skripte** (`auto_signal_v3`, `breakout_gated`,
|
||||
`dist_gated`, `htf_vola`, `metalabel`, `sl_width`, `trail_be`) — mechanisch
|
||||
identische Transformation, alle kompilieren, Stichprobe gegengelaufen.
|
||||
⚠ **Lehre:** die naheliegende Antwort („numpy") war die falsche. Ein Profil
|
||||
kostet zwei Minuten und hätte diese Bremse jederzeit gezeigt — sie lag seit
|
||||
Monaten in jedem gegateten Backtest.
|
||||
- **⚠⚠ TEST-SUITE (`pytest`, `tests/`, seit 2026-08-07) — 17 Tests, ~1 s.**
|
||||
Im Projekt sind über Monate **dutzende Szenario-Tests** entstanden („mit 10
|
||||
Szenarien getestet", „mit 18 synthetischen Szenarien"), alle als
|
||||
Wegwerf-Skripte. **Keiner davon lief je ein zweites Mal.** Bei einem System, das
|
||||
|
||||
Reference in New Issue
Block a user