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.

Inferenza Bayesiana di una proporzione Binomiale – L’approccio Analitico

Nel precedente articolo relativo alle statistiche bayesiane è stata esaminata la regola di Bayes ed evidenziato come permette di aggiornare razionalmente le convinzioni sull’incertezza dopo aver avuto evidenza di nuove prove. E’ stato inoltre brevemente accennato che tali tecniche stanno diventando estremamente importanti nei campi della data science e della finanza quantitativa.

In questo articolo si vuole ampliare l’esempio del lancio di una moneta, descritto nel precedente articolo, approfondendo le nozioni relativa alle prove di Bernoulli, alla distribuzione beta e alla distribuzione a priori coniugata.

L’obiettivo in questo articolo consiste nel descrivere come eseguire quello che è noto come “inferenza su una proporzione binomiale”, cioè studiare le situazioni probabilistiche con due risultati (ad esempio il lancio di una moneta) e tentare di stimare la proporzione di un insieme ripetuto di eventi che si presentano un risultato “testa” o “croce”.

L’obiettivo è stimare quanto sia equa una moneta. Si usa questa stima per fare previsioni su quante volte uscirà “testa” nei futuri lanci della moneta.
Anche se questo può sembrare un esempio piuttosto accademico, in realtà è sostanzialmente applicabile alle applicazioni del mondo reale più di quanto possa sembrare. Si considera i seguenti scenari:

  • Ingegneria: stima della proporzione delle pale delle turbine degli aeromobili che presentano un difetto strutturale dopo la fabbricazione;
  • Scienze sociali: stima della percentuale di individui che rispondono “sì” a una domanda di censimento;
  • Scienza medica: stima della percentuale dei pazienti che recuperano completamente dopo aver assunto un farmaco sperimentale per curare una malattia;
  • Finanza aziendale: stima della percentuale di transazioni errate durante lo svolgimento di audit finanziari
  • Data Science: stima della percentuale di individui che fanno clic su un annuncio quando visitano un sito Web.

 

Come si può vedere, l’inferenza su una proporzione binomiale è una tecnica statistica estremamente importante e costituisce la base di molti degli aspetti avanzati delle statistiche bayesiane.

L'approccio Bayesiano

Dopo aver motivato il concetto di statistiche bayesiane nel precedente articolo, è necessario delineare come procedere l’analisi. Questo motiva le seguenti sezioni (matematicamente piuttosto pesanti) e offre una panoramica su cosa sia un approccio bayesiano.

Come detto sopra, l’obiettivo consiste nel stimare l’equità di una moneta. Una volta ottenuta la stima per l’equità della moneta, si può usarla per prevedere il numero di volte che uscirà “testa” nei futuri lanci della moneta.

Si approfondisce specifiche tecniche specifiche mentre si descrive i seguenti passaggi:

  • Presupposti – Si ipotizza che la moneta abbia due esiti (cioè non atterrerà mai su di un lato), i lanci sono completamente casuali ed indipendenti l’uno dall’altro. Inoltre la correttezza della moneta è stazionaria, cioè non cambia nel tempo. Si indica l’equità con il parametro θ.
  • Credenze precedenti – Per effettuare un’analisi bayesiana, si deve  quantificare le precedenti convinzioni sull’equità della moneta. Questo si riduce a specificare una distribuzione di probabilità sulle convinzioni di questa equità. Si utilizza una distribuzione di probabilità relativamente flessibile chiamata distribuzione beta per modellare le convinzioni.
  • Dati sperimentali – Si effettuano alcuni lanci di monete (virtuali) al fine di avere alcuni dati concreti. Si conteggia il numero di teste z che appaiono in N lanci della moneta. Si ha anche bisogno di un modo per determinare la probabilità di tali risultati, data una particolare correttezza, θ, della moneta. Per questo si ha bisogno di discutere le funzioni di verosimiglianza, e in particolare la funzione di verosimiglianza di Bernoulli.
  • Credenze a posteriori – Una volta ottenuta una credenza precedente e una funzione di verosimiglianza, si può usare la regola di Bayes per calcolare una credenza a posteriori sull’equità della moneta. Si associa le precedenti credenze con i dati osservati e si aggiorna di conseguenza le convinzioni. Fortunatamente, se si usa una distribuzione beta per le credenze precedenti e una probabilità di Bernoulli, si ottene una distribuzione beta anche a posteriori. Questi sono noti come conjugate priors.
  • Inferenza – Dopo aver ottenuto le credenze a posteriori, si può stimare l’equità della moneta θ, prevedere la probabilità delle teste al prossimo lancio o persino vedere come i risultati dipendono da diverse scelte delle credenze precedenti. Quest’ultimo è noto come confronto tra modelli.


Ad ogni fase del processo, si realizza rappresentazioni grafiche per ciascuna di queste funzioni e distribuzioni, utilizzando il pacchetto di grafica Seaborn di Python. Seaborn si basa sulla libreria Matplotlib, ed è ottimizzata per la visualizzazione di dati statistici. Si può dare un’occhiata a questa gallery per avere un’idea sul funzionamento e potenzialità di Seaborn.

Presupposti dell'approccio

Come per tutti i modelli, si devono fare alcune ipotesi sullo scenario di applicazione.

  • Si può ipotizzare la moneta possa avere solo due risultati, cioè può atterrare solo sulla sua testa o coda e mai sul suo lato.
  • Ogni lancio della moneta è completamente indipendente dagli altri, cioè si hanno lanci indipendenti e identicamente distribuiti.
  • La correttezza della moneta non cambia nel tempo, cioè è stazionaria.


Tenendo presente questi presupposti, si può iniziare a discutere la procedura bayesiana.

La Regola di Bayes

Nel precedente articolo è stata delineata la regola di Bayes come segue:

La Regola di Bayes applicata all'Inferenza Bayesiana

\( \begin{eqnarray} P(\theta|D) = P(D|\theta) \; P(\theta) \; / \; P(D) \end{eqnarray} \)

dove:
  • P(θ) è la probabilità a priori, o probabilità marginale, di θ. Questa è la forza nella nostra convinzione su θ senza considerare le prove D. La nostra precedente opinione sulla probabilità che la moneta sia equa e non truccata.
  • P(θ|D) è la probabilità a posteriori, o probabilità condizionata. Questa è la forza (raffinata) della nostra convinzione di θ una volta che l’evidenza di D è stata presa in considerazione. Dopo aver visto uscire 4 teste su 8 lanci della moneta, si può dire che questa è la nostra visione aggiornata sulla correttezza della moneta.
  • P(D|θ) è la probabilità condizionata di D. Questa è la probabilità di vedere i dati D come generati da un modello con parametro θ. Se si potesse sapere che la moneta era equa e non truccata, la probabilità condizionata di D esprime la probabilità di avere un determinato numero di risultati “testa” per un particolare numero di lanci.
  • P(D) è la prova, cioè la probabilità a priori di D, e funge da costante di normalizzazione. Questa è la probabilità dei dati D, determinata come somma (o integrazione) di tutti i possibili valori di θ, ponderati con un indice del grado di confidenza con cui si crede alla validità di quei particolari valori di θ.
Da notare che per calcolare la probabilità a posteriori si devono specificare tre distinti componenti. Sono la verosimiglianza, la probabilità a priori e l’evidenza. Nelle sezioni seguenti si descrive esattamente come specificare ciascuno di questi componenti per un particolare caso di inferenza su una proporzione binomiale.

La funzione di Verosimiglianza

La Distribuzione di Bernoulli

Si consideri una sequenza di lanci di una moneta. Si è interessati alla probabilità che esca una “​​testa”. In particolare, si vuole la probabilità che esca una “testa” in funzione del relativo parametro di equità θ. Questo avrà una forma funzionale, f. Se si indica con k la variabile casuale che descrive il risultato del lancio della moneta, appartenente all’insieme {1,0}, dove k = 1 rappresenta una testa e k = 0 rappresenta una croce, allora la probabilità di avere una testa, con una certa equità della moneta, è data da:

