| 

Predire il DrawDown – Un Modello di Machine Learning per Misurare il Rischio (Parte 4)

In questa quarta parte, utilizzeremo il nostro modello per predire il massimo drawdown e trarremo le conclusioni finali.

In questo blog pubblico un articolo che ho scritto per partecipare al concorso “SIAT Technical Analyst of the Year 2021“. Vista la lunghezza e la quantità degli argomenti trattati, ho ritenuto utile dividerlo in quattro parti. In questa quarta parte, utilizzeremo il nostro modello per predire il massimo drawdown e trarremo le conclusioni finali.

Addestramento, Convalida e Test

Conclusa la parte di raccolta e preparazione dei dati e la scelta dell’algoritmo di Machine Learning, il passaggio successivo riguarda la creazione del modello predittivo. Un inconveniente tipico del Machine Learning è di incappare in una situazione di overfitting. È un problema ben noto agli analisti quantitativi che richiede un processo di convalida, come per esempio con campionamenti Out-of-Sample e In-Sample, oppure con metodi di Walk Forward Analysis.

Per i modelli di Machine Learning, il processo si divide in due fasi principali:

  • Il dataset a disposizione è diviso in due parti, una è utilizzata per addestrare l’algoritmo di Machine Learning, il quale restituisce il modello predittivo, l’altra è utilizzata per valutare le performance del modello;
  • Se il modello supera la valutazione, questo viene addestrato nuovamente su tutto il dataset e le sue predizioni sono testate con un nuovo dataset.

Alla stessa maniera degli algoritmi di trading, è un errore usare lo stesso dataset sia per addestrare sia per convalidare il modello, in quanto se il modello cade in un overfitting, significa che ha imparato a memoria tutto il dataset e le predizioni dello stesso dataset saranno indubbiamente esatte, ma se il modello incontra dei nuovi dati che non ha mai visto prima, fallirà nella sua predizione. Una pratica comune quando si effettua un addestramento, è di procedere con una validazione incrociata: il dataset è diviso in k dataset più piccoli, chiamati fold o partizioni; si addestrano altrettanti k modelli, ognuno su k-1 partizioni e validato sulla partizione rimanente; le prestazioni di predizione dei k modelli sono confrontate tra loro. La figura 12 mostra lo schema delle due fasi di convalida e di test applicate al nostro progetto. Il dataset dei dati sintetici è diviso in tre partizioni, si addestrano tre modelli incrociando le partizioni usate per l’addestramento e quella per la convalida. Ognuno dei tre modelli è addestrato su un set di dati diverso e successivamente si provano le capacità predittive usando dei dati che non ha ancora visto. Questo metodo può essere costoso da un punto di vista computazionale, ma è una soluzione ideale per verificare le prestazioni del modello e sfruttando al massimo i dati a disposizione.

Figura 12: schema di addestramento, convalida e test

Una volta che la fase di validazione è superata e non si sono riscontrati problemi di overfitting, si passa alla creazione del modello finale. Come mostrato in figura 12, tutto il dataset dei dati sintetici è utilizzato nuovamente per l’addestramento, nella sua interezza senza partizioni così da massimizzare la resa dei dati disponibili. Il modello ottenuto sarà testato con il dataset dei dati reali, che il modello non ha mai visto. Può sembrare complesso da implementare, ma SciKit Learn gestisce tutto implicitamente con solo due righe di codice. Per i dettagli, è possibile consultare il codice in allegato.

Risultati

Con il dataset dei dati sintetici e la funzione GridSearchCV di SciKit Learn, si ottengono i risultati di convalida per tre gradi polinomiali, riepilogati in tabella 5.

Grado
Polinomiale
Punteggio
Split 1
Punteggio
Split 2
Punteggio
Split 3
Media
Punteggi
195.85%95.59%95.93%95.79%
299.94%99.94%99.94%99.94%
399.99%99.99%99.99%99.99%
Tabella 5: Risultati della convalida

Il punteggio è relativo alla funzione costo e si vede come la vicinanza all’unità significa che l’algoritmo è in grado di creare con successo un modello predittivo. Il polinomio di terzo grado è quello con la migliore prestazione, mentre il secondo grado è un ottimo compromesso tra prestazioni e semplicità.

Per la fase di test, scegliamo il terzo grado polinomiale e addestriamo nuovamente l’algoritmo con tutto il dataset sintetico per beneficiare al massimo dei dati a disposizione. Il modello finale così creato, se è alimentato con il dataset dei dati reali (tabella 2) fornisce delle predizioni dei 90MDD che, in figura 13, sono confrontate con quelli reali. I risultati sono incoraggianti, le predizioni sono attendibili e con errori mediamente del 0.2% nominale.

Figura 13: Confronto tra predizione e risultati del dataset dei dati reali

Vediamo più in dettaglio come è strutturato il modello finale e come funziona, per chiarezza illustreremo il modello con il polinomio di secondo grado. Quando si fornisce un set di dati al modello, per esempio come il dataset della tabella 2, ogni riga è ricalcolata come segue:

