Considerazioni Avanzate per il Backtesting degli EA
Definizione di backtesting degli EA e cosa cambia con l’approccio “avanzato”
Il backtesting degli EA è il processo di applicazione delle regole programmate di un sistema di trading automatico ai dati di mercato storici, per stimare come si sarebbe comportato in passato. La meccanica di base è semplice: si riproducono le serie storiche dei prezzi, si applicano le logiche di entrata/uscita e si registrano i risultati. Ciò che rende “avanzate” queste considerazioni è che la riproduzione non è mai perfetta: i dati storici sono incompleti, l’esecuzione non è istantanea e costi e fattori di microstruttura di mercato possono alterare significativamente i risultati effettivi.
Un modo utile per distinguere tra meccaniche stabili e condizioni variabili è:
- Meccaniche stabili: come la logica dell’EA trasforma i segnali in ordini, come gestisce lo stato (posizioni, ordini, limiti di rischio) e come calcola gli indicatori dalla serie storica dei prezzi.
- Condizioni variabili: spread, slippage, liquidità, comportamento di esecuzione degli ordini, regole specifiche del broker, gestione dei fusi orari e regime di mercato durante il periodo storico analizzato.
A causa di questa distinzione, il backtesting avanzato riguarda principalmente la resa esplicita delle ipotesi e la verifica se le conclusioni resistono a modifiche di tali ipotesi.
Dipendenze e vincoli implementativi da considerare
Il backtesting avanzato è credibile solo nella misura in cui modellizza correttamente le dipendenze. Le principali dipendenze includono fedeltà dei dati, allineamento temporale e rappresentazione dell’esecuzione.
-
Allineamento dei dati e del tempo
I backtest richiedono barre di prezzo e/o dati tick che devono essere coerenti con la frequenza di calcolo dell’EA. Se l’EA opera su eventi a una frequenza superiore rispetto a quella supportata dal dataset, i risultati possono essere fuorvianti. Anche con le barre, è necessario chiarire in quale momento all’interno della barra l’EA prende la decisione e quando potrebbe realisticamente piazzare e riempire un ordine. Qualsiasi discrepanza crea la possibilità di errori di tipo look-ahead (utilizzo di informazioni disponibili prima del tempo in cui sarebbero effettivamente accessibili). -
Input degli indicatori e ipotesi sulla “barra corrente”
Molti EA calcolano indicatori dai punti prezzo più recenti. Se la piattaforma di backtesting adotta scelte diverse rispetto al trading reale (ad esempio, se l’ultima barra è considerata completa), i valori calcolati degli indicatori possono variare. La pratica avanzata prevede di documentare esattamente la serie di input utilizzata dalla logica dell’EA e assicurarsi che il backtest riproduca lo stesso comportamento alla chiusura della barra o all’interno della barra. -
Modellizzazione dell’esecuzione: riempimenti, latenza e costi
Un backtest che assume riempimenti perfetti senza costi sta di fatto testando un sistema diverso da quello che l’EA eseguirà in tempo reale. Le considerazioni avanzate includono:
- Spread: se il backtest utilizza uno spread fisso, una serie variabile di spread o deriva bid/ask dai prezzi medi.
- Slippage: se l’esecuzione è modellizzata come casuale entro un intervallo, nel peggiore dei casi o completamente omessa.
- Riempimenti parziali e rifiuto degli ordini: se l’EA può piazzare ordini che potrebbero non essere riempiti come previsto, e se il motore di backtest consente tali esiti.
- Tempistica degli ordini: se l’EA piazza un ordine in un determinato momento, come viene definito il prossimo prezzo disponibile?
-
Gestione dello stato e ciclo di vita degli ordini
Gli EA spesso hanno una complessità nascosta: ordini pendenti, stop trailing, posizioni multiple, regole di hedging e cancellazioni di ordini. Il backtesting deve preservare esattamente la logica del ciclo di vita degli ordini. Un errore comune è che il motore di backtest semplifichi il modello di ordine (ad esempio, riempiendo ordini stop/limit in modo diverso dal previsto), producendo risultati non replicabili nell’esecuzione reale. -
Dipendenze dai parametri e casualità
Alcune strategie dipendono da parametri che possono essere ottimizzati (ad esempio, soglie, finestre di osservazione o impostazioni di rischio). Se l’EA utilizza casualità (direttamente o attraverso comportamenti dipendenti dall’ambiente), un singolo run di backtest può essere fuorviante. Il backtesting avanzato dovrebbe chiarire se i risultati sono deterministici e, in caso contrario, se più run producono percorsi materialmente diversi.
Evidenze ed esempi: come i casi limite distorcono i risultati
Un esempio didattico di caso limite è l’allineamento temporale. Supponiamo che un EA decida sulla base di una condizione calcolata dai valori più recenti della barra. Se il motore di backtest permette all’EA di “vedere” lo stato finale di quella barra prima che sia disponibile nel trading reale, le entrate potrebbero verificarsi prima del realistico. Le performance registrate potrebbero apparire più forti della realtà perché eliminano incertezze che esisterebbero nel trading reale.
Un altro caso limite è la discrepanza nei costi. Anche se la logica di entrata è corretta, le performance possono capovolgersi quando vengono introdotti spread e slippage realistici—soprattutto per strategie con trading frequente, stop stretti o piccoli movimenti attesi. In questo scenario, le stesse regole di trading possono apparire redditizie sotto ipotesi ideali e fallire con ipotesi più realistiche.
Un terzo caso limite è la dipendenza dal regime. Le relazioni storiche possono cambiare. Un backtest che copre un solo regime di mercato (ad esempio, un ambiente tendenziale) può sovrastimare le performance in altri regimi (ad esempio, mercati volatili e laterali). Questo non è un errore di calcolo; è una limitazione di ciò che il campione storico rappresenta.
Limitazioni e rischi, inclusa una modalità di fallimento significativa
Il backtesting ha limiti ben noti che lettori esperti dovrebbero considerare come aspetti primari.
-
Overfitting e data mining
Quando i parametri sono ottimizzati su un dataset storico, il backtest può adattarsi a quel periodo invece di apprendere una regola robusta. La modalità di fallimento significativa è il “successo che non si generalizza”: le performance peggiorano su nuovi dati perché i parametri ottimizzati hanno catturato il rumore. -
Mercati non stazionari
I mercati non sono stazionari. Anche se il tuo backtest è internamente coerente, il futuro potrebbe non assomigliare al passato. Il sovraperformance storico non è prova di risultati futuri. -
Rischio del modello nelle ipotesi di esecuzione
Se riempimenti, spread, slippage e gestione degli ordini sono approssimati troppo liberamente, il backtest testa un problema alterato. Poiché molti EA sono sensibili ai tempi e ai costi di esecuzione, piccole differenze nella modellizzazione possono creare grandi differenze nei risultati. -
Survivorship e bias del campione
Se la copertura dei dati storici o le condizioni di trading differiscono da quelle che affronterai nel trading reale, il campione può essere distorto. Questo può accadere quando il dataset è troncato, mancano periodi o non riflette l’intera gamma di condizioni.
Poiché questi rischi non sono completamente eliminabili, il backtesting avanzato dovrebbe concentrarsi sulla verifica. L’obiettivo non è “dimostrare” la redditività, ma verificare la coerenza e identificare dove le conclusioni dipendono fortemente dalle ipotesi.
Come verificare autonomamente le affermazioni di backtesting e migliorare la fiducia
Anche senza dati di mercato in tempo reale o dettagli specifici del broker, puoi applicare un approccio di verifica.
- Verifica esplicitamente le ipotesi: elenca la granularità dei dati, il timing delle decisioni (chiusura barra vs. intrabarra) e le ipotesi di esecuzione/costo utilizzate nel backtest.
- Cerca la robustezza: confronta i risultati su più finestre temporali e assicurati che le performance non dipendano da un singolo periodo breve.
- Separa addestramento e valutazione: se i parametri sono stati ottimizzati, usa dati fuori campione per la valutazione invece di riutilizzare lo stesso periodo.