\( \begin{eqnarray} P(k = 1 | \theta) = f(\theta) \end{eqnarray} \)

Si può scegliere una forma particolarmente succinta per f(θ) semplicemente affermando che la probabilità è data dallo stesso θ, cioè \(f(\theta) = \theta\). Da questo si deduce che la probabilità di avere una “testa” dal lancio di una moneta è pari a:

\(\begin{eqnarray} P(k = 1 | \theta) = \theta \end{eqnarray} \)

E la probabilità di avere una “croce” è pari a:

\( \begin{eqnarray} P(k = 0 | \theta) = 1-\theta \end{eqnarray} \)

che può anche essere descritto come:

\(\begin{eqnarray} P(k | \theta) = \theta^k (1 – \theta)^{1-k} \end{eqnarray} \)

dove \(k \in \{1, 0\}\) e \(\theta \in [0,1]\). Questa è nota come Distribuzione di Bernoulli. Fornisce la probabilità su due valori discreti separati di k per un parametro di equità fisso θ. In sostanza, quantifica la probabilità che esca “testa” o “croce” a seconda di quanto sia equa la moneta.

La funzione di Verosimiglianza di Bernoulli

Si può considerare un altro modo per osservare la funzione di cui sopra. Se si considera un’osservazione fissa, cioè un risultato noto, k, del lancio di una moneta e il parametro di equità θ come variabile continua, allora:

\( \begin{eqnarray} P(k | \theta) = \theta^k (1 – \theta)^{1-k} \end{eqnarray} \)

descrive la probabilità di un risultato fisso k dato un particolare valore di θ. Mentre si modifica θ (ad esempio cambiando l’equità della moneta), si inizia a vedere diverse probabilità per k. Questo è noto come la funzione di verosimiglianza di θ. È una funzione di un θ continuo e si distingue dalla distribuzione di Bernoulli perché quest’ultima è in realtà una distribuzione di probabilità discreta su due potenziali risultati k del lancio della moneta. Da notare che la funzione di verosimiglianza non è in realtà una distribuzione di probabilità poiché l’integrazione di tutti i valori del parametro di equità θ in realtà non è uguale a 1, come richiesto per una distribuzione di probabilità. Si definisce \(P(k | \theta) = \theta^k (1 – \theta)^{1-k}\) come la funzione di verosimiglianza di Bernoulli per θ.

Lanci Multipli della moneta

La funzione di verosimiglianza di Bernoulli può essere usata per determinare la probabilità di vedere una particolare sequenza di N lanci, data dall’insieme \(\{k_1, …, k_N\}\). Poiché ciascuno di questi lanci è indipendente da qualsiasi altro, la probabilità che la sequenza si verifichi è semplicemente il prodotto della probabilità di ogni lancio. Se si considera uno specifico parametro di equità θ, allora la probabilità di vedere questo particolare insieme di lanci è data da:

\( \begin{eqnarray} P(\{k_1, …, k_N\} | \theta) &=& \prod_{i} P(k_i | \theta) \\ &=& \prod_{i} \theta^{k_i} (1 – \theta)^{1-{k_i}} \end{eqnarray} \)

Per esempio, se si è interessati al numero di “teste” uscite in N lanciChe dire se siamo interessati al numero di teste, dato z il numero di teste uscite, allora la formula sopra diventa:

\( \begin{eqnarray} P(z, N | \theta) = \theta^z (1 – \theta)^{N-z} \end{eqnarray} \)

Cioè, la probabilità di avere z “teste” in N lanci, assumendo un parametro di equità θ. Si userà questa formula per determinare la distribuzione delle credenze posteriori, come descritto più avanti in questo articolo.

Quantificare le Credenze a Priori

Un passo estremamente importante nell’approccio bayesiano è determinare le probabilità a priori delle credenze di partenza e quindi trovare un modo per quantificarle. Nell’approccio bayesiano bisogna determinare le credenze precedenti sui parametri e quindi trovare una distribuzione di probabilità che quantifichi queste convinzioni. In questo caso si è interessati alle precedenti convinzioni sulla correttezza della moneta, cioè si desidera quantificare l’incertezza relativa alla possibilità che la moneta sia truccata. Per fare ciò bisogna capire l’intervallo di valori che θ può assumere e la probabilità (ipotetica) del verificarsi di ognuno di questi valori. \(\theta=0\) indica una moneta per cui esce sempre corce, mentre \(\theta=1\) implica una moneta per cui esce sempre testa. Una moneta equa è denotata da \(\theta=0,5\). Quindi \(\theta \in [0,1]\). Questo implica che la nostra distribuzione di probabilità deve esistere nell’intervallo [0,1]. La domanda diventa: quale distribuzione di probabilità usare per quantificare le credenze a priori sulla moneta?

Distribuzione Beta

In questo caso si sceglie la distribuzione beta. La funzione di densità di probabilità della distribuzione beta corrisponde a:

\( \begin{eqnarray} P(\theta | \alpha, \beta) = \theta^{\alpha – 1} (1 – \theta)^{\beta – 1} / B(\alpha, \beta) \end{eqnarray} \)

Dove il termine nel denominatore, \(B(\alpha, \beta)\), agisce come una costante normalizzante in modo che l’area sotto il PDF abbia in realtà somma pari a 1. Nel grafico seguente si rappresentano diverse distribuzione beta a seconda dei parametri α e β:
Fig - Rappresentazione di diverse della distribuzione beta per vari parametri α e β.
Il codice Python per produrre questo grafico è il seguente:
            import numpy as np
from scipy.stats import beta
import matplotlib.pyplot as plt
import seaborn as sns


if __name__ == "__main__":
    sns.set_palette("deep", desat=.6)
    sns.set_context(rc={"figure.figsize": (8, 4)})
    x = np.linspace(0, 1, 100)
    params = [
        (0.5, 0.5),
        (1, 1),
        (4, 3),
        (2, 5),
        (6, 6)
    ]
    for p in params:
        y = beta.pdf(x, p[0], p[1])
        plt.plot(x, y, label="$\\alpha=%s$, $\\beta=%s$" % p)
    plt.xlabel("$\\theta$, Fairness")
    plt.ylabel("Density")
    plt.legend(title="Parameters")
    plt.show()
        

Essenzialmente, quando α diventa più grande, la maggior parte della distribuzione di probabilità si muove verso destra (una moneta truccata per avere più “teste”), mentre un aumento di β sposta la distribuzione verso sinistra (una moneta truccata per avere più “croci”) .

Tuttavia, se si aumenta sia α che β, la distribuzione inizia a restringersi. Se α e β aumentano ugualmente, allora la distribuzione raggiungerà un picco per θ = 0,5, cioè quando la moneta è equa.

Perché si è scelto la funzione beta come probabilità a priori? Ci sono un paio di motivi:

  • Supporto – La funzione è definito nell’intervallo [0,1], lo stesso intervallo di esistenza di θ.
  • Flessibilità – Possiede due parametri di forma conosciuti come α e β, che gli conferiscono una notevole flessibilità. Questa flessibilità offre una vasta scelta delle modalità per modelliamo le credenze.

Tuttavia, la ragione più importante per scegliere una distribuzione beta è dovuta al fatto che questa è una distribuzione a priori congiunta (conjugate prior) per la distribuzione di Bernoulli.

Distribuzione a Priori Coniugata

Nella regola di Bayes, riportata sopra, è evidente che la distribuzione a posteriori è proporzionale al prodotto della distribuzione precedente e alla funzione di verosimiglianza:

\( \begin{eqnarray} P(\theta | D) \propto P(D|\theta) P(\theta) \end{eqnarray} \)