z1 = zµ = ( µi – µm ) / Sµ = ( µi – 2.01 · 10-4 ) / 8.92 · 10-5

z2 = zσ = ( σi – σm ) / Sσ = ( σi – 7.78 · 10-3 ) / 4.20 · 10-3

z3 = zT = ( Ti – Tm ) / ST = ( Ti – 19.6 ) / 6.94

In questo modo, i nostri dati sono standardizzati e normalizzati. Successivamente, la regressione polinomiale genera le caratteristiche aggiuntive:

z4 = zµ2 ; z5 =zµzσ ; z6 = zµzT ;
z7 = zσ2 ; z8 = zσzT ; z9 = zT2

Per concludere, la formula per predire il 90MDD è:

ŷ(β, z) = β0 + β1z1 + β2z2 + β3 z3 + β4z4 + β5z5 + β6z6 + β7z7 + β8z8 + β9z9

Dove i coefficienti (trovati durante l’addestramento) valgono:

β0 = 5.351% ; β1 = -0.099% ; β2 = 2.867% ; β3 = 1.086% ; β4 = 0.004%
β5 = -0.005% ; β6 = -0.037% ; β7 = -0.041% ; β8 = 0.609% ; β9 = -0.122%

La figura 14 mostra il peso di ogni singolo coefficiente nella predizione del 90MDD. Si noti come il contributo principale arriva dall’intercetta β0, cioè un valore costante che è comune a tutte le predizioni: si può affermare che ogni serie storica, indipendentemente dalle variabili in gioco, avrà un valore di 90MDD sempre positivo e lontano da zero. Il secondo contributo importante arriva dalla deviazione standard, maggiore è il suo valore maggiore è il 90MDD.

Figura 14: Coefficienti della Regressione Lineare

Se eliminiamo i termini con i coefficienti trascurabili, si ottiene una formula semplificata che permette di evidenziare meglio i maggiori contributi al 90MDD:

ŷ(z) = 5.351% – 0.099% · zµ + 2.867% · zσ + 1.086% · zT + 0.609% · zσzT – 0.122% · zT2

La forte dipendenza del 90MDD dalla deviazione standard era stata già dedotta nella figura 5 ed è stata correttamente utilizzata dall’algoritmo di Machine Learning in fase di addestramento. Il rendimento medio giornaliero ha un contributo negativo, mentre il periodo delle epoche contribuisce anche con i termini di secondo grado. La forte dipendenza che il MDD ha nei confronti della deviazione standard è un aspetto positivo: la deviazione standard è un parametro statistico tendenzialmente robusto, nel senso che se prendiamo dei sottoinsiemi di una serie storica e calcoliamo le deviazioni standard, troveremo dei risultati molto vicini tra loro. Questo non è vero per il rendimento, il quale è meno robusto e può variare molto all’interno di una serie storica. Questa caratteristica ci permette di essere confidenti che calcolare la deviazione standard o su tutto l’arco temporale della serie storica o solo parzialmente, ci permette di avere risultati sempre attendibili.

Le figure 15 e 16 riportano una rappresentazione della formula ŷ(β, z) nei piani del rischio-rendimento e del rischio-tempo, con le curve isometriche del 90MDD e con il dataset dei dati reali per confronto (solo nella figura 15). La verticalità delle isometriche nel piano rischio-rendimento dimostrano come la dipendenza del 90MDD verso la deviazione standard è predominante rispetto al rendimento, mentre nel piano rischio-tempo, il periodo delle epoche ha una maggiore influenza nella parte destra del grafico, dove le curve isometriche sono maggiormente inclinate, indicando come il periodo contribuisca al 90MDD soprattutto quando è amplificato dalla deviazione standard.

Figura 15: curve isometriche del 90MDD con T = 20
Figura 16: curve isometriche del 90MDD, con μ = 0.020%

Conclusioni

È difficile fare previsioni, soprattutto sul futuro” questa frase, attribuita al fisico Niels Bohr, racchiude tutte le difficoltà che ci sono nell’Analisi Tecnica dei mercati finanziari. La strada che porta a prevedere il futuro arriva dal passato: il concetto alla base è che esiste una ciclicità dei mercati e che gli avvenimenti del passato possano ripetersi nel futuro, mentre i backtest diventano lo strumento principe per studiare e analizzare le proprie strategie.

Abbiamo visto come generare un modello predittivo richieda due fasi principali, la prima è la definizione delle regole che legano gli input con gli output, la seconda è l’esecuzione di test che, con l’uso di serie storiche, permette di verificare le capacità predittive del modello. Nel paradigma tradizionale, la scelta delle regole sono sempre state una prerogativa della sensibilità e della conoscenza del trader – programmatore, mentre la macchina si occupa di testarle. Con il Machine Learning, invece, si delega alla macchina anche la scelta delle regole del modello predittivo, lasciando all’umano un ruolo di più alto livello e di supervisione del processo.

