Modelli a media mobile autoregressiva ARMA - Parte 1

Modelli a media mobile autoregressiva ARMA(p, q) – Parte 1

Nell’ultimo articolo abbiamo esaminato il White Noise e Random Walk come modelli base di serie temporali per determinati strumenti finanziari, come i prezzi giornalieri delle azioni e degli indici azionari. Abbiamo scoperto che in alcuni casi un modello di Random Walk non è sufficiente per catturare l’intero comportamento di autocorrelazione dello strumento. Per questo motivo dobbiamo usare modelli più sofisticati.

Nei prossimi due articoli parleremo di tre tipi di modello, vale a dire il modello autoregressivo (AR) di ordine p, il modello a media mobile (MA) di ordine q e il modello a media mobile automatica (ARMA) di ordine misto (p, q). Questi modelli ci aiuteranno per tentare di catturare o “spiegare” la correlazione seriale presente all’interno di uno strumento. Alla fine ci forniranno un mezzo per prevedere i prezzi futuri.

Tuttavia, è noto che le serie temporali finanziarie possiedono una proprietà nota come clustering di volatilità . Cioè, la volatilità dello strumento non è costante nel tempo. Il termine tecnico per questo comportamento è noto come eteroschedasticità condizionale. Poiché i modelli AR, MA e ARMA non sono condizionalmente eteroschedastici, ovvero non tengono conto del clustering della volatilità, per le nostre previsioni avremo bisogno di un modello più sofisticato.

Tali modelli includono il modello Autogressive Conditional Heteroskedastic (ARCH) e il modello Generalized Autogressive Conditional Heteroskedastic (GARCH) e le numerose varianti degli stessi. Il modello GARCH è particolarmente noto nella finanza quantistica ed è utilizzato principalmente per simulazioni di serie temporali finanziarie come mezzo di stima del rischio.

Tuttavia, come con tutti gli articoli presenti in DataTrading, vogliamo costruire questi modelli partendo da versioni più semplici in modo da poter descrivere come ogni nuova variante cambia la nostra capacità predittiva. Nonostante AR, MA e ARMA siano modelli di serie temporali relativamente semplici, sono la base di modelli più complicati come l’Autoregressive Integrated Moving Average (ARIMA) e la famiglia GARCH. Quindi è importante studiarli.

Una delle nostre prime strategie di trading nella serie di articoli delle serie temporali sarà quella di combinare ARIMA e GARCH per prevedere i prezzi per n-periodi in anticipo. Tuttavia, dovremo aspettare fino a quando non avremo discusso separatamente sia ARIMA che GARCH prima di applicarli a una vera strategia!

Come procederemo?

In questo articolo descriviamo alcuni nuovi concetti per le serie temporali che sono utilizzati nei modelli successivi, vale a dire la stazionarietà rigorosa e il criterio dell’informazione di Akaike (AIC) .

Successivamente a questi nuovi concetti, descriviamo lo schema tradizionale per lo studio di nuovi modelli di serie temporali:

  • Razionale – Il primo passo è fornire una motivazione per cui siamo interessati a uno specifico modello. Perché stiamo introducendo il modello delle serie temporali? Quali effetti può catturare? Cosa guadagniamo (o perdiamo) aggiungendo ulteriore complessità?
  • Definizione – È necessario fornire la definizione matematica completa (e la relativa notazione) del modello delle serie temporali al fine di ridurre al minimo qualsiasi ambiguità.
  • Proprietà del secondo ordine – Descriviamo (e in alcuni casi deriviamo) le proprietà di secondo ordine del modello delle serie temporali, che include la sua media, la sua varianza e la sua funzione di autocorrelazione.
  • Correlogramma – Usiamo le proprietà di secondo ordine per tracciare un correlogramma di una realizzazione del modello delle serie temporali al fine di visualizzarne il comportamento.
  • Simulazione : Simuliamo le realizzazioni del modello delle serie temporali e quindi adattiamo il modello a queste simulazioni per garantire implementazioni accurate e comprendere il processo di adattamento.
  • Dati finanziari reali : Adattiamo il modello delle serie temporali ai dati finanziari reali e consideriamo il correlogramma dei residui per vedere come il modello tiene conto della correlazione seriale nella serie originale.
  • Pronostico – Creiamo n-step ahead forecasts del modello di serie temporali per particolari realizzazioni al fine di produrre segnali di trading.