Una distribuzione a priori coniugata è una possibile scelta per descrivere la probabilità a priori perché, quando accoppiata con uno specifico tipo di funzione di verosimiglianza, fornisce una distribuzione a posteriori appartenente alla stessa famiglia della distribuzione a priori. Sia a priori che sia a posteriori hanno la stessa famiglia di distribuzione di probabilità, ma con parametri diversi. I conjugate prior sono estremamente convenienti dal punto di vista del calcolo poiché forniscono espressioni di forma chiusa per la distribuzione a posteriori, annullando in tal modo qualsiasi complessa integrazione numerica. Per il nostro esempio, se si usa una funzione di verosimiglianza di Bernoulli e una distribuzione beta come descrivere la probabilità a priori si ottiene immediatamente che la probabilità a posteriori sarà anch’essa una distribuzione beta. L’utilizzo di una distribuzione beta per la probabilità a priori implica la possibilità di effettuare lanci di monete sperimentali e perfezionare direttamente le convinzioni. La probabilità a posteriori diventerà la nuova probabilità a priori ed è possibile usare la regola di Bayes in successione quando vengono generati nuovi lanci di monete. Se la precedente credenza è specificata da una distribuzione beta e si ha una funzione di verosimiglianza di Bernoulli, allora anche la probabilità a posteriori sarà anche una distribuzione beta. Da notare tuttavia che un priore è solo coniugato rispetto a una particolare funzione di probabilità.

Perché coniugare una Distribuzione Beta con una funzione di Verosimiglianza di Bernoulli?

Si può utilizzare un semplice calcolo per dimostrare che scegliere la distribuzione beta per la probabilità a priori, con una verosimiglianza di Bernoulli, fornisce una distribuzione beta per la probabilità a posteriori. Come accennato in precedenza, la funzione di densità di probabilità di una distribuzione beta, per uno specifico parametro θ, è data da:

\( \begin{eqnarray} P(\theta | \alpha, \beta) = \theta^{\alpha – 1} (1 – \theta)^{\beta – 1} / B(\alpha, \beta) \end{eqnarray} \)

Da notare che la forma della distribuzione beta è simile alla forma di una verosimiglianza di Bernoulli. Infatti, se si moltiplicano le due forme (come nella regola di Bayes), si ottiene:

\( \begin{eqnarray} \theta^{\alpha – 1} (1 – \theta)^{\beta – 1} / B(\alpha, \beta) \times \theta^{k} (1 – \theta)^{1-k} \propto \theta^{\alpha + k – 1} (1 – \theta)^{\beta + k} \end{eqnarray} \)

Il termine sul lato destro del segno di proporzionalità ha la stessa forma del prior (a meno di una costante normalizzante).

Differenti modi per specificare una Distribuzione Beta

Finora è stato descritto come utilizzare una distribuzione beta per specificare le convinzioni precedenti relative alla correttezza della moneta. Tuttavia, si hanno solo due parametri con cui giocare, vale a dire α e β. In che modo questi due parametri corrispondono alla significato più intuitivo di “verosimiglianza” e “incertezza” nella corretta della moneta? Bene, questi due concetti corrispondono perfettamente alla media e alla varianza della distribuzione beta. Quindi, se si trova una relazione tra questi due valori e i parametri α e β, si può più facilmente specificare le nostre convinzioni. Si scopre (vedi l’articolo di Wikipedia sulla distribuzione beta) che la media μ è data da:

\( \begin{eqnarray} \mu = \frac{\alpha}{\alpha + \beta} \end{eqnarray} \)

Mentre la deviazione standard σ è data da:

\( \begin{eqnarray} \sigma = \sqrt{\frac{\alpha \beta}{(\alpha + \beta)^2 (\alpha + \beta + 1)}} \end{eqnarray} \)

Quindi, riorganizzando queste formule per fornire α e β in termini di μ e σ. α si ottiene:

\( \begin{eqnarray} \alpha = \left( \frac{1-\mu}{\sigma^2} – \frac{1}{\mu} \right) \mu^2 \end{eqnarray} \)

Mentre β è dato da:

\( \begin{eqnarray} \beta = \alpha \left( \frac{1}{\mu} – 1 \right) \end{eqnarray} \)

In questo passaggio è necessario prestare molta attenzione perché non è possibile specificare un σ > 0,289, dato che questa è la deviazione standard di una densità uniforme (che implica nessuna credenza precedente su ogni specifica equità della moneta). Ad esempio, se si ipotizza una equità della moneta intorno allo 0,5, ma senza l’assoluta certezza. Si può specificare una deviazione standard di circa 0,1. Quale distribuzione beta sarà prodotta come risultato? Inserendo i numeri nelle formule si ottine α = 12 e β = 12 e la distribuzione beta è simile alla seguente:
Fig - Una distribuzione Beta con α=12 e β=12.
Da notare come, nonostante il picco sia centrato attorno allo 0,5, è presente una significativa incertezza in questa credenza che è rappresentata dalla larghezza della curva.

Introduzione alla Statistica Bayesiana

Negli ultimi mesi abbiamo descritto su DataTrading molti aspetti del trading quantitativo quali i modelli di machine learning, l’analisi delle serie temporali e l’implementazione di un’ambiente di backtesting. A questo punto è utile introdurre le moderne tecniche matematiche che sono alla base non solo della finanza quantitativa e del trading algoritmico, ma anche dei campi emergenti della scienza dei dati e dell’apprendimento statistico delle macchine.

Le competenze quantitative sono ora molto richieste non solo nel settore finanziario, ma anche nelle startup tecnologiche, e per l’analisi dati delle grandi aziende.

Prima di iniziare a discutere le moderne tecniche di “bleeding edge”, è necessario avere una solida comprensione delle sottostanti teorie matematiche e statistiche, che sono alla base di questi modelli. Una tecnica fondamentale è quella delle statistiche bayesiane. Fino ad oggi in questo sito non è stato pubblicato nessun articolo relativo ai metodi bayesiani. Questo articolo è stato scritto per aiutare a capire la “filosofia” dell’approccio bayesiano, come si confronta con l’approccio tradizionale / classico alle statistiche e le potenziali applicazioni nella finanza quantitativa e scienza dei dati.

In particole in questo articolo si:

  • Definisce le statistiche bayesiane (o inferenza bayesiana)
  • Confronta le statistiche classiche con le statistiche bayesiane
  • Descrive la famosa regola di Bayes, uno strumento essenziale per l’inferenza bayesiana
  • Interpreta e applica la regola di Bayes per eseguire l’inferenza bayesiana
  • Descrive un concreto esempio di coin-flip probabilistico di inferenza bayesiana

Che cos'è la Statistica Bayesiana?

Le statistiche bayesiane rappresentano un particolare approccio all’applicazione della probabilità ai problemi statistici. Fornisce gli strumenti matematici per avere evidenza su stati o eventi casuali in termini di gradi di credibilità o più specificamente di probabilità bayesiana

In particolare l’inferenza bayesiana interpreta la probabilità come una misura della credibilità o della fiducia che un individuo può avere sul reale verificarsi di un particolare evento.

Si può avere una precedente convinzione su un evento, ma è probabile che le convinzioni cambino quando nuove prove vengono portate alla luce. Le statistiche bayesiane forniscono un solido mezzo matematico per incorporare le precedenti credenze e prove per produrre nuove credenze a posteriori.

Le statistiche bayesiane ci forniscono strumenti matematici per aggiornare razionalmente le nostre convinzioni soggettive alla luce di nuovi dati o prove.

Questo è in contrasto con un’altra forma di inferenza statistica, nota come statistica classica o frequentista, che presuppone che le probabilità siano la frequenza di particolari eventi casuali che si verificano in una lunga serie di prove ripetute.

Per esempio, mentre si lancia ripetutamente un dado equo a sei facce (cioè non pesato), si ha che che ogni numero sul dado tende ad uscire per circa un 1/6 volte.

La statistica frequentista presuppone che le probabilità siano la frequenza di lungo periodo di eventi casuali in prove ripetute.

Quando si effettuano inferenze statistiche, cioè inferendo informazioni statistiche da sistemi probabilistici, i due approcci – frequentista e bayesiano – hanno filosofie molto diverse.

La statistica frequentista cerca di eliminare l’incertezza fornendo stime. La statistica bayesiana cerca di preservare e perfezionare l’incertezza adeguando le credenze individuali alla luce di nuove prove.

Frequentista (o Empirica) vs Bayesiana

