White Noise e Random Walks nell’Analisi delle Serie Temporali

white noise e random walks analisi serie temporali trading quantitativo

Nel precedente articolo relativo all’analisi delle serie temporali abbiamo descritto l’importanza della correlazione seriale e della sua utilità nel contesto del trading quantitativo.

In questo articolo vediamo come usare la correlazione seriale all’interno dei primi modelli di analisi delle serie temporali, inclusi alcuni semplici modelli stocastici lineari. In particolare, descriviamo il White Noise e Random Walks.

Obiettivo dell'analisi delle serie temporali

Prima di immergerci nelle definizioni, voglio riassumere le nostre motivazioni per studiare questi modelli e il nostro obiettivo finale nello studio dell’analisi delle serie temporali.

Fondamentalmente siamo interessati a migliorare la redditività dei nostri algoritmi di trading. Come analisti quantitativi, non ci basiamo su “supposizioni” o “intuizioni”.

Il nostro approccio consiste nel quantificare il più possibile, sia per rimuovere qualsiasi coinvolgimento emotivo dal processo di trading sia per garantire (per quanto possibile) la ripetibilità del nostro trading.

Al fine di migliorare la redditività dei nostri modelli di trading, dobbiamo utilizzare tecniche statistiche per identificare comportamenti coerenti in specifici strumenti che possono essere sfruttati per realizzare un profitto. Per trovare questo comportamento dobbiamo esplorare come le proprietà dei prezzi degli asset cambiano nel tempo.

L’analisi delle serie temporali ci aiuta a raggiungere questo obiettivo. Ci fornisce un solido quadro statistico per valutare il comportamento delle serie temporali, come i prezzi degli asset, al fine di aiutarci a definire una strategia che sfrutti questo comportamento.

L’analisi delle serie temporali ci fornisce un solido quadro statistico per valutare il comportamento dei prezzi degli asset.

Finora abbiamo discusso la correlazione seriale ed esaminato la struttura di correlazione di base dei dati simulati. Inoltre abbiamo definito la stazionarietà e considerato le proprietà di secondo ordine delle serie temporali. Tutti questi attributi ci aiuteranno a identificare i modelli tra le serie temporali. Se non hai letto l’articolo precedente sulla correlazione seriale , ti consiglio caldamente di farlo prima di continuare con questo articolo.

Di seguito esamineremo come possiamo sfruttare parte della struttura dei prezzi degli asset che abbiamo identificato utilizzando modelli di serie temporali .

Processo di modellazione delle serie storiche

Allora, cos’è un modello di una serie temporale? Essenzialmente, è un modello matematico che tenta di “spiegare” la correlazione seriale presente in una serie temporale.

Con il termine “spiega” si intende che il modello “adattato” ad una serie temporale dovrebbe tenere conto di alcune o tutte le correlazioni seriali presenti nel correlogramma. Cioè, adattando il modello a una serie storica, stiamo riducendo la correlazione seriale.

Il nostro processo, come ricercatori quantitativi, consiste nel considerare un’ampia varietà di modelli, comprese le loro ipotesi e la loro complessità, e quindi scegliere un modello in modo tale che sia quello “più semplice” per spiegare la correlazione seriale.

Una volta che abbiamo definito tale modello, possiamo usarlo per prevedere i valori futuri o, più in generale, il comportamento futuro. Questa previsione è ovviamente estremamente utile nel trading quantitativo.

Se possiamo prevedere la direzione del movimento di un asset, allora abbiamo la base di una strategia di trading (tenendo ovviamente conto dei costi di transazione!). Inoltre, se possiamo prevedere la volatilità di un asset, allora abbiamo la base per un’altra strategia di trading o per un approccio di gestione del rischio. Questo è il motivo per cui siamo interessati alle proprietà di secondo ordine, poiché fornisco i mezzi per aiutarci a fare previsioni.

Una domanda da porsi in questi casi è “Come facciamo a sapere quando abbiamo una buona misura per un modello?”. Quali criteri utilizziamo per giudicare quale modello è il migliore? In effetti, ce ne sono diversi! Considereremo questi criteri in questa serie di articoli.

Riassumiamo il processo generale che seguiremo in tutta la serie:

  • Delineare un’ipotesi su una particolare serie temporale e sul suo comportamento
  • Ottenere il correlogramma delle serie temporali (utilizzando le librerie Python) e valutare la sua correlazione seriale
  • Utilizzare la nostra conoscenza dei modelli di serie temporali e adattare un modello appropriato per ridurre la correlazione seriale nei residui (vedi sotto per una definizione) del modello e delle sue serie temporali
  • Affinare l’adattamento fino a quando non ci sono più correlazioni e utilizzare i criteri matematici per valutare l’adattamento del modello
  • Utilizzare il modello e le sue proprietà di secondo ordine per fare previsioni sui valori futuri
  • Valutare l’accuratezza di queste previsioni utilizzando tecniche statistiche (come matrici di confusione , curve ROC per la classificazione o metriche regressive come MSE , MAPE ecc.)
  • Iterare questo processo fino a quando la precisione è ottimale e quindi utilizzare tali previsioni per creare strategie di trading

Questo è il nostro processo di base. La complessità sorgerà quando considereremo modelli più avanzati che tengono conto di correlazioni seriali aggiuntive nelle nostre serie temporali.

In questo articolo prenderemo in considerazione due dei modelli di serie temporali più basilari, ovvero il White Noise e Random Walks. Questi modelli formeranno la base dei seguenti modelli più avanzati, quindi è essenziale comprenderli nei dettagli.

Tuttavia, prima di introdurre uno di questi modelli, descriviamo alcuni concetti più astratti che ci aiuteranno a unificare il nostro approccio ai modelli delle serie temporali. In particolare, definiremo l’operatore di spostamento all’indietro e l’ operatore di differenza .

Operatori di spostamento all'indietro e di differenza

L’operatore di spostamento all’indietro (BSO) e l’operatore di differenza ci consentono di scrivere molti differenti modelli di serie temporali in uno specifico modo che ci aiuta a capire come differiscono l’uno dall’altro.

Dal momento che useremo queste notazioni molto frequentemente, ha senso definirli ora.

Operatore di spostamento all’indietro
L’ operatore di spostamento all’indietro o di ritardo , \({\bf B}\), accetta un elemento della serie temporale come argomento e restituisce l’elemento in un’unità di tempo precedente: \({\bf B} x_t = x_ {t-1} \).

L’applicazione ripetuta dell’operatore ci permette di tornare indietro di \(n\) volte: \({\bf B} ^ n x_t = x_{tn} \).

In futuro utilizzeremo il BSO per definire molti dei nostri modelli di serie temporali.

Inoltre, quando si arriva a studiare modelli di serie temporali che non sono stazionari (cioè, la loro media e varianza possono cambiare nel tempo), possiamo usare una procedura di differenziazione per prendere una serie non stazionaria e produrre una serie stazionaria.