Quasi tutti gli articoli che scrivo sui modelli delle serie temporali rientrano in questo schema e ci consente di confrontare facilmente le differenze tra ciascun modello man mano che aggiungiamo ulteriore complessità.

Iniziamo osservando la stazionarietà rigorosa e l’AIC.

Stazionarietà Rigorosa

Abbiamo fornito la definizione di stazionarietà nell’articolo sulla correlazione seriale. Tuttavia, poiché stiamo per entrare nel regno di molte serie finanziarie, con varie frequenze, dobbiamo assicurarci che i nostri (eventuali) modelli tengano conto della volatilità variabile nel tempo di queste serie. In particolare, dobbiamo considerare la loro eteroschedasticità.

Ci imbattiamo in questo problema quando cerchiamo di adattare determinati modelli alle serie storiche. In generale, non tutta la correlazione seriale nei residui dei modelli adattati può essere considerata senza tener conto dell’eteroschedasticità. Questo ci riporta alla stazionarietà. Per definizione, una serie non è stazionaria nella varianza se ha una volatilità variabile nel tempo.

Ciò motiva una definizione più rigorosa di stazionarietà, vale a dire la stazionarietà rigorosa :

Serie rigorosamente stazionaria
Un modello di serie storica, \(\{ x_t \}\), è strettamente stazionario se la distribuzione statistica congiunta degli elementi \(x_{t_1},\ldots,x_{t_n}\) è uguale a quello di \(x_{t_{1}+m},\ldots,x_{t_{n}+m}\).

Si può pensare a questa definizione semplicemente come che la distribuzione delle serie temporali sia invariata per qualsiasi spostamento arbritrario nel tempo.
In particolare, la media e la varianza sono costanti nel tempo per una serie strettamente stazionaria e l’autocovarianza tra \(x_t\) e \(x_s\) dipende solo dalla differenza assoluta di \(t\) e \(s\),\(|t-s|\).

Rivisiteremo le serie rigorosamente stazionarie in articoli successivi.

Criterio di informazione di Akaike (AIC)

Negli articoli precedenti abbiamo preannunciato la necessità di valutare come scegliere tra i modelli “migliori”. Questo vale non solo per l’analisi delle serie temporali, ma anche per l’apprendimento automatico e, più in generale, per la statistica.

I due metodi principali che usiamo (per il momento) sono l’Akaike Information Criterion (AIC) e il Bayesian Information Criterion (come descritto negli articoli relativi alle statistiche bayesiane).

Descriviamo brevemente l’AIC, dato che è utilizzato nella 2° parte di questo articolo sul modello ARMA.

L’AIC è essenzialmente uno strumento che aiuta la selezione del modello. Cioè, se abbiamo una selezione di modelli statistici (comprese le serie temporali), l’AIC stima la “qualità” di ciascun modello, rispetto agli altri che abbiamo a disposizione.

Si basa sulla teoria dell’informazione , che è un argomento molto interessante e complesso, su cui non possiamo entrare troppo nei dettagli. Tenta di bilanciare la complessità del modello, che in questo caso corrisponde al numero di parametri, con la bontà di adattamento ai dati. Diamo una definizione:

Criterio informativo di Akaike
Se prendiamo la funzione di verosimiglianza per un modello statistico, che ha \(k\) parametri, e \(L\) massimizza la verosimiglianza, quindi il criterio informativo di Akaike è dato da:
\(\begin{eqnarray}AIC = -2 \text{log} (L) + 2k \end{eqnarray}\)

Il “migliore” modello, tra la selezione di modelli, ha l’AIC minore del gruppo. Da notare che l’AIC cresce all’aumentare del numero di parametri, K, ma si riduce se aumenta probabilità logaritmica negativa. Sostanzialmente penalizza i modelli overfit.

Di seguito descriviamo modelli AR, MA e ARMA di ordini variabili. Nel prossimo articolo introduciamo un metodo che si base sull’AIC per scegliere il modello “migliore” modello adatto a un determinato set di dati, principalmente per i modelli ARMA.

Modelli autoregressivi (AR) di ordine p

Il primo modello che prendiamo in considerazione, che costituisce la base di questo articolo, è il modello autoregressivo di ordine p, spesso abbreviato in AR(p).

Fondamento logico

Nell’articolo precedente abbiamo descritto il random walk , dove ogni termine, \(x_t\), dipende unicamente dal termine precedente, \(x_{t-1}\), e un termine stocastico di rumore bianco, \(w_t\):
\(\begin{eqnarray} x_t = x_{t-1} + w_t \end{eqnarray}\)

Il modello autoregressivo è semplicemente un’estensione della passeggiata casuale che include termini più indietro nel tempo. La struttura del modello è lineare , ovvero il modello dipende linearmente dai termini precedenti, con coefficienti per ogni termine. Ecco da dove viene il “regressivo” del termine “autoregressivo”. È essenzialmente un modello di regressione in cui i termini precedenti sono i predittori.

Modello autoregressivo di ordine p
Un modello di serie storica, \(\{ x_t \}\), è un modello autoregressivo di ordine p, AR(p), se:

\(\begin{eqnarray}
x_t &=& \alpha_1 x_{t-1} + \ldots + \alpha_p x_{t-p} + w_t \\
&=& \sum_{i=1}^p \alpha_i x_{t-i} + w_t
\end{eqnarray}\)

In cui \(\{ w_t \}\) è il rumore bianco e \(\alpha_i \in \mathbb{R}\), insieme a \(\alpha_p \neq 0\) per un processo autoregressivo di ordine p-esimo.

Se consideriamo l’ operatore di spostamento all’indietro, B (vedi articolo precedente) allora possiamo riscrivere quanto sopra come una funzione θ di  B:

\(\begin{eqnarray}
\theta_p ({\bf B}) x_t = (1 – \alpha_1 {\bf B} – \alpha_2 {\bf B}^2 – \ldots – \alpha_p {\bf B}) x_t = w_t
\end{eqnarray}\)

La prima cosa da notare del modello AR(p) è che una passeggiata casuale corrisponde semplicemente  a AR(1) con \(\alfa_1\) uguale all’unità. Come abbiamo affermato sopra, il modello autogressivo è un’estensione della passeggiata casuale, quindi ha senso!

È semplice fare previsioni con il modello AR(p), in qualsiasi momento, una volta che abbiamo determinato i coefficienti \(\alfa_i\), la nostra stima diventa semplicemente:

\(\begin{eqnarray}
\hat{x}_t = \alpha_1 x_{t-1} + \ldots + \alpha_p x_{t-p}
\end{eqnarray}\)

Quindi possiamo fare previsione a n-passi avanti , producendo \(\hat{x}_t\), \(\hat{x}_{t+1}\), \(\hat{x}_{t+2}\), ecc fino a \(\hat{x}_{t+n}\). Infatti, una volta descritti i modelli ARMA nella Parte 2, utilizzeremo una specifica funzione Python per creare previsioni (insieme alle bande di intervallo di confidenza dell’errore standard) che ci aiuteranno a produrre segnali di trading.

Stazionarietà per processi autoregressivi

Uno degli aspetti più importanti del modello AR(p) è che non è sempre stazionario. Infatti la stazionarietà di un particolare modello dipende dai parametri. Ne abbiamo già parlato in un precedente articolo.

Per determinare se un processo AR(p) è stazionario o meno dobbiamo risolvere l’equazione caratteristica . L’equazione caratteristica è semplicemente il modello autoregressivo, scritto in forma di spostamento all’indietro, impostato a zero:

\(\begin{eqnarray}
\theta_p({\bf B}) = 0
\end{eqnarray}\)

Risolviamo questa equazione per B. Affinché il particolare processo autoregressivo sia stazionario, abbiamo bisogno che tutti i valori assoluti delle radici di questa equazione superino l’unità. Questa è una proprietà estremamente utile e ci consente di calcolare rapidamente se un processo AR(p) è stazionario o meno.

Consideriamo alcuni esempi per rendere concreta questa idea:

  • Random Walk – Il processo AR(1) con \(\alpha_1 = 1\) ha l’equazione caratteristica \(\theta = 1 – {\bf B}\). Chiaramente questo ha radice \({\bf B} = 1\) e come tale non è stazionario.
  • AR(1) – Se scegliamo \(\alpha_1 = \frac{1}{4}\) abbiamo \(x_t = \frac{1}{4} x_{t-1} + w_t\). Questo evidenzia una caratteristica equazione di \(1 – \frac{1}{4} {\bf B} = 0\), che ha una radice \({\bf B} = 4 > 1\) e quindi questo particolare processo AR(1) è stazionario.
  • AR(2) – Se impostiamo \(\alpha_1 = \alpha_2 = \frac{1}{2}\) otteniamo \(x_t = \frac{1}{2} x_{t-1} + \frac{1}{2} x_{t-2} + w_t\). La sua equazione caratteristica diventa \(-\frac{1}{2}({\bf B-1})({\bf B+2}) = 0\), che restituisce due radici di \({\bf B} = 1, -2\). Poiché questa ha una radice unitaria, è una serie non stazionaria. Tuttavia, altre serie AR(2) possono essere stazionarie.

Proprietà del secondo ordine

La media di un processo AR(p) è zero. Tuttavia, le autocovarianze e le autocorrelazioni sono date da funzioni ricorsive, note come equazioni di Yule-Walker. Le proprietà complete sono riportate di seguito

\(\begin{eqnarray}
\mu_x = E(x_t) = 0
\end{eqnarray}\)\(\begin{eqnarray}
\gamma_k = \sum_{i=1}^p \alpha_i \gamma_{k-i}, \enspace k > 0
\end{eqnarray}\)
\(\begin{eqnarray}
\rho_k = \sum_{i=1}^p \alpha_i \rho_{k-i}, \enspace k > 0
\end{eqnarray}\)

Si noti che è necessario conoscere i valori dei parametri \(\alpha_i\) prima del calcolo delle autocorrelazioni.

Ora che abbiamo dichiarato le proprietà del secondo ordine possiamo simulare vari ordini di AR(p) e tracciare i corrispondenti correlogrammi.

Simulazioni e Correlogrammi

AR(1)

Iniziamo con un processo AR(1). Questo è simile a una passeggiata casuale, tranne che \(\alpha_1\) non deve eguagliare l’unità. Il nostro modello avrà \(\alpha_1 = 0.6\). Il codice Python per la creazione di questa simulazione è il seguente:
				
					import numpy as np
from statsmodels.tsa.arima_process import ArmaProcess

# AR parameter = +0.6
ar1 = np.array([1, -0.6])
ma1 = np.array([1])
AR_object1 = ArmaProcess(ar1, ma1)
simulated_data_1 = AR_object1.generate_sample(nsample=1000)
				
			
Possiamo quindi tracciare il grafico di questo modello e del relativo correlogramma.
				
					from matplotlib import pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import acf

# Plot AR model
plt.plot(simulated_data_1)
acf_coef = acf(simulated_data_1)
plot_acf(acf_coef, lags=30)
plt.show()
				
			
trading-quantitativo-modelloAR_1

Proviamo ora ad adattare un processo AR(p) ai dati simulati che abbiamo appena generato, per vedere se possiamo recuperare i parametri sottostanti. Ricorderete che abbiamo eseguito una procedura simile nell’articolo relativo al White Noise e Random Walks.

Il pacchetto stasmodels di Python fornisce i metodi per adattare i modelli autoregressivi. Possiamo usare questi metodi per fornirci le stime dei parametri per i \(\alpha_i\), che possiamo quindi utilizzare per formare intervalli di confidenza.

Usiamo il comando ARMA per adattare un modello autoregressivo al nostro processo AR(1) simulato, utilizzando la stima di massima verosimiglianza (MLE) come procedura di adattamento.

				
					from statsmodels.tsa.arima_model import ARMA

# Fit an AR(1) model to the first simulated data
mod = ARMA(simulated_data_1, order=(1, 0))
res = mod.fit()

# Print out summary information on the fit
print(res.summary())

# Print out the estimate for the constant and for alpha
print("When the true alpha=0.9, the estimate of alpha (and the constant) are:")
print(res.params)
				
			
				
					                              ARMA Model Results                              
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                     ARMA(1, 0)   Log Likelihood                -145.403
Method:                       css-mle   S.D. of innovations              1.033
Date:                     27 Sep 2017   AIC                            296.807
Time:                        17:01:04   BIC                            304.622
Sample:                             0   HQIC                           299.970
                                                                              
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.0644      0.272      0.237      0.813      -0.468       0.597
ar.L1.y        0.6261      0.077      8.155      0.000       0.476       0.777
                                    Roots                                    
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.5973           +0.0000j            1.5973            0.0000
-----------------------------------------------------------------------------


When the true parameter=0.6, the estimate of parameter (and the constant) are:
[0.06443423 0.62607235]

				
			

La procedura MLE ha prodotto un valore stimato \(\hat{\alpha_1} = 0.626\), che è leggermente superiore al valore reale di \(\).

Inoltre il report utilizza l’errore standard (con la varianza asintotica) per costruire intervalli di confidenza del 95% attorno ai parametri sottostanti. Quindi si evidenzia che il vero parametro rientra nell’intervallo di confidenza del 95%, come ci si aspetterebbe dal fatto che abbiamo generato la realizzazione dal modello in modo specifico.

Vediamo lo stesso approccio considerando \(\alpha_1 =-0.6\).

				
					
# AR parameter = -0.6
ar2 = np.array([1, +0.6])
ma2 = np.array([1])
AR_object2 = ArmaProcess(ar2, ma2)
simulated_data_2 = AR_object2.generate_sample(nsample=100)

# Plot AR model
plt.plot(simulated_data_2)
plot_acf(simulated_data_2, alpha=1, lags=20)
plt.show()
				
			
trading-quantitativo-modelloAR_2
Anche in questo caso possiamo adattare un modello AR(p) usando il metodo ARMA e otteniamo il seguente report:
				
					                               ARMA Model Results                              
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                     ARMA(1, 0)   Log Likelihood                -141.901
Method:                       css-mle   S.D. of innovations              0.997
Date:                     27 Sep 2017   AIC                            289.801
Time:                        17:20:25   BIC                            297.617
Sample:                             0   HQIC                           292.964
                                                                              
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.0281      0.061      0.459      0.647      -0.092       0.148
ar.L1.y       -0.6389      0.076     -8.454      0.000      -0.787      -0.491
                                    Roots                                    
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1           -1.5652           +0.0000j            1.5652            0.5000
-----------------------------------------------------------------------------

When the true parameter=-0.6, the estimate of parameter (and the constant) are:
[ 0.02807516 -0.63889385]

				
			

Ancora una volta abbiamo il corretto ordine del modello, con una valore stimato \(\hat{\alpha_1}=-0.6389\) di \(\hat{\alpha_1}=-0.6\). Vediamo anche che il parametro rientra ancora una volta nell’intervallo di confidenza del 95%.

AR(2)

Aggiungiamo un po’ più di complessità ai nostri processi autoregressivi simulando un modello di ordine 2. In particolare, impostiamo \(\alpha_1=0.666\) e \(\alpha_2 = -0.333\). Ecco il codice completo per simulare e tracciare le realizzazioni, così come il correlogramma per una serie del genere:

				
					# AR(2) parameter = 0.666 and -0.333