Per chiarire la distinzione tra le due diverse filosofie statistiche, si considerano due esempi di sistemi probabilistici:

  • Coin flip – Qual è la probabilità che esca testa per una moneta truccata?
  • Elezione di un particolare candidato per il Primo Ministro – Qual è la probabilità di vedere vincere un singolo candidato, che non è mai stato candidato in precedenza?

 

La seguente tabella descrive le filosofie alternative dell’approccio frequentista e bayesiano:

EsempioApproccio FrequentistaApproccio Bayesiano
Lancio di una moneta truccataLa probabilità di vedere il risultato “testa” nei lanci di una moneta truccata corrisponde alla frequenza dei risultati “testa” dopo un elevato numero di lanci indipendenti della moneta. Cioè, mentre si esegue più lanci di monete il numero di teste ottenute, come proporzione dei lanci totali, tende alla probabilità “vera” o “fisica” che il lancio della della moneta produca una testa. In particolare, l’individuo che esegue l’esperimento non incorpora le proprie convinzioni sulla correttezza delle altre monete.Prima di ogni lancio della moneta, un individuo può considerare che la moneta non sia truccata. Dopo pochi lanci la moneta esce continuamente teste. Quindi la precedente convinzione sulla correttezza della moneta viene modificata per tenere conto del fatto che sono uscite tre teste di fila e quindi la moneta potrebbe essere truccata. Dopo 500 lanci, con 400 teste, l’individuo crede che la moneta sia molto probabile truccata. La credenza a posteriori è fortemente modificata rispetto alle ipotesi di partenza.
Elezioni del canditatoIl candidato si candida per la prima volta per questa particolare elezione e quindi non si possono eseguire “prove ripetute”. In un contesto frequentista si costruisco prove “virtuali” del processo elettorale. La probabilità di vittoria del candidato è definita come la frequenza relativa di vittorie del candidato nelle prove “virtuali”, come frazione di tutte le prove.Un individuo ha una precedente convinzione sulle possibilità di un candidato di vincere un’elezione e la sua fiducia può essere quantificata come probabilità. Tuttavia, un altro individuo potrebbe anche avere una credenza anteriore diversa e quindi una diversa sulla probabilità dello stesso candidato. Quando arrivano nuovi dati, entrambe le convinzioni sono (razionalmente) aggiornate dalla procedura bayesiana.
Quindi nell’interpretazione bayesiana la probabilità è la sintesi dell’opinione di un individuo. Un punto chiave è che diversi individui (intelligenti) possono avere opinioni diverse (e quindi diverse credenze), poiché hanno un diverso accesso ai dati e diverso modi di interpretarli. Tuttavia, poiché entrambi questi individui incontrano nuovi dati a cui entrambi hanno accesso, le loro credenze precedenti (potenzialmente diverse) porteranno a credenze a posteriori che cominceranno a convergere l’una verso l’altra, sotto la procedura di aggiornamento razionale dell’inferenza bayesiana. Nel contesto bayesiano un individuo applica una probabilità pari a 0 quando non ha fiducia nel verificarsi di un evento, mentre applica una probabilità pari a 1 quando è assolutamente certo del verificarsi di un evento. Se assegnano una probabilità tra 0 e 1, si consente una ponderata confidenza con altri potenziali risultati. Per eseguire l’inferenza bayesiana, si deve utilizzare un famoso teorema di probabilità noto come regola di Bayes e interpretarlo nel modo corretto. Nel riquadro seguente, si deriva la regola di Bayes usando la definizione di probabilità condizionale. Tuttavia, non è essenziale seguire questo procedimento per usare i metodi bayesiani, quindi sentitevi liberi di saltare la prossima sezione se si vuol andare direttamente alla descrizione su come usare la regola di Bayes.

La Regola di Bayes

Si consideri la definizione di probabilità condizionale, che fornisce una regola per determinare la probabilità di un evento A, data l’esistenza di un altro evento B. Un esempio potrebbe essere “Qual è la probabilità che piova quando ci sono nuvole nel cielo ” La definizione matematica della probabilità condizionale è la seguente:

\( \begin{eqnarray} P(A|B) = \frac{P(A \cap B)}{P(B)} \end{eqnarray} \)

Questo formula afferma che la probabilità che si verifichi A, sapendo che si è verificato B, cioè esprime una “correzione” delle aspettative per A dettata dall’osservazione di B, corrisponde alla la probabilità congiunta dei due eventi, ovvero la probabilità che si verifichino entrambi, in rapporto alla probabilità di B. Nell’esempio precedente significa la probabilità che piova dato che ci sono le nuvole è uguale alla probabilità che la pioggia e la presenza di nuvole si verificano insieme, in relazione alla probabilità di avere nuvole in cielo. Se si moltiplica entrambi i fattori di questa equazione per P(B) si ottiene:

\( \begin{eqnarray} P(B) P(A|B) = P(A \cap B) \end{eqnarray} \)

Ma, si può semplicemente fare lo stesso ragionamento per P(B|A), che è simile a chiedere “Qual è la probabilità di vedere le nuvole, dato che sta piovendo?”:

\( \begin{eqnarray} P(B|A) = \frac{P(B \cap A)}{P(A)} \end{eqnarray} \)

Dato che P(A∩B)=P(B∩A), sostituendo il precedente e moltiplicando per P(A), si ottiene:

\( \begin{eqnarray} P(A) P(B|A) = P(A \cap B) \end{eqnarray} \)

Ora si può confrontare tra loro le due espressioni per P(A∩B):

\( \begin{eqnarray} P(B) P(A|B) = P(A) P(B|A) \end{eqnarray} \)

Se ora si divide entrambi i lati per P(B) si ottiene la famosa regola di Bayes:

\( \begin{eqnarray} P(A|B) = \frac{P(B|A) P(A)}{P(B)} \end{eqnarray} \)

Tuttavia, per il successivo utilizzo della regola di Bayes è utile scrivere il denominare, P(B) in termini di P(B|A). Si può considerare P(B) come:

\( \begin{eqnarray} P(B) = \sum_{a \in A} P(B \cap A) \end{eqnarray} \)

Questo è possibile perché gli eventi A sono una partizione sufficiente ampio dello spazio campione. In questo modo sostituendo la definizione della probabilità condizionata si ottiene:

\( \begin{eqnarray} P(B) = \sum_{a \in A} P(B \cap A) = \sum_{a \in A} P(B|A) P(A) \end{eqnarray} \)

Infine, si può sostituire P(B) nella regola di Bayes e si ottiene una versione alternativa della stessa regola di Bayes, che è ampiamente usata nell’inferenza bayesiana:

\( \begin{eqnarray} P(A|B) = \frac{P(B|A) P(A)}{\sum_{a \in A} P(B|A) P(A)} \end{eqnarray} \)

Ora che si è definita la regola di Bayes, si è in grado di applicarla all’inferenza statistica.

Applicazione della Regola di Bayes per l'Inferenza Bayesiana

Come affermato all’inizio di questo articolo, l’idea di base dell’inferenza bayesiana consiste nell’aggiornare continuamente le convinzioni precedenti sugli eventi quando vengono presentate nuove prove. Questo è un modo molto naturale per studiare gli eventi probabilistici. Man mano che si accumulano sempre più prove, le precedenti convinzioni sono costantemente “sbiadite” da qualsiasi nuovo dato. Si consideri l’evento (piuttosto privo di senso) che la Luna sta andando a scontrarsi con la Terra. Per ogni notte che passa, l’applicazione dell’inferenza bayesiana tenderà a correggere la nostra precedente credenza in una credenza a posteriori secondo cui la Luna ha sempre meno probabilità di entrare in collisione con la Terra, poiché rimane in orbita. Per dimostrare un concreto esempio numerico di inferenza bayesiana è necessario introdurre qualche nuova notazione. In primo luogo, si deve considerare il concetto di parametri e modelli. Un parametro potrebbe essere l’osservazione della una moneta truccata, che si può etichettare come \(\theta\). Quindi \(\theta = P(H)\) descriverebbe la distribuzione di probabilità delle convinzioni che uscirà testa dopo il lancio della moneta. Il modello è il mezzo effettivo per codificare matematicamente questo lancio. In questo caso, il lancio della moneta può essere modellato come una prova di Bernoulli.