Quello che abbiamo visto in questo articolo è come sia possibile creare un modello che lega il MDD con il rendimento atteso, la volatilità e il periodo di osservazione, lasciando alla macchina tutto il lavoro, compreso quello di convalida e di test. Quanto proposto si basa su due ipotesi importanti:

  • la distribuzione dei rendimenti deve seguire un andamento “normale”;
  • media e deviazione standard della distribuzione dei rendimenti sono consistenti nel tempo.

Avere una distribuzione normale può andar bene per strumenti non derivati come indici e azioni, ma accettare un rendimento atteso consistente nel tempo restringe molto il campo di applicabilità del nostro modello. Inoltre, il mondo accademico ha già affrontato il problema di determinare la distribuzione dei MDD, allora perché dovremmo ricorrere al Machine Learning?

Il Machine Learning è estremamente flessibile, ha la capacità di imparare dal dataset che viene fornito e di costruire un modello sui dati. La chiave del successo dipende dalla qualità e dalla quantità dei dati, due proprietà garantite dalle serie storiche sintetiche:

  • Se spostiamo la nostra attenzione sulla creazione di serie storiche sintetiche più complesse, allora potremo disporre di modelli che non sono vincolati da ipotesi troppo stringenti. Per esempio, sarebbe possibile definire delle distribuzioni dei rendimenti con un certo grado di asimmetria, oppure avere una media e deviazione standard che variano nel tempo per simulare diverse situazioni di mercato, così da realizzare serie storiche sintetiche più aderenti alla realtà.
  • La mole di informazioni che è possibile generare con un dataset sintetico è sempre sufficiente per qualsiasi analisi di statistica e di Machine Learning. In questo articolo si è adottato un periodo delle epoche relativamente breve, 20 giorni, ma la facilità di utilizzo di un linguaggio di programmazione di alto livello e la buona potenza di calcolo dei personal computer permettono di realizzare migliaia di serie storiche su intervalli anche annuali e mantenendo un timeframe basso come quello giornaliero.

Per concludere, ricordiamo come il Machine Learning sia in grado di condurre anche delle analisi qualitative: nel paragrafo dei risultati abbiamo evidenziato quali siano le variabili che concorrono maggiormente alla predizione, pertanto il Machine Learning ci permette di percepire il lato più intimo del sistema e quando c’è la conoscenza, allora c’è anche la consapevolezza di come il mondo funzioni.

Allegato

Si riporta di seguito un estratto dei codici utilizzati per realizzare il modello di Machine Learning.

Importazione delle librerie:

import numpy as np
import pandas as pd
import sqlite3 as sql
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn import linear_model

caricamento del dataset dei dati sintetici, precedentemente realizzato e salvato all’interno di un database:

conn = sql.connect('Synthetic.sqlite')
cur = conn.cursor()
DATASET = pd.read_sql('SELECT media, devst, periodo, MDD FROM dataset', conn)
conn.close()

Suddivisione del dataset in una parte con i dati di ingresso e l’altra con i target:

dataset = DATASET.iloc[:,:-1].to_numpy()
target  = DATASET.iloc[:, -1].to_numpy()

Creazione e validazione del modello:

Input = [('scale', StandardScaler()),
         ('polynomial', PolynomialFeatures(degree = 2, include_bias = False)),
         ('linearregression',linear_model.LinearRegression())]
Pipe1 = Pipeline(Input)
griglia = GridSearchCV( estimator = Pipe1,
                       param_grid = {'polynomial__degree' : [1, 2, 3]},
                       cv = 3)
griglia.fit(dataset, target)
pd.DataFrame(griglia.cv_results_)

Addestramento con tutto il dataset:

Input = [('scale', StandardScaler()),
         ('polynomial', PolynomialFeatures(degree = 3, include_bias = False)),
         ('linearregression',linear_model.LinearRegression())]
Pipe2 = Pipeline(Input)
Pipe2.fit(dataset, target)

Visualizzazione dei parametri della standardizzazione (media e varianza):

print('media', Pipe2[0].mean_)
print('varianza', Pipe2[0].var_)

visualizzazione degli attributi del Linear Regressor (intercetta β0 e coefficienti βx):

print('intercept', Pipe2[2].intercept_)
print('coefficient',Pipe2[2].coef_)


Se hai domande o curiosità da chiedermi, non esitare a scrivermi nel modulo qui in basso, oppure mi trovi su Facebook e su LinkedIn. Se vuoi rimanere sempre aggiornato e non perderti nessun articolo appena esce, iscriviti alla newsletter compilando il seguente modulo:

Se apprezzi i miei articoli e il progetto MP Investit, puoi sostenermi con un contributo libero tramite PayPal o con una ricompensa del browser Brave. Questo mi motiva e mi incentiva a produrre contenuti sempre migliori. Grazie!

Articoli simili

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *