PR7: backtest panel on the dashboard #7

Merged
DasAoD merged 2 commits from feature/dashboard-backtest into main 2026-08-28 23:08:50 +02:00
Owner

Bringt den Backtest aus PR5/PR6 ins Dashboard.

Inhalt

  • backtest.load_and_run() aus cli._cmd_backtest herausgezogen: holt/cacht je Asset die nötigen Closes (Kraken oder Binance) und ruft dann run(). CLI und der neue Endpunkt teilen sich die Logik; Fortschritts-/Horizont-Hinweise gehen jetzt an einen note-Callback (CLI → stderr, API → sammelt sie in die Antwort).
  • GET /api/backtest – Query: days= oder from=/to=, timeframe=1d|1w, source=kraken|binance, refresh=. Antwort {report, notes}.
    • 422 bei fehlendem / verdrehtem Fenster, 400 bei fehlender Überlappung, 502 bei Abruf-Fehler
    • einziger nicht rein lesender API-Endpunkt: er darf OHLC von Kraken/Binance holen und in ohlcv_cache schreiben (sonst nichts). api.py-Docstring entsprechend angepasst.
  • Dashboard-Panel – Karte "Backtest": Selects für Zeitraum (1/2/5 Jahre), Kerzen und Quelle + Button. Rendert eine Tabelle Weekly DCA / DCA + Dip / Buy & Hold (eingezahlt, Endwert, PnL, PnL %, CAGR, max. Drawdown, Käufe) plus die notes als Meta-Zeile. Läuft nicht beim Seitenaufruf, nur auf Klick (Netz-/Rechen-Aktion).

Verifiziert

  • pytest → 76 passed (3 neu): /api/backtest aus vorgefülltem ohlcv_cache, fehlendes + verdrehtes Fenster; app.js verdrahtet /backtest
  • End-to-End: ohlcv_cache per CLI (backtest --days 730 --source binance) befüllt, dann serve → GET /api/backtest?days=700&source=binance liefert den Report aus dem Cache (kein Abruf), 422 für die Fehlerfälle; im Browser das Panel abgeschickt → Spinner → 3-Spalten-Tabelle korrekt gerendert (EUR-/%-Format, Vorzeichenfarben, Datums-Span)

Sicherheit

  • Endpunkt hinter derselben nginx-Basic-Auth wie der Rest; bindet weiter nur 127.0.0.1
  • kein neuer Dependency; ein kalter Mehrjahres-Lauf blockiert einen Threadpool-Worker für ein paar Sekunden (Einzelnutzer, gecacht) – in SETUP.md vermerkt

Co-authored-by: Claude claude@anthropic.com

Bringt den Backtest aus PR5/PR6 ins Dashboard. ## Inhalt - **`backtest.load_and_run()`** aus `cli._cmd_backtest` herausgezogen: holt/cacht je Asset die nötigen Closes (Kraken oder Binance) und ruft dann `run()`. CLI und der neue Endpunkt teilen sich die Logik; Fortschritts-/Horizont-Hinweise gehen jetzt an einen `note`-Callback (CLI → stderr, API → sammelt sie in die Antwort). - **`GET /api/backtest`** &ndash; Query: `days=` **oder** `from=`/`to=`, `timeframe=1d|1w`, `source=kraken|binance`, `refresh=`. Antwort `{report, notes}`. - `422` bei fehlendem / verdrehtem Fenster, `400` bei fehlender Überlappung, `502` bei Abruf-Fehler - **einziger** nicht rein lesender API-Endpunkt: er darf OHLC von Kraken/Binance holen und in `ohlcv_cache` schreiben (sonst nichts). `api.py`-Docstring entsprechend angepasst. - **Dashboard-Panel** &ndash; Karte "Backtest": Selects für Zeitraum (1/2/5 Jahre), Kerzen und Quelle + Button. Rendert eine Tabelle Weekly DCA / DCA + Dip / Buy & Hold (eingezahlt, Endwert, PnL, PnL %, CAGR, max. Drawdown, Käufe) plus die `notes` als Meta-Zeile. Läuft **nicht** beim Seitenaufruf, nur auf Klick (Netz-/Rechen-Aktion). ## Verifiziert - `pytest` &rarr; **76 passed** (3 neu): `/api/backtest` aus vorgefülltem `ohlcv_cache`, fehlendes + verdrehtes Fenster; `app.js` verdrahtet `/backtest` - End-to-End: `ohlcv_cache` per CLI (`backtest --days 730 --source binance`) befüllt, dann `serve` &rarr; `GET /api/backtest?days=700&source=binance` liefert den Report aus dem Cache (kein Abruf), `422` für die Fehlerfälle; im Browser das Panel abgeschickt &rarr; Spinner &rarr; 3-Spalten-Tabelle korrekt gerendert (EUR-/%-Format, Vorzeichenfarben, Datums-Span) ## Sicherheit - Endpunkt hinter derselben nginx-Basic-Auth wie der Rest; bindet weiter nur `127.0.0.1` - kein neuer Dependency; ein kalter Mehrjahres-Lauf blockiert einen Threadpool-Worker für ein paar Sekunden (Einzelnutzer, gecacht) &ndash; in `SETUP.md` vermerkt Co-authored-by: Claude <claude@anthropic.com>
- extract backtest.load_and_run(): fetch/cache the closes each asset needs
  (kraken or binance), then run(); CLI and the new endpoint share it, progress
  notes go to a callback instead of straight to stderr
- GET /api/backtest?days=|from=&to=&timeframe=&source=&refresh= -> {report, notes}
  (422 missing/reversed window, 400 no overlap, 502 on a fetch failure)
- the one API route that may hit an exchange and write ohlcv_cache; module
  docstring updated to say so

Co-authored-by: Claude <claude@anthropic.com>
- web/: Backtest card - period / candle / source selects + Run button, calls
  /api/backtest, renders a DCA vs DCA+dip vs buy&hold table with the run notes;
  not run on page load
- test_api.py: /api/backtest from a seeded ohlcv_cache, missing + reversed window
- test_web.py: app.js wires /backtest too
- README + SETUP: endpoint row, dashboard panel note, PR7 done

Co-authored-by: Claude <claude@anthropic.com>
DasAoD merged commit befc3ff78c into main 2026-08-28 23:08:50 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
DasAoD/krypto-dca-bot!7
No description provided.