La Prova di Bernoulli

La prova di Bernoulli è un esperimento casuale con solo due risultati, di solito etichettati come “successo” o “fallimento”, in cui la probabilità del successo è esattamente la stessa ogni volta che viene eseguita la sperimentazione. La probabilità del successo è data da \(\theta\), che è un numero compreso tra 0 e 1. Quindi \(\theta \in [0,1]\).

Nel corso dell’esperimento di alcuni esperimenti di lancio di una moneta (ripetute prove di Bernoulli) si generano alcuni dati, \(D\), relativamente ai risultati testa o croce.

Una naturale domanda da porsi è “Qual è la probabilità di vedere 3 teste in 8 lanci (8 prove di Bernoulli), data una moneta equa (\(\theta = 0,5\))?”.

Un modello ci aiuta ad accertare la probabilità di vedere questi dati, \(D\), dato un valore del parametro \(\theta\). La probabilità di vedere i dati \(D\) sotto un particolare valore di \(\theta\) è data dalla seguente notazione: \(P(D|\theta)\).

Tuttavia, si può essere interessati anche alla domanda alternativa: “Qual è la probabilità che la moneta sia non truccata, dato che si è verifica una particolare sequenza di teste e croci?”.

Quindi si è interessati alla distribuzione di probabilità che riflette la convinzione su diversi valori possibili di \(\theta\), dato che abbiamo osservato alcuni dati \(D\). Questo è denotato da \(P(\theta|D)\). Si noti che questo è l’opposto di \(P(D|\theta)\). Quindi, come è possibile ottenere un valore reale tra queste due probabilità? Si scopre che la regola di Bayes è il collegamento che consente di passare tra queste due situazioni.

La Regola di Bayes applicata all'Inferenza Bayesiana

\(
\begin{eqnarray}
P(\theta|D) = P(D|\theta) \; P(\theta) \; / \; P(D)
\end{eqnarray}
\)

dove:

  • P(θ) è la probabilità a priori, o probabilità marginale, di θ. Questa è la forza nella nostra convinzione su θ senza considerare le prove D. La nostra precedente opinione sulla probabilità che la moneta sia equa e non truccata.
  • P(θ|D) è la probabilità a posteriori, o probabilità condizionata. Questa è la forza (raffinata) della nostra convinzione di θ una volta che l’evidenza di D è stata presa in considerazione. Dopo aver visto uscire 4 teste su 8 lanci della moneta, si può dire che questa è la nostra visione aggiornata sulla correttezza della moneta.
  • P(D|θ) è la probabilità condizionata di D. Questa è la probabilità di vedere i dati D come generati da un modello con parametro θ. Se si potesse sapere che la moneta era equa e non truccata, la probabilità condizionata di D esprime la probabilità di avere un determinato numero di risultati “testa” per un particolare numero di lanci.
  • P(D) è la prova, cioè la probabilità a priori di D, e funge da costante di normalizzazione. Questa è la probabilità dei dati D, determinata come somma (o integrazione) di tutti i possibili valori di θ, ponderati con un indice del grado di confidenza con cui si crede alla validità di quei particolari valori di θ.

L’obiettivo dell’inferenza bayesiana è fornire una procedura razionale e matematicamente valida per incorporare le nostre credenze precedenti, con qualsiasi prova a portata di mano, al fine di produrre una nuova credenza a posteriori. Ciò che rende questa tecnica così importante è la possibilità che le credenze a posteriori siano usate come credenze precedenti nella generazione di nuovi dati. Quindi l’inferenza bayesiana ci consente di adeguare continuamente le nostre convinzioni con nuovi dati, applicando ripetutamente la regola di Bayes.

In questo articolo è stata introdotta molta teoria da comprendere, quindi è bene vedere un esempio concreto utilizzando l’antico strumento degli statistici: il lancio di una moneta.

Esempio del Lancio di una Moneta

In questo esempio si considera molti lanci di una moneta equa, cioè non truccata. Si utilizza l’inferenza bayesiana per aggiornare le convinzioni sulla correttezza della moneta quando sono disponibili più dati (cioè più lanci di monete). La moneta sarà effettivamente equa, ma non lo si saprà fino a quando non verranno effettuate le prove. All’inizio non si ha una precedente convinzione sulla correttezza della moneta, cioè, si può dire che ogni livello di equità è altrettanto probabile.

Nel linguaggio statistico si eseguono N ripetuti test di Bernoulli con θ = 0.5. Si usa una distribuzione uniforme come mezzo per caratterizzare la precedente convinzione relativa ai dubbi sull’equità. Questo afferma che si considera ogni livello di equità (o ogni valore di θ) ugualmente probabile.

Si usa poi una procedura di aggiornamento bayesiano per passare dalle credenze precedenti alle credenze posteriori osservando nuovi lanci di monete. Questo viene eseiguito utilizzando una particolare procedura matematica che si basa sulla Conjugate Prior, cioè la distribuzione a priori coniugata, che fornisce gli strumenti per spiegare come l’esempio del lancio della moneta viene eseguito nella pratica.

La distribuzione uniforme è in realtà un caso più specifico di un’altra distribuzione di probabilità, nota come distribuzione Beta. Dato che, con il modello binomiale, se si usa una distribuzione Beta per le convinzioni precedenti si ottiene una distribuzione Beta anche per le convinzioni a posteriori. Questo è un risultato matematico estremamente utile, in quanto le distribuzioni Beta sono abbastanza flessibili nelle convinzioni di modellazione. Tuttavia, non voglio soffermarmi troppo su questi dettagli, dato che ne discuteremo nel prossimo articolo. In questa fase, queste distribuzioni consentono di creare facilmente alcune rappresentazioni grafiche che enfatizzano la procedura bayesiana!

Nella seguente figura si possono vedere 6 casi particolari in cui sono stati effettuato un certo numero di prove di Bernoulli (lancio di moneta). Nella prima sotto-trama non sono state effettuato prove e quindi la funzione di densità di probabilità (in questo caso la densità precedente) è la distribuzione uniforme. Dichiara che si ha la stessa credenza in tutti i valori di θ che rappresentano l’equità della moneta.

Il pannello successivo mostra 2 prove effettuate ed per entrambe è uscito testa. La procedura bayesiana che utilizza le distribuzioni Beta consente ora di aggiornare a posteriori la densità. Da notare come in questo il peso della densità è ora spostato sul lato destro del grafico. Questo indica che la precedente credenza di eguale probabilità di equità della moneta, accoppiata con 2 nuovi punti di dati, porta a credere che la moneta abbia più probabilità di essere truccata (distorta verso le teste).

I successivi due grafici mostrano rispettivamente 10 e 20 prove. Da notare che nonostante aver ottenuto 2 croci in in 10 prove, si crede ancora che la moneta sia ingiusta e distorta nei confronti delle teste. Dopo 20 prove, si è ottenuto qualche croce in più. La densità della probabilità è ora spostata più vicino a θ = P(H) = 0,5. Quindi si sta iniziando a credere che probabilmente moneta sia equa.

Dopo 50 e 500 prove, ora stiamo iniziando a credere che l’equità della moneta sia molto probabilmente intorno a θ = 0,5. Ciò è indicato dalla larghezza restringente della densità di probabilità, che ora è raggruppata strettamente attorno a θ = 0.46 nel pannello finale. Se dovessimo effettuare altre 500 prove (dal momento che la moneta è effettivamente giusta) vedremmo questa densità di probabilità diventare ancora più stretta e centrata più vicino a θ = 0,5.

