ef52ad6a79
src/portfolio/: Sleeve (serie rendimenti netti per-barra, causale/fee-aware) + StrategyPortfolio (combina N sleeve per peso su griglia giornaliera comune, metriche FULL/HOLD-OUT/per-anno + standalone per-sleeve, vs buy&hold). Registry sleeve attivi in sleeves.py: per ora SOLO TP01 (peso 100%); aggiungere = una riga (dopo validazione col gauntlet). Report (run_portfolio.py): TP01 FULL Sh 1.30 / DD 14.3% / ~€1.52/g, HOLD-OUT 0.31 / +3.5% (buy&hold -0.32 / -39%). Posizione corrente flat (difensivo). tests/test_portfolio.py (6 test). CLAUDE.md aggiornato (struttura + comando + come aggiungere uno sleeve). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1.9 KiB
1.9 KiB
2026-06-19 — Portafoglio di strategie estensibile (TP01 primo sleeve)
Creato un contenitore di portafoglio (src/portfolio/) con TP01 come unico sleeve attivo per ora,
progettato per aggiungerne altri (ognuno validato col gauntlet onesto).
Design
- Sleeve = una strategia validata che produce una serie di rendimenti netti per-barra
(datetime-indexed, CAUSALE, netto fee). Opzionale
pos_fnper le posizioni correnti (live). - StrategyPortfolio: porta ogni sleeve su griglia GIORNALIERA comune (compounding intra-giorno
→ mixa TF diversi in modo coerente), combina per PESO rinormalizzato sui giorni comuni
(= equal-capital-by-weight ribilanciato di continuo). Metriche FULL + HOLD-OUT 2025-26 (bloccato)
- per-anno + standalone per-sleeve, vs benchmark buy&hold 50/50.
- Estensibilità: aggiungere uno sleeve = una riga in
src/portfolio/sleeves.active_sleeves(dopo validazione: research_lab + hold-out + cross-asset + causality guard). Niente sleeve non validati.
Stato attuale (1 sleeve = TP01, peso 100%)
scripts/portfolio/run_portfolio.py:
- FULL Sharpe 1.30 / ret +201% / DD 14.3% / ~€1.52/g su 2k (n=2655 giorni 2019-2026)
- HOLD-OUT 2025-26 Sharpe 0.31 / +3.5% / DD 7.5% (buy&hold 50/50: Sharpe −0.32 / −39% / DD 59%)
- Per-anno positivo quasi ovunque (2022 −2.1%, 2026-YTD −0.7%)
- Posizione corrente: flat (TP01 in cash nel regime attuale = difensivo)
File
src/portfolio/{__init__,portfolio,sleeves}.py,scripts/portfolio/run_portfolio.py,tests/test_portfolio.py(6 test, passano). CLAUDE.md aggiornato.
Prossimo
Il portafoglio è pronto per ospitare nuovi sleeve. Candidati naturali (da validare prima): un secondo edge scorrelato a TP01 (TP01 è trend long-flat → serve qualcosa di diverso, es. una strategia che lavori quando TP01 è flat). Finché non c'è un secondo edge che regge il gauntlet, il portafoglio = TP01 difensivo. Quando arriverà, basta una riga in sleeves.py.