Operatore differenza
L’operatore differenza , \( \nabla \), accetta un elemento della serie temporale come argomento e restituisce la differenza tra l’elemento e quello di un’unità di tempo precedente: \(\nabla x_t = x_t – x_{t-1} \) o \(\nabla x_t = (1 – {\bf B}) x_t \).
Come con BSO, possiamo applicare ripetutamente l’operatore di differenza: \( \nabla ^ n = (1 – {\bf B})^n \).

Ora che abbiamo discusso di questi operatori astratti, consideriamo alcuni modelli concreti di serie temporali.

White Noise

Cominciamo cercando di motivare il concetto di rumore bianco. In precedenza, abbiamo descritto che il nostro approccio di base consiste nel provare ad adattare i modelli a una serie temporale fino a quando le serie rimanenti non presentano alcuna correlazione seriale. Ciò motiva la definizione della serie degli errori residui:

Serie dei residui La serie degli errori residui(o residui), \(x_t\), è una serie temporale della differenza tra un valore osservato e un valore previsto, da un modello di serie temporale, in un determinato momento \(t\). Se \(y_t\) è il valore osservato e \(\hat{y}_t \) è il valore previsto, diciamo: \(x_t = y_t – \hat{y}_t \) sono i residui.

Il punto chiave è verificare se il modello di serie temporale scelto è in grado di “spiegare” la correlazione seriale nelle osservazioni, allora gli stessi residui sono serialmente non correlati. Questo significa che ogni elemento della serie dei residui non correlati serialmente è una realizzazione indipendente di una specifica distribuzione di probabilità. In altre parole, gli stessi residui sono indipendenti e distribuiti in modo identico (iid). Quindi, se vogliamo creare modelli di serie temporali che spieghino qualsiasi correlazione seriale, è naturale iniziare con un processo che produce variabili casuali indipendenti da una certa distribuzione. Questo porta direttamente al concetto di rumore bianco (discreto):

Rumore bianco discreto Si consideri una serie temporale \( \{w_t: t=1,…n\}\). Se gli elementi della serie, \( w_i \), sono indipendenti e distribuiti in modo identico (iid), con media zero, varianza \( \sigma^2 \) e nessuna correlazione seriale (cioè \( \text {Cor} (w_i, w_j) \neq 0, \forall i \neq j \)) allora diciamo che la serie temporale è un rumore bianco discreto (DWN).

In particolare, se i valori \( w_i \) sono tratti da una distribuzione normale standard (cioè \( w_t \sim N (0, \sigma^2) \)), la serie è nota come Rumore bianco gaussiano . Il White Noise è utile in molti contesti. In particolare, può essere utilizzato per simulare una serie “sintetica” . Come accennato in precedenza, una serie temporale storica è solo un’istanza osservata. Se siamo in grado di simulare più realizzazioni, allora possiamo creare “molte storie” e quindi generare statistiche per alcuni dei parametri di modelli particolari. Questo ci aiuterà a perfezionare i nostri modelli e quindi ad aumentare la precisione nelle nostre previsioni. Ora che abbiamo definito il Discrete White Noise, esamineremo alcuni dei suoi attributi, incluse le sue proprietà di secondo ordine e il suo correlogramma.

Proprietà di secondo ordine

Le proprietà di secondo ordine del DWN sono semplici e  facilmente intuibili dalla sua definizione. In particolare, la media delle serie è zero e non c’è autocorrelazione per definizione:

\(\begin{eqnarray} \mu_w = E(w_t) = 0 \end{eqnarray}\)