Fig - Procedura di aggiornamento bayesiano utilizzando il modello beta-binomiale
Quindi si può vedere che l’inferenza bayesiana fornisce una procedura razionale per passare da una situazione incerta con informazioni limitate a una situazione più certa con una quantità significativa di dati. Nel prossimo articolo si descrive la nozione della distribuzione a priori coniugata in modo più approfondito, il che semplifica fortemente la matematica per eseguire l’inferenza bayesiana in questo esempio. Per completezza, si fornisce il codice Python (fortemente commentato) per la produzione di questa trama. Fa uso del modello statistico di SciPy, in particolare, la distribuzione Beta:
            if __name__ == "__main__":
    # Create a list of the number of coin tosses ("Bernoulli trials")
    number_of_trials = [0, 2, 10, 20, 50, 500]

    # Conduct 500 coin tosses and output into a list of 0s and 1s
    # where 0 represents a tail and 1 represents a head
    data = stats.bernoulli.rvs(0.5, size=number_of_trials[-1])
    
    # Discretise the x-axis into 100 separate plotting points
    x = np.linspace(0, 1, 100)
    
    # Loops over the number_of_trials list to continually add
    # more coin toss data. For each new set of data, we update
    # our (current) prior belief to be a new posterior. This is
    # carried out using what is known as the Beta-Binomial model.
    # For the time being, we won't worry about this too much. It 
    # will be the subject of a later article!
    for i, N in enumerate(number_of_trials):
        # Accumulate the total number of heads for this 
        # particular Bayesian update
        heads = data[:N].sum()

        # Create an axes subplot for each update 
        ax = plt.subplot(len(number_of_trials) / 2, 2, i + 1)
        ax.set_title("%s trials, %s heads" % (N, heads))

        # Add labels to both axes and hide labels on y-axis
        plt.xlabel("$P(H)$, Probability of Heads")
        plt.ylabel("Density")
        if i == 0:
            plt.ylim([0.0, 2.0])
        plt.setp(ax.get_yticklabels(), visible=False)
                
        # Create and plot a  Beta distribution to represent the 
        # posterior belief in fairness of the coin.
        y = stats.beta.pdf(x, 1 + heads, 1 + N - heads)
        plt.plot(x, y, label="observe %d tosses,\n %d heads" % (N, heads))
        plt.fill_between(x, 0, y, color="#aaaadd", alpha=0.5)

    # Expand plot to cover full width/height and show it
    plt.tight_layout()
    plt.show()
        

Derivazione dell’Equazione di Black-Scholes

trading-algoritmico-calcolo-stocastico

Ora che abbiamo derivato il Lemma di Ito , siamo in grado di derivare l’equazione di Black-Scholes.

Supponiamo di voler valutare un credito contingente europeo vanilla \(C\), su un asset variabile nel tempo \(S\), che maturerà a \(T\). Assumeremo che \(S\) segua un moto browniano geometrico con tasso di crescita medio di \(\mu\) e volatilità \(\sigma\). \(r\) rappresenterà il tasso di interesse privo di rischio a capitalizzazione continua. \(r\), \(\mu\) e \(\sigma\) non sono funzioni del tempo, \(t\) o del prezzo dell’asset \(S\) e quindi sono fissi per la durata dell’opzione.

Poiché il nostro prezzo dell’opzione, \(C\), è una funzione del tempo \(t\) e del prezzo dell’asset \(S\), useremo la notazione \(C = C(S, t)\) per rappresentare il prezzo dell’opzione. Notare che in questa fase stiamo assumendo che \(C\) esista e sia ben definito. In seguito dimostreremo che questa è un’affermazione giustificata.

Il primo passo è utilizzare il Lemma di Ito sulla funzione \(C(S, t)\) per darci un SDE:

\(\begin{eqnarray} dC = \frac{\partial C}{\partial t} dt + \frac{\partial C}{\partial S} (S,t) dS + \frac{1}{2}\frac{\partial^2 C}{\partial S^2}(S,t)dS^2 \end{eqnarray}\)

Il nostro prezzo dell’asset è modellato da un moto browniano geometrico, la cui espressione è qui richiamata. Nota che \(\mu\) e \(\sigma\) sono costanti, cioè non funzioni di \(S\) o \(t\):

\(\begin{eqnarray*} dS(t) = \mu S(t)dt + \sigma S(t) dX(t) \end{eqnarray*}\)

Possiamo sostituire questa espressione nel Lemma di Ito per ottenere:

\(\begin{eqnarray*} dC = \left(\frac{\partial C}{\partial t} (S,t) + \mu S \frac{\partial C}{\partial S} (S,t) + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 C}{\partial S^2}(S,t)\right)dt + \sigma S \frac{\partial C}{\partial S} (S,t) dX \end{eqnarray*}\)

Il fulcro del nostro argomento di derivazione sarà essenzialmente quello di affermare che un portafoglio completamente coperto, eliminati tutti i rischi, crescerà al tasso privo di rischio. Pertanto, dobbiamo determinare come cambia il nostro portafoglio nel tempo. Nello specifico, siamo interessati alla variazione infinitesimale di una combinazione di un’opzione call e una quantità di asset. La quantità sarà indicata con \(\Delta\). Quindi:

\(\begin{eqnarray*} d(C+\Delta S) = \left(\frac{\partial C}{\partial t} (S,t) + \mu S \frac{\partial C}{\partial S} (S,t) + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 C}{\partial S^2}(S,t) + \Delta \mu S\right) dt + \Delta S \left(\frac{\partial C}{\partial S}+\Delta\right) dX \end{eqnarray*}\)

Questo ci porta a scegliere \(\Delta\) che eliminerà il termine associato alla casualità. Se impostiamo \(\Delta = -\frac {\partial C} {\partial S} (S, t) \) riceviamo:

\(\begin{eqnarray*} d(C+\Delta S) = \left(\frac{\partial C}{\partial t}(S,t) + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 C}{\partial S^2}(S,t)\right)dt \end{eqnarray*}\)

Si noti che abbiamo sorvolato sulla questione di quale sia la derivata di \(\Delta\). Torneremo su questo più tardi.

Questa tecnica è nota come Delta-Hedging e ci fornisce un portafoglio privo di casualità. È così che possiamo applicare l’argomento secondo cui dovrebbe crescere al tasso privo di rischio, altrimenti, come con i nostri argomenti precedenti, avremmo un’opportunità di arbitraggio. Pertanto, il tasso di crescita del nostro portafoglio con copertura delta deve essere uguale al tasso privo di rischio a capitalizzazione continua, \(r\). Possiamo quindi affermare che:

\(\begin{eqnarray*} \frac{\partial C}{\partial t}(S,t) + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 C}{\partial S^2}(S,t) = r\left(C-S\frac{\partial C}{\partial S}\right) \end{eqnarray*}\)

Se riorganizziamo questa equazione e usando la notazione abbreviata per eliminare la dipendenza da \((S, t)\) arriviamo alla famosa equazione di Black-Scholes per il valore della nostra affermazione contingente:

\(\begin{eqnarray*} \frac{\partial C}{\partial t} + rS\frac{\partial C}{\partial S}+\frac{1}{2} \sigma^2 S^2 \frac{\partial^2 C}{\partial S^2} – rC = 0 \end{eqnarray*}\)

Sebbene abbiamo derivato l’equazione, non possediamo ancora condizioni sufficienti per fornire una soluzione unica. L’equazione è un’equazione differenziale parziale lineare (PDE) del secondo ordine e senza condizioni al contorno (come una funzione di payoff per la nostra affermazione contingente), non saremo in grado di risolverla.

Una funzione di payoff che possiamo utilizzare è quella di un’opzione call europea coniata a \(K\). Ha una funzione di guadagno alla scadenza, \(T\), di:

\(\begin{eqnarray*} C(S,T)=\max(S-K,0) \end{eqnarray*}\)

Siamo ora in grado di risolvere l’equazione di Black-Scholes.

Il Lemma di Ito

trading-algoritmico-calcolo-stocastico

l Lemma di Ito è una componente chiave nell’Ito Calculus, utilizzato per determinare la derivata di una funzione dipendente dal tempo di un processo stocastico. Svolge il ruolo della regola della catena in un contesto stocastico, analogo alla regola della catena nel calcolo differenziale ordinario. Il Lemma di Ito è una pietra angolare della finanza quantitativa ed è intrinseco alla derivazione dell’equazione di Black-Scholes per i prezzi dei crediti contingenti (opzioni).

