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.

equit is

Curva dei profitti sui migliori 4 titoli fino a novembre 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

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.

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;