Modulo 04 / 06
Backtesting
Prima di rischiare denaro reale è bene simulare la strategia scelta su dati storici. Il backtesting misura performance, rischio e robustezza, serve per eliminare le strategie perdenti prima di andare live.
Cos'e il backtesting
Il backtesting risponde a: “Se avessi usato questa strategia negli ultimi N anni, quanto avrei guadagnato o perso?” Non garantisce performance future, ma elimina strategie palesemente non profittevoli prima di aprire un conto reale.
Rendimento totale, CAGR, Sharpe ratio, win rate, massimo drawdown, profit factor. Ogni metrica racconta un aspetto diverso della robustezza della strategia.
Slippage reale, impatto di mercato, liquidità in stress, regime change. Un backtest ottimista non implica profitti futuri. La robustezza si misura out-of-sample.
Ottimizzare una strategia su dati storici finché appare perfetta è il modo piu rapido per perdere soldi live. Usa sempre un test set separato che non tocchi durante lo sviluppo.
Motore di backtesting in puro pandas
Prima delle librerie, costruiamo un motore minimale. Strategia: SMA Crossover — compra quando SMA20 > SMA50, esci quando si inverte.
Le tre metriche chiave
Penalizza la variabilita.
Quando PF>1 è profittevole,
se PF=2, i guadagni sono il doppio delle perdite.
Backtrader — il framework event-driven
Backtrader è un framework Python ricco di funzionalità per il backtesting e il trading che permette di concentrarsi sulla scrittura di strategie di trading, indicatori e analizzatori riutilizzabili. Invece di dover dedicare tempo alla creazione di infrastrutture, gestisce automaticamente esecuzione ordini, commissioni, sizing e analizzatori statistici. Perfetto per strategie multi-asset e sistemi complessi.
Le insidie più comuni
| Insidia | Descrizione | Rimedio |
|---|---|---|
| Look-ahead bias | Usare dati futuri per segnali passati (stesso giorno del Close) | Usa sempre signal.shift(1) |
| Survivorship bias | Testare solo su azioni ancora quotate, ignorando i fallimenti | Dataset point-in-time o indici storici completi |
| Overfitting | Ottimizzare parametri fino alla perfezione sul train set | Walk-forward, out-of-sample rigoroso |
| Slippage ignorato | Assumere esecuzione esatta al prezzo di segnale | Aggiungi 0.05–0.1% per trade |
| Costi non inclusi | Non considerare commissioni, spread, tasse | cerebro.broker.setcommission(0.001) |
Calcolare la SMA e applicare il segnale allo stesso giorno è un errore fatale: sai il valore della SMA solo a fine giornata, quindi il trade avviene al piu presto il giorno dopo. Usa .shift() — sempre.
Walk-Forward Optimization
La walk-forward divide il dataset in finestre consecutive: su ciascun periodo (in-sample) si ottimizzano i parametri valutando out-of-sample. È il metodo più robusto per testare la stabilità nel tempo.
Diventa più robusto aggiungendo altre metriche, un filtro di selezione più robusto e con valutazione della stabilità dei parametri.
Usando il motore pandas, implementa una strategia RSI: compra quando RSI(14) scende sotto 30, esci quando supera 70. Confronta con buy&hold su AAPL, MSFT, SPY negli ultimi 5 anni.
- Calcola Sharpe, max drawdown, profit factor per ciascun ticker
- Prova periodi RSI 7, 14, 21 — quale da il miglior Sharpe out-of-sample?
- Aggiungi 0.1% di costo per trade e osserva l'impatto sulle metriche
- Bonus: usa backtrader con
addanalyzerper ottenere le stesse metriche