È necessario comprendere i concetti di moto browniano , equazioni differenziali stocastiche e moto browniano geometrico prima di procedere.

La regola della catena

Uno degli strumenti fondamentali del calcolo ordinario è la regola della catena. Consente il calcolo della derivata della composizione funzionale concatenata. Formalmente, se \(W(t)\) è una funzione continua e:

\(\begin{eqnarray*} d W(t) = \mu (W(t),t) dt \end{eqnarray*}\)

Quindi la regola della catena afferma:

\(\begin{eqnarray*} d(f(W(t))) = f'(W(t)) \mu (W(t), t) dt \end{eqnarray*}\)

Quando \(f\) ha anche \(t\) come diretto parametro dipendente, sono necessari termini aggiuntivi e derivate parziali. In questo caso, la regola della catena è data da:

\(\begin{eqnarray*} d(f(W(t),t)) = \left(\frac{\partial f}{\partial w}(W(t),t) \mu(W(t), t) + \frac{\partial f}{\partial t}(W(t),t)\right) dt \end{eqnarray*}\)

Al fine di modellare correttamente una distribuzione del prezzo di un’attività in modo log-normale, verrà utilizzata una versione stocastica della regola della catena per risolvere un’equazione differenziale stocastica che rappresenta il moto browniano geometrico.

Il compito principale è ora quello di estendere correttamente la versione di calcolo ordinario della regola della catena per essere in grado di far fronte a variabili casuali.

Lemma di Ito

Teorema (Lemma di Ito)

Sia \(B(t)\) un moto browniano e \(W(t)\) un processo Ito di diffusione di deriva che soddisfa l’equazione differenziale stocastica:

\(\begin{eqnarray*} dW(t) = \mu(W(t),t)dt + \sigma(W(t),t)dB(t) \end{eqnarray*}\)

Se \(f(w, t) \in C^2(\mathbb{R}^2,\mathbb{R})\) allora \(f(W(t), t)\) è anche un processo  di diffusione della deriva di Ito, con il suo differenziale dato da:

\(\begin{eqnarray*} d(f(W(t),t)) = \frac{\partial f}{\partial t}(W(t),t)dt + f'(W(t),t)dW + \frac{1}{2}f”(W(t),t)dW(t)^2 \end{eqnarray*}\)

Con \(dW(t)^2\) dato da: \(dt ^ 2 = 0\), \(dt dB (t) = 0 \) e \( dB (t) ^ 2 = dt \).

Moto Browniano Geometrico

trading-algoritmico-calcolo-stocastico

Il modello usuale per l’evoluzione temporale del prezzo di un asset \(S(t)\) è dato dal moto browniano geometrico, rappresentato dalla seguente equazione differenziale stocastica:

\(\begin{eqnarray*} dS(t) = \mu S(t) dt + \sigma S(t) dB(t) \end{eqnarray*}\)

Notare che i coefficienti \(\mu\) e \(\sigma\), che rappresentano rispettivamente la deriva e la volatilità dell’asset, sono entrambi costanti in questo modello. In modelli più sofisticati possono essere fatti per essere funzioni di \(t\), \(S(t)\) e altri processi stocastici.

La soluzione \(S(t)\) può essere trovata applicando il Lemma di Ito all’equazione differenziale stocastica.

Dividendo per \(S(t)\) nell’equazione precedente si ottiene:

\(\begin{eqnarray*} \frac{dS(t)}{S(t)} = \mu dt + \sigma dB(t) \end{eqnarray*}\)

Si noti che il lato sinistro di questa equazione è simile alla derivata di \(\log S (t)\). Applicando il Lemma di Ito a \(\log S(t)\) si ottiene:

\(\begin{eqnarray*} d(log S(t)) = (log S(t))’ \mu S(t) dt + (log S(t))’ \sigma S(t) dB(t) + \frac{1}{2}(log S(t))” \sigma^2 S(t)^2 dt \end{eqnarray*}\)

Questo diventa:

\(\begin{eqnarray*} d(log S(t)) = \mu dt + \sigma dB(t) – \frac{1}{2}\sigma^2 dt = \left(\mu – \frac{1}{2} \sigma^2 \right)dt + \sigma dB(t) \end{eqnarray*}\)

Questo è un processo di Ito di diffusione della deriva. È un moto browniano standard con un termine di deriva. Poiché la formula precedente è semplicemente una scorciatoia per una formula integrale, possiamo scriverla come

\(\begin{eqnarray*} log(S(t)) – log(S(0)) = \left(\mu – \frac{1}{2} \sigma^2 \right)t + \sigma B(t) \end{eqnarray*}\)

Infine, prendendo l’esponenziale di questa equazione si ottiene:

\(\begin{eqnarray*} S(t) = S(0) \exp \left(\left(\mu – \frac{1}{2}\sigma^2\right)t + \sigma B(t)\right) \end{eqnarray*}\)

Questa è la soluzione dell’equazione differenziale stocastica. Infatti è una delle poche soluzioni analitiche ottenibili dalle equazioni differenziali stocastiche.

Equazioni differenziali stocastiche

trading-algoritmico-calcolo-stocastico

Il precedente articolo sul moto browniano e il processo Wiener ha introdotto il moto browniano standard, come mezzo per modellare i percorsi dei prezzi degli asset. Tuttavia, un moto browniano standard ha una probabilità di essere negativo diversa da zero. Questa non è chiaramente una proprietà condivisa da asset del mondo reale: i prezzi delle azioni non possono essere inferiori a zero. Quindi, sebbene la natura stocastica di un moto browniano per il nostro modello debba essere mantenuta, è necessario regolare esattamente come viene distribuita quella casualità. In particolare, verrà ora introdotto il concetto di moto browniano geometrico (GBM), che risolverà il problema dei prezzi azionari negativi.

Tuttavia, prima di considerare il moto browniano geometrico, è necessario discutere il concetto di equazione differenziale stocastica (SDE). Questo ci permetterà di formulare il GBM e risolverlo per ottenere una funzione per il percorso del prezzo dell’asset.

Equazioni differenziali stocastiche

Ora che abbiamo definito il moto browniano, possiamo utilizzarlo come elemento base per iniziare a costruire equazioni differenziali stocastiche (SDE). Abbiamo bisogno delle SDE per descrivere come si comportano le funzioni \(f=f(S)\) e le loro derivate rispetto a \(S\), dove \(S\) è il prezzo di un titolo azionario  determinato da un moto browniano.

Alcune delle regole del calcolo ordinario non funzionano come previsto in un mondo stocastico. Dobbiamo modificarli per tenere conto sia del comportamento casuale del moto browniano sia della sua natura non differenziabile. Inizieremo discutendo degli integrali stocastici, che ci condurranno in modo naturale al concetto delle SDE.

Definizione (integrale stocastico)
Un integrale stocastico della funzione \(f = f(t)\) è una funzione \(W = W(t)\), \( t \in[0, T] \) data da:

\(\begin{eqnarray*} W(t) = \int^t_0 f(s) dB(s) = \lim_{n\rightarrow \infty} \sum_{k=1}^N f(t_{k-1})\left(B(t_k)-B(t_{k-1})\right) \end{eqnarray*}\)

dove \(t_k = \frac{kt}{N}\).

Da notare che la funzione \(f\) non è anticipante, nel senso che indipendente dalla storia futura del processo di Wiener,  Ciò significa che non ha informazioni sui valori della variabile casuale in \(X(t_k)\). Supponendo che \(f\) rappresentasse un’allocazione di portafoglio basata su \(B\), se non fosse valutata a \(t_{k-1}\), ma piuttosto a \(t_k\), saremmo in grado di anticipare il futuro e modificare il portafoglio di conseguenza.

L’espressione precedente fornita per $ W (t) $ è un’espressione integrale e quindi è ben definita per una variabile non differenziabile, $ B (t) $, a causa della proprietà di finitezza, nonché della media e della varianza scelte. Tuttavia, desideriamo poterlo scrivere in forma differenziale:

\(\begin{eqnarray*} dW = f(t)dB \end{eqnarray*}\)

Va sottolineato che questa è una notazione abbreviata per la forma integrale. Infatti, per dividere \(dB\) sarebbe necessaria la definizione di \(\frac{dW} {dB}\) – un operatore differenziale su una funzione non regolare \(W\).

Si può considerare il termine \(dB\) come una variabile casuale distribuita normalmente con media zero e varianza \(dt\).
La definizione formale è la seguente:

Definizione (equazione differenziale stocastica)
Sia \(B(t)\) un moto browniano. Se \(W(t)\) è una sequenza di variabili casuali, tale che per tutti i \(t\),

\(\begin{eqnarray*} W(t+\delta t)-W(t)-\delta t \mu (t, W(t)) – \sigma(t, B(t)) (B(t+\delta t)-B(t)) \end{eqnarray*}\)

è una variabile casuale con media e varianza che sono \(o(\delta t)\), quindi:

\(\begin{eqnarray*} d W = \mu(t, W(t)) dt + \sigma(t, W(t)) dB \end{eqnarray*}\)

è un’equazione differenziale stocastica per \(W(t)\).

Quindi una data sequenza di variabili casuali, da quanto sopra, è chiamata processo di diffusione di deriva Ito , o semplicemente processo Ito o processo stocastico .

Si può vedere che \(\mu\) e \(\sigma\) sono entrambe funzioni di \(t\) e \(W\). \(\mu\) ha l’interpretazione di un coefficiente di deriva non stocastico , mentre \(\sigma\) rappresenta il coefficiente di volatilità – è moltiplicato per il termine \(dB\) stocastico. Quindi, le equazioni differenziali stocastiche hanno sia una componente non stocastica che una componente stocastica.

Nel prossimo articolo sul moto browniano geometrico , verrà utilizzata un’equazione differenziale stocastica per modellare i movimenti dei prezzi degli asset.

Moto browniano e processo Wiener

trading-algoritmico-calcolo-stocastico

Abbiamo già descritto la logica per il calcolo stocastico per quanto riguarda la finanza quantitativa. Sono inoltre state definite le proprietà di Markov e di Martingale. In entrambi gli articoli è stato affermato che il moto browniano avrebbe fornito un modello per il percorso del prezzo di un asset nel tempo. In questo articolo verrà definito formalmente il moto browniano e verrà spiegato il suo analogo matematico, il processo di Wiener. Verrà dimostrato che un movimento browniano standard è insufficiente per i movimenti dei prezzi degli asset e che è necessario un movimento browniano geometrico.

Nella discussione precedente sulle proprietà Markov e Martingala, è stato effettuato un esperimento discreto del lancio della moneta, con un numero arbitrario di fasi temporali. L’obiettivo attuale è lavorare verso una random walk a tempo continuo, che fornirà un modello più sofisticato per il prezzo degli asset, che è variabile nel tempo. Per ottenere ciò, sarà necessario aumentare il numero di fasi temporali. Tuttavia, l’aumento di questo numero deve avvenire in un modo specifico, in modo da evitare un risultato senza senso (infinito).

Si considera un intervallo di tempo reale continuo \([0, T]\), con \(T> 0\). In questo intervallo verranno effettuati \(N\) lanci di monete, ciascuno dei quali richiede un tempo \(T / N\) e quindi sono equidistanti. Allo stesso tempo, il risultato restituito da ogni lancio di moneta verrà modificato. La sequenza di variabili casuali discrete che rappresentano il lancio della moneta è \( Z_i \in \{- 1,1\}\). È possibile definire un’ulteriore sequenza di variabili casuali discrete, \(\tilde {Z} _i \in \{\sqrt{T / N}, – \sqrt{T / N} \} \). La definizione di una tale sequenza di DRV viene utilizzata per fornire una variazione quadratica molto specifica del lancio della moneta.

La variazione quadratica di una sequenza di DRV è definita semplicemente come la somma delle differenze al quadrato dei termini attuali e precedenti:

\(\begin{eqnarray*} \sum^i_{k=1}\left(S_k-S_{k-1}\right)^2 \end{eqnarray*}\)

Per \(Z_i\), la precedente sequenza di variabili casuali di lancio della moneta, la variazione quadratica è data da:

\(\begin{eqnarray*} \sum^i_{k=1}\left(S_k-S_{k-1}\right)^2 = i \end{eqnarray*}\)

Per \(\tilde {Z} _i\), la variazione quadratica delle somme parziali \(\tilde {S}_i\) è:

\(\begin{eqnarray*} \sum^N_{k=1}\left(\tilde{S}_k-\tilde{S}_{k-1}\right)^2 = N \times \left(\sqrt{\frac{T}{N}}\right)^2 = T \end{eqnarray*}\)

Quindi, per costruzione, la variazione quadratica del lancio modificato della moneta \(\tilde{Z}_i\) è semplicemente la durata totale di tutti i lanci, \(T\).

È importante notare che entrambe le proprietà di Markov e di Martingale vengono mantenute da \( \tilde{Z}_i\). Poiché \(N\rightarrow \infty\), la random walk del lancio della moneta non diverge. Se il valore dell’asset al tempo \(t\), con \(t\in[0, T]\), è dato da \(S(t)\), allora la sua aspettativa condizionale alla fine dell’intervallo, dato che \(S(0) = 0 \), è \(\mathbb{E}(S(T))=0\) con una varianza di \(\mathbb{E}(S(T)^2) = T\).

Sebbene i dettagli tecnici non saranno discussi, poiché il numero di passaggi \( N \) diventa infinito, si ottiene il processo di Wiener, più comunemente chiamato moto browniano standard , che sarà indicato con \(B (t)\). Formalmente, la definizione è data da:

Definizione (processo di Wiener / moto browniano standard)
Una sequenza di variabili casuali \(B(t)\) è un moto browniano se \(B(0) = 0\), e per tutti i \( t, s \) tali che \( s <t\), \(B(t) – B(s)\) è normalmente distribuito con varianza \(ts\)  e la distribuzione di \(B(t) – B(s)\) è indipendente da \(B(r)\) per \( r \leq s \) .

Proprietà del moto browniano

Il moto browniano standard ha alcune proprietà interessanti. In particolare:

  • I moti browniani sono finiti . La costruzione di \(\tilde{Z}_i\) è stata scelta con cura in modo che nel limite di \(N\) grande, \(B\) sia finito che diverso da zero.
  • I moti browniani hanno variazioni illimitate . Ciò significa che se il segno di tutti i gradienti negativi fosse cambiato in positivo, \(B\) raggiungerebbe l’infinito in un periodo di tempo arbitrariamente breve.
  • I moti browniani sono continui . Sebbene i moti browniani siano continui ovunque, non sono differenziabili da nessuna parte. Essenzialmente questo significa che un moto browniano ha una geometria frattale. Ciò ha importanti implicazioni per quanto riguarda la scelta dei metodi di calcolo quando i moti browniani devono essere manipolati.
  • I moti browniani soddisfano sia le proprietà di Markov che di Martingala. La distribuzione condizionale di \(B(t)\), data l’informazione fino a \(s<t\) dipende solo da \(B(s)\) e, data informazione fino a \(s<t\), l’aspettativa condizionale di \(B(t)\) è \(B(s)\).
  • I moti browniani sono fortemente distribuiti normalmente . Ciò significa che, per \(s<t\), \(s, t \in[0, T]\), \(B(t) – B(s)\) è normalmente distribuita con media zero e varianza \(ts\).

Da notare che l’ultima proprietà NON è la stessa di avere B(t) normalmente distribuito con media zero e varianza t – questa è una proprietà più debole.

I moti browniani sono una componente fondamentale nella costruzione di equazioni differenziali stocastiche , che alla fine consentiranno la derivazione della famosa equazione di Black-Scholes per i prezzi dei crediti contingenti.