Nel corso degli anni, sia in seminari free che corsi e libri, ho spiegato spesso il rischio dell’overfitting (iper ottimizzazione a posteriori) dei parametri di un trading system. Si tratta del rischio più grosso che corre uno sviluppatore di trading system che ottimizza i parametri al punto da ottenere un trading system con un’equity line pazzesca, che sale come un righello, quasi senza perdite, ma poi in real time non performerà.
Esistono altri rischi analoghi nello sviluppo di un trading system che non vanno sottovalutati (e su cui occorre sensibilità ed esperienza per evitarli): uno di questi è l’overfitting di portafoglio.
Prendiamo ad esempio un semplice trading system basato sulle bande di Bollinger (variante di un trading system denominato M3 contenuto nel mio primo libro sul tema edito nel 2004).
Applichiamo il trading system ai dati daily del FTSEMIB italiano e facciamo finta di andare indietro, con la macchina del tempo di “Ritorno al futuro” al 2007.
Testiamo il trading system, che descriviamo in fondo, sulle azioni più liquide di allora e selezioniamo solo le migliori 4 decidendo di fare trading con quelle che performano meglio in backtesting dal 2002 fino al momento in cui fingiamo di trovarci: novembre 2007.
I migliori 4 titoli sono: Atlantia, Buzzi Unicem, Saipem, Bca Pop Milano.
Cosa sarebbe successo riprendendo la macchina del tempo e tornando ad oggi, novembre 2015?
I nostri risultati sarebbero stati molto mediocri. Se contassimo anche le commissioni avremmo fatto poco più che una patta; eppure l’equity line fino al 2007 era molto regolare… I 4 titoli selezionati avrebbero fatto peggio, in termini di costanza di profitto, dei 40 titoli del paniere attuale del FTSEMIB40.

Curva dei profitti dei migliori 4 titoli fino ad oggi. Si nota un forte decadimento negli ultimi anni con una curva molto piatta
Quello che abbiamo fatto è stato overfittare il portafoglio; selezionando i sistemi con la logica dei best performer non è detto che quei titoli continueranno a muoversi negli anni successivi con la stessa dinamica, (ricordate che spesso i titoli possono anche essere delistati…). Il rischio overfitting sui parametri del sistema e del suo possibile decadimento si sommano quindi al rischio decadimento per overfitting di portafoglio.
Il trading system M3, pur non essendo certamente qualcosa di sofisticato, è però utile a livello didattico per spiegare quanto può avvenire anche con modelli più evoluti e professionali se non si diversifica opportunamente, se non si hanno strategie robuste e se non si adottano le opportune modalità di testing per limitare i rischi di overfitting.

Equity line del modello M3 su 40 titoli del FTSEMIB ad oggi. L’ultimo picco è più recente rispetto ai migliori 4 titoli fino al 2007.
Il listato è in Power Language.
[LegacyColorValue = TRUE];
{**************-M_Boll_3-*********
di Enrico Malverti
Operatività: Overnight
copyright 2004
***********************}
{Dichiarazione delle variabili e degli input}
Inputs: Length(25), StdDevUp(2.1), StdDevDn(-2.1), ST1(0.98), ST2(0.97), ST3(1.02), ST4(1.03), NumDays(10);
Vars: UpBand(0), DnBand(0), MP(0), EP(0), NewST(0);
{Assegnamento delle variabili}
MP = Marketposition;
Condition1 = (H = Highest(H, NumDays));
Condition2 = (L = Lowest(L, NumDays));
UpBand = BollingerBand(C, Length, StdDevUp);
DnBand = BollingerBand(C, Length, StdDevDn);
EP = EntryPrice;
{Enter Long}
If MP = 0
//and MRO(Condition1, 10, 1) <> -1
and C > average(C, 200)
and
C > UpBand Then Buy (“BE”) next bar at Market;
{Enter Short}
//If MP = 0 and MRO(Condition2, 10, 1) <> -1 and C < DnBand Then sellshort (“SE”) next bar at Market;
{**************-Trail su High/Low data2-*************}
{If MP = 1 Then sell (“TR-L”) next bar at (Lowest(L, 2)) of data2 -1 Point Stop;
If MP = -1 Then buytocover (“TR-S”) next bar at (Highest(H, 2)) of data2 +1 Point Stop;}
setpercenttrailing(550, 33);
{*****************-Stop con bassa volatilità-************}
If range <= AvgTrueRange(14) Then Begin
If MP = 1 Then sell (“SL-L1”) next bar at (EP*ST1) Stop;
If MP = -1 Then buytocover (“SL-S1”) next bar at (EP*ST3) Stop;
End;
{*****************-Stop con alta volatilità-*************}
If range > AvgTrueRange(14) Then Begin
If MP = 1 Then sell (“SL-L2”) next bar at (EP*ST2) Stop;
If MP = -1 Then buytocover (“SL-S2”) next bar at (EP*ST4) Stop;
End;
Grazie per l’articolo!
Ho provato a compilarlo ma se provo ad utilizzare anche la parte:
{If MP = 1 Then sell (“TR-L”) next bar at (Lowest(L, 2)) of data2 -1 Point Stop;
If MP = -1 Then buytocover (“TR-S”) next bar at (Highest(H, 2)) of data2 +1 Point Stop;}
…il sistema mi dice STUDY IS MISSING DATA 2
Grazie
Ciao Riccardo,
Premesso che non utilizzo Multicharts (cosa che spero di fare quanto prima), credo che il Data1 è il 1°grafico/flusso di dati su cui stai facendo girare il TS (esempio a 30 min), mentre il Data2 è il 2° grafico/flusso di dati impostato su un altro timeframe (esempio 60 min)…..dovresti capire:
* da questo articolo: http://www.enricomalverti.com/2015/07/697/
* da questo video: https://www.youtube.com/watch?v=0RKNqiOlj84 (dal minuti 14 in poi)
Nella speranza di essere stato utile ed esaustivo porgo
Cordiali saluti
Nella sintassi Easy Language e Power Language data2 e un secondo time frame che viene impostato sotto alla prima chart. si utilizza nei sistemi multitime frame che effettuano alcuni dati ad esempio su un 60 minuti e poi mettono i segnali sul 5 minuti. Quindi se si vuole sgraffettare quella parte va inserito nella chart da insert symbol un secondo time frame.
Buongiorno Enrico,
Quindi qual’è la soluzione migliore all’Overfitting, quali sono i parametri da pendere in considerazione,
Grazie e buon lavoro
Tema dibattuto lungamente ai miei corsi e inserito anche nei miei libri. Sicuramente non mancherà occasione di parlarne un po’ anche free sul sito. Il materiale didattico per chi ha voglia di approfondire non manca.