ar_2o = np.array([1, -0.666, 0.333])
ma_2o = np.array([1])
AR_object_2o = ArmaProcess(ar_2o, ma_2o)
simulated_data_2o = AR_object_2o.generate_sample(nsample=100)

# Plot AR model
plt.plot(simulated_data_2o)
plot_acf(simulated_data_2o, alpha=1, lags=20)
plt.show()
				
			
trading-quantitativo-modelloAR_3

Come per gli esempi precedenti, notiamo che il correlogramma differisce significativamente da quello del rumore bianco, come ci si aspetterebbe. Ci sono picchi statisticamente significativi.

Ancora una volta, usiamo il metodo ARMA per adattare un modello AR(p) alla nostra realizzazione AR(2) sottostante. La procedura è simile a quella per l’adattamento AR(1):

				
					# Fit an AR(2) model to the first simulated data
mod = ARMA(simulated_data_2o, order=(2, 0, 0))
res = mod.fit()

# Print out summary information on the fit
print(res.summary())

# Print out the estimate for the constant and for phi
print("When the true parameters are 0.666 and -0.333, the estimate of parameters (and the constant) are:")
print(res.params)
				
			
				
					                              ARMA Model Results                              
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                     ARMA(2, 0)   Log Likelihood                -137.754
Method:                       css-mle   S.D. of innovations              0.957
Date:                     27 Sep 2017   AIC                            283.508
Time:                        17:49:19   BIC                            293.929
Sample:                             0   HQIC                           287.726
                                                                              
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.2259      0.149      1.519      0.132      -0.066       0.517
ar.L1.y        0.6841      0.094      7.286      0.000       0.500       0.868
ar.L2.y       -0.3274      0.094     -3.502      0.001      -0.511      -0.144
                                    Roots                                    
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.0446           -1.4010j            1.7475           -0.1480
AR.2            1.0446           +1.4010j            1.7475            0.1480
-----------------------------------------------------------------------------

When the true parameters are 0.666 and -0.333, the estimate of parameters (and the constant) are:
[ 0.22589332  0.68412184 -0.32744997]

				
			

Notiamo che l’ordine corretto è stato recuperato e le stime dei parametri \(\hat{\alpha_1}=0.6841\) e \(\hat{\alpha_2}=-0.3274\) non sono troppo lontani dai valori dei  parametri veri \(\hat{\alpha_1}=0.666\) e \(\hat{\alpha_2}=-0.333\).

Come vedremo negli articoli successivi, i modelli AR(p) sono semplicemente modelli ARIMA(p, 0, 0), e quindi un modello AR è un caso speciale del modello ARIMA senza componenti di media mobile (MA).

Questo motiva la prossima serie di modelli, vale a dire la media mobile MA(q) e la media mobile autoregressiva ARMA(p, q). Descriviamo entrambi questi aspetti nella parte 2 di questo articolo. Come abbiamo ripetutamente menzionato, questi alla fine ci porteranno alla famiglia di modelli ARIMA e GARCH, che forniranno entrambi un adattamento molto migliore alla complessità della correlazione seriale delle serie temporali di dati finanziari.

Questo ci consentirà di migliorare significativamente le nostre previsioni e, in definitiva, di produrre strategie più redditizie.

Sommario

Gli altri articoli di questa serie

Se è la prima volta che atterri su DataTrading, BENVENUTO!

Lascia che mi presenti. Sono Gianluca, ingegnere, trekker e appassionato di coding, finanza e trading. Leggi la mia storia

Ho creato DataTrading per aiutare le altre persone ad utilizzare nuovi approcci e nuovi strumenti, ed applicarli correttamente al mondo del trading..

TUTORIALTrading Algoritmico, la Data Science e il Machine Learning

STRUMENTITradingView, BackTrader, e QuantConnect 

DataTrading vuole essere un punto di ritrovo per scambiare esperienze, opinioni ed idee.

SCRIVIMI SU TELEGRAM

Per informazioni, suggerimenti, collaborazioni...

Torna su