Il Processo di Previsione
In questa serie di articoli voglio descrivere un processo statisticamente robusto per la previsione delle serie temporali finanziarie. Queste previsioni formeranno la base per un gruppo di strategie di trading automatico. Il primo articolo della serie discuterà l’approccio alla modellazione e un gruppo di algoritmi di classificazione che ci consentiranno di prevedere la direzione del mercato.
All’interno di questi articoli faremo uso di scikit-learn, una libreria di apprendimento automatico per Python. Scikit-learn contiene l’implementazione di molte tecniche di machine learning. Questo non solo ci fa risparmiare molto tempo, ma minimizza il rischio di bug introdotti dal nostro codice e consente ulteriori verifiche con le librerie scritte in altri linguaggi, come R. Questo offre un buon grado di affidabilità per di creare la nostra implementazione personalizzata (se per esempio abbiamo bisogno di maggiore velocità di esecuzione).
Tecniche di Apprendimento Supervisionato
Misurare l'Accuratezza della Previsione
La particolare classe di metodi a cui siamo interessati riguarda la classificazione binaria. Cioè, tenteremo di classificare il rendimento percentuale di un particolare giorno in due insiemi: “Up” o “Down”. In un sistema reale di previsione l’interesse è rivolto verso l’entità di questa previsione e alle deviazioni della previsione dal valore effettivo.
In tali casi, possiamo utilizzare Mean-Squared Error, Mean Absolute Deviation e Root-Mean-Squared Error per fornire una stima della precisione della previsione. La letteratura fornisce numerosi altri esempi di metodi per misurare di accuratezza della previsione.
In questo articolo ci focalizziamo solamente su due misure: l’Hit-Rate, cioè la percentuale di volte in cui il forecaster ha ottenuto una previsione accurata, e la Confusion Matrix (una matrice di confusione, detta anche tabella di errata classificazione), per determinare le prestazioni di predizione. Inoltre, si calcolano i valori sopra menzionati e si incorporano nel processo di ricerca dei segnali.
Hit Rate
La domanda più semplice che potremmo chiedere al nostro classificatore supervisionato è “Quante volte abbiamo previsto la direzione corretta, come percentuale di tutte le previsioni? “.Questo motiva la definizione di un tasso di successo dell’allenamento, dato dalla seguente formula:
\(\frac{1}{n} \sum_{i=1}^{n} I(y_i = \hat{y_i})\)
Dove yi è la previsione (UP o DOWN) per il periodo di tempo i (ad esempio un giorno) utilizzando un particolare classificatore. \(I(y_i = \hat{y_i})\) è la funzione indicatore ed è uguale a 1 se \(y_i = \hat{y_i}\) e 0 se \(y_i \neq \hat{y_i}\).
Quindi l’Hit Rate fornisce un valore percentuale sul numero di volte in cui un classificatore ha correttamente previsto la direzione verso l’alto o verso il basso. Scikit-Learn fornisce una funzione per calcolare il tasso di successo come parte del processo di classificazione / addestramento.
Confusion Matrix
La matrice di confusione (o tabella di contingenza) è il passo successivo dopo aver calcolato il tasso di successo. È motivato da domande come “Quante volte l’UP è stato previsto correttamente mentre quante volte è stato previsto correttamente il DOWN?”.
Ad esempio, potrebbe risultare che un particolare algoritmo è costantemente più accurato nel prevedere i “giorni down”. Ciò motiva una strategia che enfatizza la necessità di andare short su uno strumento al fine di aumentare il profitto.
Una matrice di confusione caratterizza questa idea determinando il tasso di falsi positivi (noto statisticamente come errore di Tipo I) e tasso di falsi negativi (noto statisticamente come errore di Tipo II) per un classificatore supervisionato. Nel caso della classificazione binaria (UP o DOWN) si ha una matrice 2×2:
\( \begin{pmatrix}U_{T}&U_{F}\\D_{F}&D_{T}\end{pmatrix} \)
Dove Ut rappresenta i periodi Up correttamente classificati, Uf rappresenta quelli erroneamente classificati (cioè classificati come down), Df rappresenta i periodi Down classificati erroneamente (cioè classificati come Up) e Dt rappresenta i periodi Down correttamente classificati.
Oltre all’Hit-Rate, Scikit-Learn fornisce un metodo per calcolare la matrice di confusione, come parte del processo di classificazione / addestramento.
Fattori di previsione
Uno degli aspetti cruciali della previsione dei prezzi degli asset è la scelta dei fattori utilizzati come predittori. Ci sono un numero impressionante di potenziali fattori da scegliere e può essere scoraggiante per una persona che non ha familiarità con le previsioni finanziarie. Tuttavia, anche le più semplici tecniche di machine learning produrranno risultati relativamente buoni se applicate con fattori scelti con cura.
La scelta dei fattori viene effettuata cercando di determinare gli aspetti fondamentali che guidano il movimento degli asset. Nel caso dello S&P500 è chiaro che i 500 titoli che lo compongono, in modo ponderato, saranno per definizione i driver fondamentali del prezzo! Chiaramente si vuole conoscere il prezzo esatto della serie S&P500 nel caso in cui si conosca il valore istantaneo dei suoi componenti, ma esiste un potere predittivo nell’usare la storia precedente dei rendimenti per ciascun costituente nel predire la stessa serie?
In alternativa, potremmo considerare i tassi di cambio con paesi che effettuano molti scambi commerciali con gli Stati Uniti come driver del prezzo? Potremmo anche prendere in considerazione fattori economici e societari più fondamentali come i tassi di interesse, l’inflazione, i profitti trimestrali. La precisione del forecaster sarà in gran parte dovuta all’abilità del modellista nel determinare i fattori giusti prima di eseguire l’adattamento del modello.
Fattori di prezzi ritardati e volumi
Il primo tipo di fattore che viene spesso preso in considerazione nella previsione delle serie temporali sono i valori storici delle stesse serie temporali. Quindi un insieme di fattori p potrebbe essere ottenuto facilmente creando p “ritardi” dei prezzi di chiusura della serie storica. Se si considera una serie temporale giornaliera, per ogni specifico giorno k, i fattori sarebbero i valori giornalieri storici nei periodi di tempo k-1, k-2, …, k-p.
Oltre alla serie di prezzi, possiamo incorporare come indicatore anche il volume degli scambit, informazione che viene fornita quando si utilizzano dati OHLCV (ad esempio, i dati acquisiti da Yahoo Finance, Google Finance o Quandl). In questo modo possiamo creare un vettore di dimensione p+1 per ogni giorno delle serie temporali, che contiene i ritardi temporali p e il volume. Questo naturalmente porta a un insieme di coppie (Xk, yk) che rappresentano il vettore dei fattori Xk di dimensione p+1 al giorno k e l’effettivo prezzo di chiusura per il giorno k, yk.
Questo è tutto ciò di cui abbiamo bisogno per iniziare un esercizio di classificazione supervisionato. Di seguito considereremo serie temporali ritardate per l’S&P500 e applicheremo più tecniche di machine learning per vedere se possiamo prevederne la direzione.
Fattori Esterni
Mentre le serie ritardate dei prezzi e le informazioni sul volume sono un buon punto di partenza per l’analisi delle serie temporali, siamo ben lungi dall’essere limitati a tali dati. Ci sono una grande quantità di serie temporali macroeconomiche e serie di prezzi degli asset da prendere in considerazione per effettuare le previsioni. Ad esempio, potremmo desiderare di fornire una previsione a lungo termine dei prezzi delle materie prime sulla base di modelli meteorologici, o accertare movimenti di direzione dei prezzi delle valute estere tramite movimenti dei tassi d’interesse internazionali.
Se tale relazione tra serie può essere accertata e dimostrata essere statisticamente significativa, allora possiamo considere il modello di trading come affidabile e robusto. Non voglio descrivere dettagliatamente tali approcci, poiché l’obbiettivo di tale articolo è introdurre la base delle tecniche di modellazione e di apprendimento automatico. È abbastanza facile formulare ipotesi sulle relazioni economiche e ottenere i dati delle serie temporali sia da un repository come Quandl, sia direttamente dai siti web delle statistiche governative.
Modelli di Classificazione
Logistic Regression
La prima tecnica che prenderemo in considerazione è la regressione logistica (LR). Nel nostro caso utilizzeremo LR per misurare la relazione tra una variabile dipendente dalla classificazione binaria (“Up” o “Down”) e più variabili continue indipendenti (i rendimenti percentuali ritardati). Il modello fornisce la probabilità che uno specifico giorno (il successivo) venga classificato come “Up” o “Down”. In questa implementazione abbiamo scelto di assegnare ogni giorno come “Up” se la probabilità supera 0,5. Potremmo fare uso di una soglia diversa, ma per semplicità ho scelto 0,5.
LR utilizza la formula logistica per modellare la probabilità di ottenere un giorno “Up” (Y = U) in base ai fattori di ritardo (L1, L2):
\(\begin{eqnarray}
p(Y=U|L_1, L_2) = \frac{e^{\beta_0 + \beta_1 L_1 + \beta_2 L_2}}{1+e^{\beta_0 + \beta_1 L_1 + \beta_2 L_2}}
\end{eqnarray}\)
La funzione logistica viene utilizzata perché fornisce una probabilità tra [0,1] per tutti i valori di L1 e L2, diversamente dalla regressione lineare in cui è possibile generare anche probabilità negative.
Per adattare il modello (cioè stimare i coefficienti βi) viene utilizzato il metodo della massima verosimiglianza. Fortunatamente per noi, l’implementazione del fitting e della predizione del modello LR è gestita dalla libreria di scikit-learn.
Discriminant Analysis
L’analisi discriminante è una tecnica statistica alternativa alla regressione logistica. Mentre la regressione logistica è meno restrittiva nelle sue assunzioni rispetto all’analisi discriminante, quest’ultima può fornire una maggiore performance predittiva se vengono soddisfatte ipotesi più restrittive.
Considereremo ora un metodo lineare e un metodo non lineare di analisi discriminante.
Analisi discriminante lineare
Nella regressione logistica si modella la probabilità di vedere un periodo di tempo “Up”, cioè modelliamo \(P(Y=U|L_1,L_2)\) come una distribuzione condizionale della risposta Y dati i predittori Li, utilizzando una funzione logistica.
Nella Linear Discriminant Analysis (LDA), dato Y, la distribuzione delle variabili Li è modellizzata separatamente, e \(P(Y=U|L_1,L_2)\) è ottenuto tramite il Teorema di Bayes.
In sostanza, la LDA deriva dal presupposto che i predittori siano ottenuti tramite distribuzione gausiana multivariata. Dopo aver calcolato le stime per i parametri di questa distribuzione, i parametri possono essere inseriti nel Teorema di Bayes per fare previsioni relative alla classe di appartenenza di un’osservazione.
Un importante assunto matematico della LDA prevede che tutte le classi (ad esempio “up” e “down”) condividono la stessa matrice di covarianza.
Non mi dilungherò sulle formule per stimare la distribuzione o le probabilità che sono necessarie per fare previsioni, ancora una volta scikit-learn lo gestisce per noi.
Analisi discriminatoria quadratica
L’analisi quadratica discriminante (QDA) è strettamente legata alla LDA. La differenza significativa è che ogni classe può possedere la propria matrice di covarianza.
Generalmente la QDA funziona meglio quando i limiti decisionali non sono lineari, mentre la LDA è migliore quando ci sono meno osservazioni di allenamento (cioè quando è necessario ridurre la varianza). La QDA, d’altra parte, si comporta bene quando il set di allenamento è grande (cioè la varianza è meno importante). L’uso dell’uno o dell’altro alla fine si riduce ad compromesso tra varianza e distorsione.
Come con la LR e la LDA, Scikit-Learn implementa anche la QDA, quindi è sufficiente fornirgli i dati di allenamento/test e la stima dei parametri.
Support Vector Machines
Per descrivere il Support Vector Machines (SVM) si consideri un classificatore che separa diverse classi attraverso un confine di separazione. Se esistesse una separazione così diretta, si può creare un classificatore supervisionato basato unicamente sulla decisione che le nuove caratteristiche si trovano al di sopra o al di sotto di questo piano di classificazione lineare. In realtà, raramente tali separazioni esistono negli scenari di trading quantitativo e come tali dobbiamo considerare i soft margin classifiers o Support Vector Classifters (SVC).
Le SVC provano ad individuare un limite di separazione lineare nello spazio delle funzioni che classifica correttamente la maggior parte, ma non tutte, le osservazioni di allenamento creando un confine di separazione ottimale tra le due classi. A volte un tale limite è abbastanza efficace se la separazione delle classi è per lo più lineare. Tuttavia, altre volte tali separazioni non sono possibili ed è necessario utilizzare altre tecniche.
La motivazione alla base dell’estensione di un SVC è la possibilità di considerare limiti decisionali non lineari. Questo è il dominio di Support Vector Machine (SVM). Il vantaggio principale degli SVM è la possibilità di effettuare un ampliamento non lineare dello spazio delle caratteristiche per includere una significativa non linearità, mantenendo comunque un’efficienza computazionale, utilizzando un processo noto come “kernel trick”.
Gli SVM consentono limiti decisionali non lineari attraverso molte scelte differenti di “kernel”. In particolare, invece di utilizzare un limite di separazione completamente lineare come in SVC, possiamo usare i polinomi quadratici, i polinomi di ordine superiore o anche i kernal radiali per descrivere i limiti non lineari. Questo ci dà un significativo grado di flessibilità, a fronte dei bias sempre presenti nelle nostre stime. Utilizzeremo il SVM di per provare a partizionare lo spazio delle caratteristiche (ovvero i fattori di prezzo ritardati e il volume) tramite un limite non lineare che ci consente di fare previsioni ragionevoli sul fatto che il giorno successivo ci sarà un movimento Up o Down.
Alberi Decisionali e Foreste Random
Gli alberi decisionali sono una tecnica di classificazione supervisionata che utilizza una struttura ad albero per suddividere lo spazio delle caratteristiche in sottoinsiemi ricorsivi tramite una “decisione” su ciascun nodo dell’albero.
Ad esempio, si potrebbe verificare se il prezzo di ieri fosse superiore o inferiore a una certa soglia. Tale soglia partiziona immediatamente lo spazio delle caratteristiche in due sottoinsiemi. Per ciascuno dei due sottoinsiemi si potrebbe quindi verficare se il volume era sopra o sotto una soglia, creando così quattro sottoinsiemi separati. Questo processo continua fino a quando non si ottiene più potenza predittiva dal partizionamento.
Un albero decisionale fornisce un meccanismo di classificazione naturalmente interpretabile rispetto ai più opachi approcci “black box” dell’SVM o dell’analisi discriminante e quindi è una popolare tecnica di classificazione supervisionata.
Con l’aumentare della potenza computazionale, è emerso un nuovo metodo per risolvere il problema della classificazione, quello del “ensemble learning”. L’idea di base è semplice: si crea una grande quantità di classificatori dallo stesso modello base e vengono tutti allenali con diversi parametri. Quindi si combinano i risultati della previsione in una media per ottenere, auspicabilmente, una maggiore precisione di previsione di quella ottenuta con uno qualsiasi dei singoli componenti.
Uno dei metodi di ensemble più diffusi è quello della Random Forest, che considera molti alberi decisionali (solitamente nell’ordine di decine di migliaia o più) e combina le predizioni. Tali ensemble lavorano spesso estremamente bene. Scikit-Learn contiene una classe RandomForestClassifier (RFC) nel suo modulo ensemble. I due principali parametri di interesse per RFC sono il n_estimators, che descrive il numero di alberi decisionali da creare e il n_jobs, che descrive il numero di core di elaborazione su cui vengono distribuiti i calcoli.
Principal Components Analysis
Tutte le tecniche sopra descritte appartengono alla categoria della classificazione supervisionata. Un approccio alternativo alla classificazione delle prestazioni consiste nel non supervisionare la procedura di addestramento e consentire invece a un algoritmo di accertare “caratteristiche” in autonomia. Tali metodi sono noti come tecniche di apprendimento senza supervisione.
I casi di uso comune per le tecniche non supervisionate includono la riduzione del numero di dimensioni di un problema solo a quelle considerate importanti, la ricerca di informazioni all’interno di una grande quantità di documenti di testo o la scoperta di funzionalità che possono fornire una potenza predittiva nell’analisi delle serie temporali.
Di interesse per noi in questa sezione è il concetto di riduzione della dimensionalità, che mira a identificare le componenti più importanti di una serie di fattori che forniscono la massima prevedibilità. In particolare, si prende in considerazione una tecnica non supervisionata nota come Principal Components Analysis (PCA) per ridurre le dimensioni dello spazio delle funzioni prima di usare i classificatori supervisionati. L’idea di base di un PCA è trasformare un insieme di variabili possibilmente correlate (come con la autocorrelazione delle serie temporali) in un insieme di variabili linearmente non correlate conosciute dette componenti principali. Tali componenti principali sono ordinati in base alla quantità di varianza che descrivono, in modo ortogonale. Pertanto, se disponiamo di uno spazio di caratteristiche molto elevato (oltre 10 caratteristiche), tramite PCA la si può ridurre tale spazio a 2 o 3 componenti principali che forniscono quasi tutta la variabilità nei dati, in modo da avere un modello di classificatore supervisionato più solido quando applicato a questo set ridotto di dati.
Previsione del S&P500 utilizzando la Logistic Regression, il LDA e il QDA
L’indice S&P500 è un indice ponderato delle 500 maggiori società quotate in borsa (per capitalizzazione di mercato) nel mercato azionario statunitense. È spesso considerato un “benchmark” azionario. Esistono molti prodotti derivati per consentire la speculazione su questo indice. In particolare, il contratto futures E-Mini S&P500 è uno strumento estremamente liquido per negoziare l’indice.
In questa sezione useremo tre classificatori per prevedere la direzione del prezzo di chiusura al giorno N in base esclusivamente alle informazioni sui prezzi conosciute al giorno N-1. Un movimento direzionale verso l’alto significa che il prezzo di chiusura di N è superiore al prezzo di N-1, mentre un movimento al ribasso implica un prezzo di chiusura di N inferiore a quello di N-1.
Se siamo in grado di determinare la direzione del movimento con un metodo supera significativamente un tasso di successo del 50%, con un basso errore e una buona significatività statistica, allora siamo sulla buona strada per creare una semplice strategia di trading sistematico, basata sulle nostre previsioni. In questa fase non ci occupiamo degli algoritmi di Machine Learning più aggiornati e di ultima generazione. In questo momento stiamo solo introducendo alcuni concetti e quindi iniziamo la discussione con alcuni metodi elementari.
Conclusione
Dopo aver introdotto i concetti base, nella seconda parte di questo articolo vedremo come implementare in python queste logiche.