Bug principale: in scripts/run_paper_trading.py il fetch usava
end = now.replace(minute=0,...), troncando sempre all'ora. ETH è
dichiarato timeframe=5m (commit 23b7273) ma di fatto veniva
valutato 1 volta ogni 60 min — 502 poll del run 39e027df hanno
prodotto solo 43 evaluazioni/asset, tutte a HH:00. Il commento
in load_assets segnala esplicitamente che a 1h la strategia
perde -33% su 7y: regressione vs backtest.
Fix: helper _align_end_to_timeframe(now, timeframe) snappa end
al boundary nativo dell'asset. Mappa 1m/5m/15m/30m/1h/4h/1d.
Test regression in src/strategy_crypto/tests con 9 casi.
Hardening accessorio incluso nello stesso commit:
- docker-compose.yml: state/ in RW per strategy-crypto-gui
(SQLite WAL richiede SHM writable anche da reader).
- multi_swarm_core/dashboard/nicegui_app.py: ui.timer ora
deactivate on_disconnect su 3 pagine (index/convergence/genomes)
per evitare leak di timer dopo client disconnect.
- strategy_crypto/frontend/data.py: retry 5s su sqlite.connect
per cold-start race quando GUI parte prima del paper writer.
- state/validation-hardened-001.json: output WFA tooling
multi-fold del run phase1-hardened-001.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aggiunge 2 script di analisi per validare i top-K genomi cross-fold:
- scripts/analyze_btc_winners.py: per-trade dump (wins/losses/winrate/
avg_win/avg_loss/return/maxDD/Sharpe) per ogni top-K × 4 fold
expanding-window WFA. Usato per identificare i winner robusti vs
i lucky-shot overfit.
- scripts/compare_winners.py: cross-run comparison di 5 winner
candidate (BTC 1h + ETH 1h + BTC 5m + ETH 5m) sui medesimi 4 fold,
con totali cumulativi.
Risultati WFA freezati:
- validation-btc-100-001.json: BTC 1h baseline (undertrading=10)
- validation-btc-100-001-thr3.json: BTC 1h con threshold=3 (rilassato
per strategie ultra-selettive)
- validation-btc-100-5m-thr3.json: BTC 5m con threshold=3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>