\(\rho_k = \text{Cor}(w_t, w_{t+k}) = \left\{\begin{aligned} &1 && \text{if} \enspace k = 0 \\ &0 && \text{if} \enspace k \neq 0 \end{aligned} \right.\)
 

Correlogramma

Possiamo anche tracciare il correlogramma di un DWN usando Python. Per prima cosa definiamo un seed casuale pari a 1, in modo le estrazioni casuali siano identiche per ogni lancio dello script. Quindi campioniamo 1000 elementi da una distribuzione normale e tracciamo l’autocorrelazione:
import numpy as np
from matplotlib import pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import acf

np.random.seed(1)
whiteNoise = np.random.standard_normal(1000)

acf_coef = acf(whiteNoise)
plot_acf(acf_coef, lags=30)
plt.show()
trading-quantitativo-collerograma-white noise python

Si noti che a \( k = 4 \), \( k = 12 \) e \( k = 16 \), abbiamo tre picchi che differiscono da zero per un livello del 5%. Tuttavia, questo è facilmente prevedibile a causa della variazione del campionamento dalla distribuzione normale.

Ancora una volta, dobbiamo essere estremamente attenti nella nostra interpretazione dei risultati. In questo caso, ci aspettiamo davvero che accada qualcosa di fisicamente significativo per \( k = 4 \), \( k = 12 \) o \( k = 16 \)?

Si noti che il modello DWN ha un solo parametro, vale a dire la varianza \( \sigma^2 \). Per fortuna, è semplice stimare la varianza con Python, possiamo semplicemente usare la funzione var della libreria Numpy:

var = np.var(whiteNoise)
print(var)

Dato che abbiamo specificamente definito il white noise come una distribuzione normale (quindi con una media pari a 0 e una deviazione standard pari a 1 (e quindi una varianza di 1). Python calcola la varianza del campionaria come 0.962369, che è vicino al valore ideale di 1.

Il Discrete White Noise è fondamentalmente usato come modello per i residui . Stiamo cercando di adattare altri modelli di serie temporali alle nostre serie osservate, a quel punto utilizziamo il DWN come conferma che abbiamo eliminato qualsiasi correlazione seriale rimanente dai residui e quindi abbiamo un buon adattamento del modello.

Ora che abbiamo esaminato il DWN, descriviamo un modello famoso per (alcune) serie temporali finanziarie, ovvero il Random Walk.

Random Walks

Una passeggiata casuale è un altro modello di serie temporale in cui l’osservazione corrente è uguale all’osservazione precedente con un incremento o decremento casuale. È formalmente definito come segue:

Passeggiata casuale
Una passeggiata casuale è un modello di serie temporale \( {x_t} \) tale che \( x_t = x_ {t-1} + w_t \), dove \( w_t \) è una serie di rumore bianco discreto.

In precedenza abbiamo definito l’operatore di spostamento all’indietro \( {\bf B} \). Possiamo applicare il BSO alla passeggiata casuale:

\(\begin{eqnarray} x_t = {\bf B} x_t + w_t = x_ {t-1} + w_t \end{eqnarray}\)

E facendo un ulteriore passo indietro:

\( \begin{eqnarray} x_{t-1} = {\bf B} x_{t-1} + w_{t-1} = x_{t-2} + w_{t-1} \end{eqnarray}\)

Se ripetiamo questo processo fino alla fine della serie temporale otteniamo

\(\begin{eqnarray} x_t = (1 + {\bf B} + {\bf B}^2 + \ldots) w_t \end{eqnarray}\)

da cui

\( x_t = w_t + w_{t-1} + w_{t-2} + \ldots\)

Quindi è chiaro come la passeggiata aleatoria sia semplicemente la somma degli elementi di una serie di rumore bianco discreto.

Proprietà di secondo ordine

Le proprietà di secondo ordine di una passeggiata aleatoria sono un po ‘più interessanti di quelle del rumore bianco discreto. Sebbene la media di una passeggiata aleatoria sia ancora zero, la covarianza è in realtà dipendente dal tempo. Quindi una passeggiata aleatoria non è stazionaria :

\(\begin{eqnarray} \mu_x &=& 0 \\ \gamma_k (t) &=& \text{Cov}(x_t, x_{t+k}) = t \sigma^2 \end{eqnarray}\)

In particolare, la covarianza è uguale alla varianza moltiplicata per il tempo. Quindi, con l’aumentare del tempo, aumenta anche la varianza.

Cosa significa questo per passeggiate casuali? In parole povere, significa che non ha molto senso estrapolare “trend” a lungo termine, poiché sono letteralmente processi casuali .

Correlogramma

L’autocorrelazione di una passeggiata casuale (che è anch’essa dipendente dal tempo) può essere definita come segue:

\(\begin{eqnarray} \rho_k (t) = \frac{\text{Cov}(x_t, x_{t+k})} {\sqrt{\text{Var}(x_t) \text{Var}(x_{t+k})}} = \frac{t \sigma^2}{\sqrt{t \sigma^2 (t+k) \sigma^2}} = \frac{1}{\sqrt{1+k/t}} \end{eqnarray}\)

Quindi se si considera una lunga serie temporale, con ritardi a breve termine, allora otteniamo un’autocorrelazione quasi unitaria. Cioè, abbiamo un’autocorrelazione estremamente elevata che non diminuisce molto rapidamente all’aumentare del ritardo. Possiamo simulare una serie del genere usando Python.

In primo luogo, definiamo il seed in modo che si possa replicare esattamente gli stessi risultati. Quindi creiamo due sequenze di estrazioni casuali (\( x \) e \( w \)), ognuna delle quali ha lo stesso valore (come definito dal seed).

Quindi eseguiamo un ciclo attraverso ogni elemento di \( x \) e gli assegniamo il valore dell’elemento precedente di \( x \) più il valore corrente di \( w \). In questo modo ricaviamo una passeggiata casuale. Quindi tracciamo i risultati usando type="l"per darci un grafico a linee, piuttosto che un grafico di punti circolari:

from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.stattools import acf
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
steps = np.random.standard_normal(1000)
steps[0] = 0
random_walk = np.cumsum(steps)

plt.figure(figsize=[10, 7.5]); # Dimensioni del grafico
plt.plot(random_walk)
plt.title("Simulated Random Walk")
plt.show()
trading-quantitativo-random walks python

È anche abbastanza semplice disegnare il correlogramma:

random_walk_acf_coef = acf(random_walk)
plot_acf(random_walk, lags=20);
plt.show()
trading-quantitativo-correlograma random walks python

Adattamento dei Modelli di Random Walk ai dati Finanziari

Come descritto anche nell’articolo precedente, è quindi necessario adattare i modelli ai dati che abbiamo già simulato.

Chiaramente questo è un po’ artificioso, dato che abbiamo simulato anche la random walk. Tuttavia, è utile come semplice descrizione delle basi del processo di adattamento . In situazioni reali non conosceremo il modello di generazione per i dati dello strumento sottostante, possiamo solamente adattare i modelli e quindi valutarne il correlogramma.

Abbiamo affermato come questo processo è utile per semplificare il processo di verifica della corretta implementazione del modello, cercando di garantire che le stime dei parametri siano vicine a quelle utilizzate nelle simulazioni.

Adattamento ai dati simulati

Dato che impiegheremo molto tempo ad adattare i modelli alle serie temporali finanziarie, dovremmo prima fare pratica sui dati simulati, in modo da avere pratica del processo quando si inizia a utilizzare i dati reali.

Abbiamo già simulato una random walk aleatoria, quindi possiamo anche usare quella realizzazione per vedere se il modello proposto (per un processo aleatorio) è accurato.

Come possiamo sapere se il modello ipotizzato per la random walk è adatto per i nostri dati simulati? Bene, facciamo uso della definizione di un processo aleatorio, quindi si prevede che la differenza tra due valori vicini è uguale possa essere descritto da un processo di rumore bianco discreto.

Quindi, se creiamo una serie di differenze di elementi dalla nostra serie simulata, dovremmo avere una serie che assomigli al rumore bianco discreto!

In Python è semplicemente implementato tramite l’uso della funzione diff. Dopo aver creato la serie ellei differenze, si stampa il grafico del correlogramma e quindi valutare quanto sia vicino al rumore bianco discreto:

random_walk_diff = np.diff(random_walk, n=1)

random_walk_diff_acf_coef = acf(random_walk_diff)
plot_acf(random_walk_diff, lags=20);
plt.show()
trading-quantitativo-random walks differenze

Cosa possiamo notare da questo grafico? C’è un picco statisticamente significativo per \( k = 12 \), ma solo marginalmente. Da ricordare che ci si aspettiamo di avere almeno il 5% dei picchi che sono statisticamente significativi, a causa della variazione del campionamento.

Quindi possiamo ragionevolmente affermare che il correlogramma assomiglia a quello del rumore bianco discreto. Ciò implica che il modello di random walk si adatta bene ai nostri dati simulati. Questo è esattamente quello che dovremmo aspettarci, dal momento che abbiamo inizialmente simulato una random walk!

Adattamento ai dati finanziari

Applichiamo ora il nostro modello di random walk ad alcuni effettivi dati finanziari. Tramite la libreria Python, pandas, possiamo usare il pacchetto Pandas Datareader per ottenere facilmente i dati finanziari tramite Yahoo Finance.

Vedremo se un modello di passeggiata aleatoria è adatto per alcuni dati azionari. In particolare, sceglierò Microsoft (MSFT), ma puoi sperimentare con il tuo ticker preferito!

Prima di poter scaricare qualsiasi dato, dobbiamo installare il pacchetto pandas-datareader poiché non fa parte dell’installazione predefinita di Pandas. E’ sufficiente eseguire il seguente comando:

pip install pandas-datareader

E’ quindi possibile scaricare i dati di MSFT con una semplice chiamata ad una funzione di pandas-datareader

mstf = pdr.get_data_yahoo('MSFT', start='01/01/2000', end='08/01/2017')
Questo creerà un oggetto chiamato msft dove possiamo accedere alla serie dei prezzi di chiusura aggiustati per lo specifico titolo azionario. Il nostro processo consisterà nel calcolare la differenza dei valori di chiusura, omettere eventuali valori mancanti e quindi applicarli alla funzione di autocorrelazione. Quando tracciamo il correlogramma, cerchiamo prove della presenza di rumore bianco discreto, ovvero una serie di residui non correlata in modo seriale. Per eseguire ciò in Python, eseguiamo il seguente comando:
mstf_close = mstf['Adj Close']
msft_diff = np.diff(mstf_close, n=1)

msft_diff_acf_coef = acf(msft_diff,missing="drop")
plot_acf(msft_diff_acf_coef, lags=20)
plt.show()

L’ultima parte (missing = "drop") specifica alla funzione acf di ignorare i valori NaN. L’output della funzioneacf è il seguente:

trading-quantitativo-msft differenze

Notiamo che la maggior parte dei picchi di lag non differisce dallo zero per più del 5%. Tuttavia ce ne sono alcuni che sono marginalmente superiori. Dato che i ritardi \( k_i \) per i quali si verifica un picco anomalo sono indipendenti da \( k = 0 \), potremmo essere inclini a pensare che questi siano causati da variazioni stocastiche e non rappresentino alcuna correlazione seriale presente nella serie.

Quindi possiamo concludere, con un ragionevole grado di certezza, che i prezzi di chiusura rettificati di MSFT sono ben approssimati da una random walk.

Proviamo ora lo stesso approccio sullo stesso indice S&P500. Il simbolo Yahoo Finance per l’S&P500 è ^GSPC. Quindi, se inseriamo i seguenti comandi in Python, possiamo tracciare il correlogramma della serie di differenze dell’S & P500:

sp500 = pdr.get_data_yahoo('^GSPC', start='01/01/2000', end='08/01/2017')
sp500_close = sp500['Adj Close']

sp500_diff = np.diff(sp500_close, n=1)
sp500_diff_acf_coef = acf(sp500_diff,missing="drop")
plot_acf(sp500_diff_acf_coef, lags=20)
plt.show()
trading-quantitativo-GSPC differenze

Questo correlogramma è sicuramente più interessante. Si noti che esiste una correlazione negativa per \( k = 1 \). È improbabile che ciò sia dovuto alla variazione casuale del campionamento.

Da notare anche che ci sono picchi per \( k = 2 \), \( k = 15 \) e \( k = 18 \). Sebbene sia più difficile giustificare la loro esistenza oltre a quella della variazione casuale, possono essere indicativi di un processo di ritardo più lungo.

Quindi è molto più difficile giustificare una random walk come un buon modello per la serie dei prezzi di chiusura aggiustati dell’S&P500. Quindi dobbiamo usare modelli più sofisticati, vale a dire i modelli di ordine autoregressivo p , che sarà l’argomento del prossimo articolo!

Correlazione Seriale nell’Analisi delle Serie Storiche

Time-series-analysis-2-trading-quantitativo

Nell’articolo precedente abbiamo definito l’analisi delle serie temporali come mezzo per aiutarci a creare strategie di trading. In questo articolo esamineremo uno degli aspetti più importanti delle serie temporali, ovvero la correlazione seriale (nota anche come autocorrelazione).

Prima di immergerci nella definizione di correlazione seriale, discuteremo l’ampio scopo della modellazione di serie temporali e perché siamo interessati alla correlazione seriale.

Quando ci vengono fornite una o più serie temporali finanziarie, siamo principalmente interessati alla previsione o alla simulazione dei dati. È relativamente semplice identificare trend deterministiche e anche variazioni stagionali, oltre che scomporre una serie in queste componenti. Tuttavia, una volta scomposta una serie temporale in questo modo, resta esclusa una componente casuale.

A volte una serie temporale di questo tipo può essere ben modellata da variabili casuali indipendenti. Tuttavia, vi sono molte situazioni, in particolare nella finanza, in cui elementi consecutivi di questa serie temporale di componenti casuali avranno una correlazione . Cioè, il comportamento dei punti sequenziali nelle serie rimanenti si influenzano a vicenda in modo dipendente. Un esempio importante si verifica nel trading di coppie con ritorno alla media. Il ritorno alla media si presenta come correlazione tra variabili sequenziali nelle serie temporali.

Il nostro compito come modellatori quantitativi è cercare di identificare la struttura di queste correlazioni, in quanto ci consentiranno di migliorare notevolmente le nostre previsioni e quindi la potenziale redditività di una strategia. Inoltre, l’identificazione della struttura di correlazione migliorerà il realismo di qualsiasi serie temporale simulata basata su tale modello. Ciò è estremamente utile per migliorare l’efficacia delle componenti di gestione del rischio nell’attuazione della strategia.

Quando le osservazioni sequenziali di una serie temporale sono correlate nel modo descritto sopra, diciamo che esiste una correlazione seriale (o autocorrelazione) nelle serie temporali.

Ora che abbiamo delineato l’utilità dello studio della correlazione seriale, dobbiamo definirla in modo rigorosamente matematico. Prima di poterlo fare, dobbiamo introdurre concetti più semplici, incluse l’aspettativa e la varianza.

Aspettativa, varianza e covarianza

Molte di queste definizioni risulteranno familiari alla maggior parte dei lettori di DataTrading, ma le descriverò specificamente per motivi di completezza.

La prima definizione è quella del valore atteso o aspettativa :

Aspettativa
Il valore atteso o aspettativa, \(E(x)\), di una variabile casuale \(x\) è il suo valore medio nella popolazione. Indichiamo l’aspettativa di \(x\) con \(\mu\), in modo tale che \(E(x) = \mu \).

Ora che abbiamo la definizione di aspettativa possiamo definire la varianza , che caratterizza lo “spread” di una variabile casuale:

Varianza
La varianza di una variabile casuale è l’aspettativa delle deviazioni al quadrato della variabile dalla media, indicata con \(\sigma^2(x) = E[(x-\mu)^2] \).

Notare che la varianza è sempre non negativa. Questo ci permette di definire la deviazione standard :

Deviazione standard
La deviazione standard di una variabile casuale \(x\), \(\sigma(x) \), è la radice quadrata della varianza di \(x\).

Ora che abbiamo delineato queste definizioni statistiche elementari, possiamo generalizzare la varianza al concetto di covarianza tra due variabili casuali. La covarianza ci dice quanto linearmente siano correlate queste due variabili:

Covarianza
La covarianza di due variabili casuali \(x\) e \(y\), ciascuna con le rispettive aspettative \(\mu_x\) e \(\mu_y\), è data da \(\sigma(x, y) = E [(x-\mu_x) (y – \mu_y)]\).

La covarianza ci dice come due variabili si muovono insieme.

Tuttavia, poiché siamo in una situazione statistica, non abbiamo accesso alla popolazione significa \(\mu_x\) e \(\mu_y\). Invece dobbiamo stimare la covarianza da un campione . Per questo usiamo il rispettivo campione significa \(\bar{x}\) e \(\bar{y}\).

Se consideriamo un insieme di \(n\) coppie di elementi di variabili casuali da \(x\) e \(y\), dato da \((x_i, y_i)\), la covarianza campionaria , \(\text{Cov}(x, y)\) (anche a volte indicato con \(q(x, y)\)) è dato da:

\(\begin{eqnarray} \text {Cov} (x, y) = \frac {1} {n-1} \sum ^ n_ {i = 1} (x_i – \bar {x}) (y_i – \bar { y}) \end{eqnarray}\)

Nota: alcuni di voi potrebbero chiedersi perché dividiamo per \(n-1\) al denominatore, invece che per \(n\). Questa è una domanda valida! E’ opportuno scegliere \(n-1\) in moda da rendere \(\text {Cov} (x, y)\) un Bias di Stima.

Esempio: Covarianza campionaria in Python

Per calcolare la covarianza possiamo utilizzare la libreria Numpy di Python. NumPy non ha una funzione per calcolare direttamente la covarianza tra due variabili, ma prevede una funzione per calcolare una matrice di covarianza chiamata cov() che possiamo usare per recuperare la covarianza. Come default, la funzione cov() calcolerà la covarianza campionaria tra le variabili casuali in input.

Nel seguente codice simuleremo due vettori di lunghezza 100, ciascuno con una sequenza di numeri interi crescente linearmente con l’aggiunta di rumore normalmente distribuito. Quindi stiamo costruendo variabili associate linearmente in base alla progettazione .

Per prima cosa costruiremo un grafico a dispersione e quindi calcoleremo la covarianza del campione utilizzando la funzione cov(). Per assicurarsi di lavorare esattamente gli stessi dati di seguito utilizzati, si imposta un seed casuale rispettivamente di 1 e 2 per ogni variabile:

np.random.seed(1)
x = np.arange(100) + 20 * np.random.normal(size=100)

np.random.seed(2)
y = np.arange(100) + 20 * np.random.normal(size=100)
trading-quantitativo-covaranzia-fig1
Grafico a dispersione di due variabili in aumento lineare con rumore normalmente distribuito

Esiste un’associazione relativamente chiara tra le due variabili. 

Possiamo ora calcolare la covarianza per le due variabili come l’elemento [0,1] della matrice di covarianza quadrata:

sigma = np.cov(x,y)[0,1]
print(sigma)

La covarianza campionaria è pari a 926,1397…

Uno svantaggio dell’utilizzo della covarianza per stimare l’associazione lineare tra due variabili casuali è che la covarianza è una misura dimensionale . Cioè, non è normalizzato dalla diffusione dei dati e quindi è difficile fare confronti tra set di dati con grandi differenze di diffusione. Questo motiva l’introduzione di un altro concetto, vale a dire la correlazione.

Correlazione

La correlazione è una misura adimensionale della relazione tra due variabili tale che a ciascun valore della prima corrisponda un valore della seconda, seguendo una certa regolarità. In sostanza, è la covarianza di due variabili casuali, normalizzate con i rispettivi spread. La correlazione tra due variabili è spesso indicata con \(\rho(x, y)\):

\(\begin{eqnarray} \rho(x,y) = \frac {E[(x-\mu_x) (y-\mu_y)]} {\sigma_x \sigma_y} = \frac {\sigma(x,y)} {\sigma_x \sigma_y} \end{eqnarray}\)

Il prodotto dei due spread al denominatore vincola la correlazione ad assumere valori nell’intervallo \([-1,1]\):

  • Una correlazione di \(\rho(x, y) = +1\) indica un’esatta relazione lineare positiva
  • Una correlazione di \(\rho(x, y) = 0\) indica nessuna relazione lineare
  • Una correlazione di \(\rho(x, y) = -1\) indica un’esatta relazione lineare negativa

Come per la covarianza, possiamo definire la correlazione campionaria, \(\text{Cor}(x, y)\) come:

\(\begin{eqnarray} \text{Cor} (x, y) = \frac {\text{Cov (x, y)}} {\text {sd}(x) \text{sd} (y)} \end{eqnarray}\)

Dove \(\text{Cov} (x, y) \) è la covarianza campionaria di \(x\) e \(y\), mentre \(\text{sd}(x)\) è la deviazione standard campionaria di \(x\).

Esempio: correlazione campionaria in Python

NumPy fornisce la funzione corrcoef() per calcolare direttamente la correlazione tra due variabili. Come cov(), restituisce una matrice, in questo caso una matrice di correlazione, e possiamo accedere alla correlazione che ci interessa tramite il valore [0,1] della matrice quadrata restituita.

Usando gli stessi vettori \(x\) e \(y\) dell’esempio precedente, il seguente codice Python calcola la correlazione campionaria:

corr = np.corrcoef(x,y)[0,1]
print(corr)

La correlazione del campione è fornita come 0,69839 che mostra un’associazione lineare positiva ragionevolmente forte tra i due vettori, come previsto.

Stazionarietà nelle serie storiche

Ora che abbiamo delineato le definizioni generali di aspettativa, varianza, deviazione standard, covarianza e correlazione, possiamo descrivere come applicare questi concetti ai dati delle serie temporali.

In primo luogo, introduciamo un concetto noto come stazionarietà. Questo è un aspetto estremamente importante delle serie temporali e gran parte dell’analisi effettuata sui dati delle serie temporali finanziarie riguarderà la stazionarietà. Dopo aver discusso la stazionarietà, siamo in grado di parlare di correlazione seriale e costruire alcuni grafici di correlogramma.

Iniziamo cercando di applicare le definizioni di cui sopra ai dati di serie temporali, partendo dalla media / aspettativa:

Media di una serie storica
La media di una serie temporale \( x_t \), \( \mu(t) \), corrispondete all’aspettativa \( E(x_t) = \mu(t)\).

In questa definizione ci sono due punti importanti da sottolineare:

  • \( \mu = \mu(t)\), cioè la media (in generale) è una funzione del tempo.
  • Questa aspettativa viene ricavata dall’insieme della popolazione di tutte le possibili serie temporali che possono essere generate con il modello delle serie temporali. In particolare, NON corrispondere all’espressione \( (x_1 + x_2 + … + x_k) / k \) (descritta più avanti).

Questa definizione è utile quando siamo in grado di generare molte realizzazioni di un modello di serie temporale. Tuttavia questo non è possibile nella realtà: siamo “bloccati” con una sola storia passata e quindi abbiamo, quasi sempre, accesso solo a una singola serie storica per una particolare risorsa o situazione.

Quindi come si procede se si vuole stimare la media, dato che non abbiamo accesso a queste ipotetiche realizzazioni dall’insieme? Bene, ci sono due opzioni:

  • Stima semplicemente la media in ogni punto utilizzando il valore osservato.
  • Scomporre le serie temporali per rimuovere eventuali tendenze deterministiche o effetti di stagionalità, ottenendo una serie residua . Una volta ottenuta questa serie possiamo ipotizzare che la serie residua sia stazionaria nella media , cioè che \( \mu (t) = \mu \), un valore fisso indipendente dal tempo. Diventa quindi possibile stimare questa media costante della popolazione utilizzando la media campionaria \( \bar {x} = \sum ^ {n}_{t = 1} \frac {x_t} {n} [&latex].

Stazionarietà della Media
Una serie temporale è media-stazionaria se \(\) \mu(t) = \ mu \), cioè è costante nel tempo.

Ora che abbiamo visto come possiamo descrivere i valori delle aspettative, possiamo usarli per arricchire la definizione di varianza. Ancora una volta facciamo l’ipotesi semplificativa che la serie temporale in esame ha media stazionaria. Con questo assunto possiamo definire la varianza come:

Varianza di una serie storica
La varianza \( \sigma ^ 2 (t) \) di un modello di serie temporale con media stazionaria è data da \( \sigma ^ 2 (t) = E [(x_t – \mu) ^ 2] \).

Questa è una semplice estensione della varianza definita in precedenza per le variabili casuali, tranne per il fatto che \(\ sigma ^ 2 (t) \) è una funzione del tempo. È importante notare come la definizione si basi fortemente sul fatto che la serie temporale ha una media stazionaria (cioè che \(\mu \) non è dipendente dal tempo).

Si può notare che questa definizione porta a una situazione complicata. Se la varianza stessa varia nel tempo, come possiamo stimarla da una singola serie temporale? Come prima, la presenza di \( E (..) \) richiede un insieme di serie temporali e tuttavia spesso ne abbiamo solo una!

Ancora una volta, semplifichiamo la situazione facendo un’ipotesi. In particolare, come per la media, assumiamo una varianza costante della popolazione, indicata con \( \sigma ^ 2 \), che non è funzione del tempo. Una volta fatta questa ipotesi, siamo in grado di stimarne il valore utilizzando la definizione di varianza campionaria introdotta in precedenza:

\(\begin{eqnarray} \text {Var (x)} = \frac {\sum (x_t – \ bar {x}) ^ 2} {n-1} \end{eqnarray}\)

Affinché questo funzioni dobbiamo essere in grado di stimare la media campionaria, \( \bar {x} \). Inoltre, come per la covarianza campionaria definita sopra, dobbiamo usare \( n-1 \) al denominatore per rendere la varianza campionaria uno stimatore imparziale.

Stazionarietà della varianza
Una serie temporale è stazionaria nella varianza se \(\) \ sigma ^ 2 (t) = \ sigma ^ 2 \(\), è costante nel tempo.

È qui che dobbiamo stare attenti! Con le serie temporali ci troviamo nella situazione dove le osservazioni sequenziali possono essere correlate. Questo può influenzare lo stimatore, ovvero sovrastimare o sottovalutare la reale varianza della popolazione.

Ciò sarà particolarmente problematico nelle serie temporali di cui abbiamo pochi dati e quindi abbiamo solo un piccolo numero di osservazioni. In una serie ad alta correlazione, tali osservazioni saranno vicine l’una all’altra e quindi introduco un bias .

In pratica, e in particolare nella finanza ad alta frequenza, ci troviamo spesso nella situazione di avere un numero considerevole di osservazioni. Lo svantaggio è che spesso non possiamo presumere che le serie finanziarie siano veramente stazionarie nella media o stazionarie nella varianza .

Man mano che progrediamo con questa serie di articoli e sviluppiamo modelli più sofisticati, affronteremo questi problemi al fine di migliorare le nostre previsioni e simulazioni.

Siamo ora in grado di applicare le nostre definizioni di serie temporali di media e varianza a quella di correlazione seriale.

Correlazione seriale

L’essenza della correlazione seriale consiste nel verificare come le osservazioni sequenziali in una serie temporale si influenzano a vicenda . Se riusciamo a trovare una struttura in queste osservazioni, probabilmente potremmo migliorare le nostre previsioni e l’accuratezza della simulazione. Ciò porterà a una maggiore redditività nelle nostre strategie di trading o ad approcci migliori nella gestione del rischio.

Iniziamo con un’altra definizione. Se assumiamo, come in precedenza, di avere una serie temporale stazionaria nella media e stazionaria nella varianza allora possiamo parlare di stazionarietà del secondo ordine :

Stazionarietà di secondo ordine
Una serie temporale è stazionaria di secondo ordine se la correlazione tra le osservazioni sequenziali è una funzione solamente del ritardo (lag) , cioè il numero di periodi temporali che separa ciascuna osservazione sequenziale.

Infine, siamo in grado di definire la covarianza seriale e la correlazione seriale!

Autocovarianza di una serie storica
Se un modello di serie temporale è stazionario di secondo ordine, allora la covarianza seriale o autocovarianza , di ritardo \( k \) $, è definita come: \( C_k = E [(x_t- \mu) (x_ {t + k} – \mu)] \).

L’autocovarianza \(C_k\) non è una funzione del tempo perché implica un’aspettativa \(E(..)\), che, come visto in precedenza, viene presa dall’insieme della popolazione delle possibili serie temporali. Ciò significa che è costante per tutti i valori di \(t\).

Da cui si ricava la definizione di correlazione seriale o autocorrelazione semplicemente dividendo per il quadrato della diffusione della serie. Questo è possibile perché la serie temporale è stazionaria nella varianza e quindi \( \sigma^2(t) = \sigma^ 2 \):

Autocorrelazione di una serie storica
La correlazione seriale o autocorrelazione del ritardo \(k\), \(\rho_k\), di una serie temporale stazionaria di secondo ordine è data dall’autocovarianza della serie normalizzata dal prodotto dello spread. Cioè \(\rho_k = \frac {C_k} {\sigma^2} \).

Da notare che \( \rho_0 = \frac{C_0} {\sigma^2} = \frac{E [(x_t – \mu) ^ 2]} {\sigma ^ 2} = \frac {\sigma ^ 2} {\sigma ^ 2} = 1 \). Cioè, il primo ritardo di \( k = 0 \) darà sempre un valore unitario.

Come con le definizioni precedenti di covarianza e correlazione, possiamo definire l’autocovarianza e l’autocorrelazione campionarie. In particolare, denotiamo l’autocovarianza campionaria con \(c\) minuscola per differenziare il valore della popolazione dato dalla \( C \) maiuscola.

La funzione di autocovarianza di esempio \( c_k \) è data da:

\(\begin{eqnarray} c_k = \ frac {1} {n} \ sum ^ {nk} _ {t = 1} (x_t – \ bar {x}) (x_ {t + k} – \ bar {x}) \end{eqnarray}\)

La funzione di autocorrelazione di esempio \(r_k\) è data da:

\(\begin{eqnarray} r_k = \ frac {c_k} {c_0} \end{eqnarray}\)

Ora che abbiamo definito la funzione di autocorrelazione campionaria siamo in grado di definire e tracciare il correlogramma , strumento essenziale nell’analisi delle serie temporali.

Il Correlogramma

Un correlogramma è semplicemente un grafico della funzione di autocorrelazione per valori sequenziali del ritardo, \( k = 0,1, …, n \). Ci permette di vedere la struttura di correlazione in ogni lag.

L’utilizzo principale dei correlogrammi è quello di rilevare eventuali autocorrelazioni successive alla rimozione di trend deterministici e effetti di stagionalità.

Se abbiamo adattato un modello di serie temporale, il correlogramma ci aiuta a giustificare che questo modello è ben adattato o se è necessario perfezionarlo ulteriormente per rimuovere qualsiasi autocorrelazione aggiuntiva.

Ecco un esempio di correlogramma, graficato tramite Python utilizzando la funzione acf, per una sequenza di variabili casuali normalmente distribuite. Di seguito potete trovare il codice Python completo:

from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import acf

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
s = np.random.normal(size=100)

acf_coef = acf(s)
plot_acf(acf_coef, lags=20)

plt.show()

trading-quantitativo-collerograma-autocorrelazione-python

Da notare le caratteristiche specifiche del grafico del correlogramma:

  • In primo luogo, poiché la correlazione campionaria del ritardo \( k = 0 \) è data da \( r_0 = \frac {c_0} {c_0} = 1 \), nel grafico avremo sempre una linea di altezza uguale ad 1 per il ritardo \( k = 0 \). In effetti, questo ci fornisce un punto di riferimento su cui giudicare le restanti autocorrelazioni per i ritardi successivi. Si noti inoltre che l’ACF dell’asse y è adimensionale, poiché la correlazione è essa stessa adimensionale.
  • L’area blu rappresenta il confine per cui se i valori non rientrano in questa area, si ha evidenza che la nostra correlazione al lag \( k \), \( r_k \), sia uguale a zero al livello del 5%. Tuttavia dobbiamo fare attenzione perché dovremmo aspettarci che il 5% di questi ritardi superi comunque questi valori! Inoltre stiamo visualizzando i valori correlati e quindi se un ritardo cade al di fuori di questi limiti, è più probabile che lo facciano anche i prossimi valori sequenziali. In pratica stiamo cercando ritardi che possano avere qualche motivo di fondo per superare il livello del 5%. Ad esempio, in una serie temporale di materie prime potremmo vedere effetti imprevisti della stagionalità  a determinati ritardi (possibilmente intervalli mensili, trimestrali o annuali).

Ecco un paio di esempi di correlogrammi per sequenze di dati.

Esempio 1 – Trend lineare fisso

Il seguente codice Python genera una sequenza di numeri interi da 1 a 100 e quindi traccia l’autocorrelazione:

w = np.arange(1, 100)
acf_coef = acf(w, nlags=100)
plot_acf(acf_coef, lags=20)
plt.show()
trading-quantitativo-collerograma-autocorrelazione-python-fixed linear

Da notare come il grafico ACF diminuisce in modo quasi lineare all’aumentare dei ritardi. Quindi un correlogramma di questo tipo è una chiara indicazione della presenza di un trend.

Esempio 2 – Sequenza ripetuta

Il seguente codice Python genera una sequenza ripetuta di numeri con periodo \( p = 10 \) e quindi traccia l’autocorrelazione:

a = np.arange(1,11)
s = []
for i in range (0,10):
    for j in range (0,10):
        s.append(a[j])

acf_coef = acf(s)
plot_acf(acf_coef, lags=20)
plt.show()
trading-quantitativo-collerograma-autocorrelazione-python-periodico

Possiamo vedere che ci sono picchi significativi per i ritardi 10 e 20. Ciò ha senso, poiché le sequenze si ripetono con un periodo di 10. È interessante notare che esiste una correlazione negativa esattamente del -0,5 per i ritardi 5 e 15. Questo è molto caratteristico delle serie temporali stagionali e un comportamento di questo tipo in un correlogramma è solitamente indicativo che la stagionalità / effetti periodici non sono stati completamente considerati nel modello.

Prossimi passi

Ora che abbiamo descritto in modo approfondito l’autocorrelazione e i correlogrammi, nei prossimi articoli passeremo ai modelli lineari e inizieremo il processo di previsione .

Sebbene i modelli lineari siano lontani dallo stato dell’arte nell’analisi delle serie temporali, dobbiamo sviluppare la teoria su casi più semplici prima di poterla applicare ai modelli non lineari più interessanti che sono oggi in uso.

Guida Introduttiva all’Analisi delle Serie Temporali

guida introduttiva analisi serie temporali trading algoritmico

Negli ultimi mesi abbiamo esaminato vari strumenti per aiutarci a identificare i modelli sfruttabili nei prezzi degli asset. In particolare abbiamo considerato l’econometria di base, il machine learning statistico e la statistica bayesiana.

Sebbene questi siano tutti ottimi strumenti moderni per l’analisi dei dati, la stragrande maggioranza dei modelli di asset nel settore utilizza ancora l’analisi statistica delle serie temporali. In questo articolo introduciamo l’analisi delle serie temporali, ne delimitiamo l’ambito e vediamo come applicare le tecniche a varie frequenze di dati finanziari.

Che cos'è l'analisi delle serie temporali?

In primo luogo, una serie temporale è definita come una quantità misurata sequenzialmente nel tempo per un certo intervallo.

Nella sua forma più ampia, l’analisi delle serie temporali consiste nel dedurre cosa è successo nel passato ad una serie di punti di dati, nel tentativo di prevedere cosa accadrà in futuro.

Tuttavia, adotteremo un approccio statistico quantitativo alle serie temporali, assumendo che le nostre serie temporali siano realizzazioni di sequenze di variabili casuali. Cioè, supponiamo che esista un sottostante processo di generazione per le serie temporali basato su una o più distribuzioni statistiche da cui sono tratte queste variabili.

L’analisi delle serie temporali tenta di comprendere il passato e prevedere il futuro.

Questa sequenza di variabili casuali è nota come processo stocastico a tempo discreto (DTSP). Nel trading quantitativo ci preoccupiamo di adattare i modelli statistici a questi DTSP per dedurre le relazioni sottostanti tra le serie o prevedere valori futuri al fine di generare segnali di trading.

Le serie temporali in generale, comprese quelle al di fuori del mondo finanziario, spesso contengono le seguenti caratteristiche:

  • Tendenze: una tendenza è un movimento direzionale coerente in una serie temporale. Queste tendenze saranno deterministiche o stocastiche. Il primo ci consente di fornire una motivazione di fondo per il trend, mentre il secondo è una caratteristica casuale di una serie che difficilmente spiegheremo. Le tendenze appaiono spesso nelle serie finanziarie, in particolare nei prezzi delle materie prime, e molti fondi CTA (Commodity Trading Advisor) utilizzano sofisticati modelli di identificazione delle tendenze nei loro algoritmi di trading.
  • Variazione stagionale: molte serie temporali contengono variazioni stagionali. Ciò è particolarmente vero nelle serie che rappresentano le vendite aziendali o i livelli climatici. Nella finanza quantitativa vediamo spesso variazioni stagionali delle materie prime, in particolare quelle relative alle stagioni di crescita o alla variazione annuale della temperatura (come il gas naturale).
  • Dipendenza seriale – Una delle caratteristiche più importanti delle serie temporali, in particolare delle serie finanziarie, è quella della correlazione seriale. Ciò si verifica quando le osservazioni di serie temporali che sono vicine nel tempo tendono ad essere correlate. Il clustering della volatilità è un aspetto della correlazione seriale particolarmente importante nel trading quantitativo.

Come possiamo applicare l'analisi delle serie temporali nella finanza quantitativa?

Il nostro obiettivo come ricercatori quantitativi è identificare tendenze, variazioni stagionali e correlazioni applicando metodi statistici sulle serie temporali e, infine, generare segnali di trading o filtri basati su inferenze o previsioni.

Il nostro approccio sarà:

  • Previsione e predizione dei valori futuri – Per operare con successo, avremo bisogno di prevedere con precisione i prezzi futuri degli asset, almeno in senso statistico.
  • Simulare le serie – Una volta identificate le proprietà statistiche delle serie temporali finanziarie, possiamo utilizzarle per generare simulazioni di futuri scenari. Questo ci consente di stimare il numero di trade, i costi di transizione attesi, il profilo di rendimento atteso, l’investimento tecnico e finanziario richiesto in infrastrutture e quindi, in definitiva, il profilo di rischio e la redditività di una particolare strategia o portafoglio.
  • Dedurre le relazioni – L’identificazione delle relazioni tra serie temporali e altri valori quantitativi ci consente di migliorare i nostri segnali di trading attraverso meccanismi di filtraggio. Ad esempio, se possiamo dedurre come lo spread in una coppia di valute estere varia con il volume bid / ask, allora possiamo filtrare qualsiasi potenziale trade che potrebbe verificarsi in un periodo dove si prevede uno spread elevato, in modo da ridurre i costi di transazione.

Inoltre, possiamo applicare i test statistici standard (classici / empirici o bayesiani) ai modelli di serie temporali al fine di giustificare determinati comportamenti, come il cambio di regime nei mercati azionari.

Roadmap dell'Analisi delle Serie Temporali su DataTrading

Fino ad oggi, gli articoli precedenti relativi all’apprendimento statistico, all’econometria e all’analisi bayesiana sono stati per lo più di natura introduttiva e non hanno considerato le applicazioni di tali tecniche alle moderne informazioni ad alta frequenza sui prezzi degli strumenti finanziari.

Per applicare alcune di queste tecniche ai dati ad alta frequenza abbiamo bisogno di un framework matematico in cui unificare la nostra ricerca. L’analisi delle serie temporali fornisce tale unificazione e ci consente di discutere diversi modelli indipendenti all’interno di un contesto statistico.

A tal fine utilizzeremo strumenti bayesiani e tecniche di machine learning in combinazione con i seguenti metodi per prevedere il livello e la direzione dei prezzi, agire come filtri e determinare il “cambio di regime”, ovvero determinare quando le nostre serie temporali hanno cambiato il loro comportamento statistico sottostante.

La nostra tabella di marcia per lo studi delle serie temporali è la seguente. Ciascuno dei seguenti argomenti sarà oggetto di uno articolo o di una serie di articoli. Dopo aver esaminato a fondo questi metodi, saremo in grado di creare alcuni moderni e sofisticati modelli per esaminare i dati ad alta frequenza.

  • Introduzione alle serie temporali : questo articolo delinea l’area dell’analisi delle serie temporali, il suo ambito e come può essere applicato ai dati finanziari.
  • Correlazione – Un aspetto assolutamente fondamentale della modellazione delle serie temporali è il concetto di correlazione seriale . Lo definiremo e descriveremo una delle più grandi insidie dell’analisi delle serie temporali, ovvero che “la correlazione non implica causalità” .
  • Previsione – In questa sezione considereremo il concetto di previsione , ovvero fare previsioni relativamente alla direzione o al futuro livello per una particolare serie temporale e come viene eseguita nella pratica.
  • Modelli stocastici – Si prenderà in esame alcuni modelli stocastici che ampliano il concetto di Moto Browniano Geometrico e Volatilità Stocastica, inclusi il rumore bianco e i modelli autoregressivi .
  • Regressione – Quando abbiamo trend deterministici (opposti a quelli stocastici) nei dati, possiamo giustificare la loro estrapolazione utilizzando modelli di regressione. Considereremo sia la regressione lineare che non lineare e terremo conto della correlazione seriale.
  • Modelli stazionari – I modelli stazionari presumono che le proprietà statistiche di una serie (vale a dire la media e la varianza) siano costanti nel tempo. Possiamo utilizzare modelli Moving Average (MA), nonché combinarli con modelli autoregressivi per formare modelli ARMA.
  • Modelli non stazionari : molte serie temporali finanziarie non sono stazionarie, ovvero hanno media e varianza variabili. In particolare, i prezzi degli asset hanno spesso periodi di elevata volatilità. Per queste serie abbiamo bisogno di usare modelli non stazionari come ARIMA, ARCH e GARCH.
  • Modellazione multivariata – In passato abbiamo già descritto modelli multivariati su DataTrading, in particolare quando abbiamo considerato il mean-reverting per le coppie di azioni. In questa sezione definiremo più rigorosamente la cointegrazione e esamineremo ulteriori test per essa. Considereremo anche modelli vettoriali autoregressivi (VAR) [da non confondere con Value-at-Risk!].
  • Rappresentazione in spazio di Stato Modeling – E’ presa in prestito della moderna teoria del controllo utilizzata in ingegneria e ci permette di modellare le serie temporali con parametri che variano rapidamente (come la variabile di pendenza \(\beta\) tra due risorse cointegrate in una regressione lineare). In particolare, prenderemo in considerazione il famoso filtro di Kalman e il modello Markov nascosto . Questo sarà uno degli usi principali dell’analisi bayesiana nelle serie temporali.

Come queste Analisi sono collegati con altri articoli statistici su DataTrading?

L’obiettivo di DataTrading è sempre stato quello di provare a delineare il quadro matematico e statistico per l’analisi quantitativa e il trading quantitativo, dalle basi fino alle tecniche più avanzate.

Ad oggi abbiamo dedicato la maggior parte del tempo a tecniche introduttive e intermedie. Tuttavia, ora concentreremo la nostra attenzione sulle recenti tecniche avanzate, utilizzate dai hedge funds quantitativi.

Questo non solo aiuterà coloro che desiderano ottenere una carriera nel settore, ma fornirà anche ai trader retail tra di voi un kit di strumenti e metodi molto più ampio, nonché un approccio unificato al trading.

Si può affermare con certezza che la gran parte dei professionisti che lavorano nei fondi quantitativi utilizza tecniche molto sofisticate per “catturare l’alfa”.

Tuttavia, molte di queste aziende sono così grandi da non essere interessate a strategie con “capacità limitate”, ovvero quelle che non sono scalabili oltre 1-2 milioni di dollari. In qualità di retail, se possiamo applicare un sofisticato trading framework a queste aree, possiamo raggiungere una redditività a lungo termine.

Alla fine combineremo i nostri articoli sull’analisi delle serie temporali con l’approccio bayesiano alla verifica delle ipotesi e alla selezione del modello, insieme al codice Python, per produrre modelli di serie temporali non lineari e non stazionari che possono essere negoziate ad alta frequenza.

Inoltre, con il nostro software DTForex per il backtest ad alta frequenza di più coppie di valute, disponiamo di un framework già pronto per testare questi modelli, almeno sui mercati valutari.

Il prossimo articolo della serie discuterà la correlazione e il motivo per cui è uno degli aspetti più fondamentali dell’analisi delle serie temporali.