Files
PythagorasGoal/docs/diary/2026-06-19-tp01-lookahead-fix-lf.md
Adriano Dal Pastro 12754c4908 fix(TP01): bug look-ahead ffill mixed-TF -> deploy a >=12h (1d), strategia DIFENSIVA
Segnalato: ffill MIXED-TIMEFRAME su barre open-labeled (resample label="left") gonfiava il 4h
(~1.60 -> reale ~1.1). Ri-verifica per-SINGOLO-TF leak-free (guard prefix-recompute, leak=0 su
4h/6h/12h/1d): FULL Sh piatto ~1.3, hold-out 2025-26 MIGLIORE a 1d (Sh 0.31 / +3.5% vs buy&hold
-39%). Conclusione adottata: NON scendere sotto le 12h (sotto, costi+overfit dominano senza vantaggio).

- trend_portfolio.py: canonica PORT LF1d; resample_tf/resample_1d (resample_4h deprecato deploy);
  docstring con nota look-ahead + natura DIFENSIVA (taglia DD ~6x, non alpha).
- paper_trend.py: deploy a 1d (resample_1d, build_bars). 5 test passano.
- CLAUDE.md: TP01 ridescritta (>=12h/1d, gotcha ffill mixed-TF, difensiva).
- tp01_lowfreq.py + diario 2026-06-19-tp01-lookahead-fix-lf.md.
Gotcha: mai ffill/combine mixed-TF su timestamp open-labeled (close propagata indietro = leak).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 19:04:38 +00:00

2.8 KiB
Raw Permalink Blame History

2026-06-19 — TP01: look-ahead ffill mixed-TF, ri-verifica e adozione bassa frequenza (>=12h)

Segnalazione utente/agente: un look-ahead ffill MIXED-TIMEFRAME su barre open-labeled (resample(label="left")) gonfiava il 4h a Sharpe ~1.60; il risultato reale è ~1.1. Conclusione: NON scendere sotto le 12h — costi e overfitting dominano.

Cosa ho verificato (scripts/analysis/tp01_lowfreq.py)

Ricalcolo TP01 PULITO per singolo TF (barre discrete, posizione shiftata +1, NESSUN ffill/combine mixed-TF), con un guard di causalità esplicito (ricalcolo target_series su prefisso → tgt[i] invariato). Esito (fee 0.10% RT, hold-out 2025-26 bloccato):

TF leak FULL Sh FULL ret HOLD Sh HOLD ret HOLD DD
4h 0 1.36 +204% 0.27 +2.8% 8.3%
6h 0 1.42 +217% 0.21 +2.1% 7.9%
12h 0 1.32 +198% 0.22 +2.3% 8.6%
1d 0 1.30 +201% 0.31 +3.5% 7.5%
buy&hold 50/50 1d 0.92 +1671% 0.32 39% 59%

Lettura

  • Il path single-TF che ho usato in verify/stress è LEAK-FREE (guard=0 su ogni TF): il gonfiaggio 1.60 stava nel path mixed-TF ffill (ensemble/combine, es. trackE), NON nel portafoglio single-TF. Per questo il mio 4h era 1.36 (non 1.60).
  • La conclusione "≥12h" è comunque CORRETTA e la adotto: il FULL Sharpe è PIATTO ~1.3 da 12h a 4h → scendere sotto le 12h NON dà vantaggio reale, aggiunge solo costi/turnover e rischio overfit/look-ahead (lo stress mostrava il margine hold-out del 4h fragile a lag/fee). 1d è il migliore: hold-out Sharpe 0.31 (il più alto), DD 7.5%, turnover/costi minimi, leak-free.
  • Allinea anche col numero dell'agente: il "reale ~1.1" è del path mixed-TF corretto; il mio single-TF pulito dà ~1.3 FULL. In ogni caso edge difensivo modesto, non alpha.

Decisioni applicate

  • Canonica deploy → PORT LF1d (era LF4h). trend_portfolio.py: docstring aggiornata + nota look-ahead; aggiunti resample_tf/resample_1d, resample_4h marcato deprecato per il deploy.
  • Paper trader → 1d (paper_trend.py: resample_1d, build_bars, etichette 1d; gira, 5 test ok).
  • CLAUDE.md: TP01 ridescritta come DIFENSIVA, canonica ≥12h/1d, gotcha look-ahead documentato.
  • Gotcha riusabile: mai ffill/combine MIXED-TIMEFRAME su timestamp open-labeled (label="left"): la close del bar (nota solo a fine bar) verrebbe propagata indietro all'open-label → look-ahead. Il calcolo per-singolo-TF a barre discrete (posizione +1) è sicuro; il guard prefix-recompute lo prova.

Verdetto invariato

TP01 resta la prima strategia onesta del progetto: difensiva (taglia il DD ~6× vs buy&hold, hold-out 2025-26 positivo su entrambi gli asset), modesta nel ritorno. Deploy a 1d, forward-only paper trader, prima di qualsiasi capitale reale.