Modelli di eteroschedasticità condizionata autoregressiva generalizzata GARCH

Modelli autoregressivi generalizzati a eteroschedasticità condizionata GARCH(p, q)

Sommario

SCRIVIMI SU TELEGRAM

Per informazioni, suggerimenti, collaborazioni...

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.

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

TUTORIAL

In questo articolo descriviamo il modello Autoregressivo Generalizzato a eteroschedasticità condizionata di ordine p,q, noto come GARCH(p,q) . Il GARCH è ampiamente utilizzato nel settore finanziario poiché molti prezzi delle attività sono eteroschedastici condizionali.

Di seguito approfondiamo l’eteroschedasticità condizionale, introducendo il più semplice modello di eteroschedasticità condizionata, noto come ARCH. Quindi vediamo le estensioni del modello ARCH, introducendo il modello GARCH. Infine applichiamo il modello GARCH ad alcune serie finanziarie che presentano raggruppamenti di volatilità.

Riepilogo e passaggi successivi

Nei precedenti articoli abbiamo considerato i seguenti modelli. Consiglio vivamente di leggere la serie in ordine se non l’hai già fatto:

Nel precedente articolo sul modello ARIMA abbiamo  effettuato alcune previsioni di base. Abbiamo preannunciato che possiamo creare una semplice strategia di trading dopo studiato i modelli ARIMA e GARCH. Pertanto, l’ultimo pezzo del puzzle è esaminare in dettaglio l’eteroschedasticità condizionale e quindi utilizzarla per migliorare i risultati previsti.

Volatilità

La motivazione principale per lo studio dell’eteroschedasticità condizionata in finanza è studiare la volatilità dei rendimenti degli asset. La volatilità è un concetto incredibilmente importante in finanza perché è altamente sinonimo di rischio .

La volatilità ha una vasta gamma di applicazioni in finanza:

  • Prezzi delle opzioni – Il modello Black-Scholes per i prezzi delle opzioni dipende dalla volatilità dello strumento sottostante
  • Risk Management – La volatilità gioca un ruolo nel calcolo del VaR di un portafoglio, dello Sharpe Ratio per una strategia di trading e nella determinazione della leva finanziaria
  • Titoli negoziabili – La volatilità può ora essere negoziata direttamente con l’introduzione del CBOE Volatility Index (VIX) e successivi contratti future ed ETF.

Se siamo in grado di prevedere efficacemente la volatilità, siamo in grado di valutare le opzioni in modo più accurato, creare strumenti di gestione del rischio più sofisticati per i nostri portafogli di trading algoritmico e persino elaborare nuove strategie che negoziano direttamente la volatilità.

Ora rivolgeremo la nostra attenzione all’eteroschedasticità condizionata, introducendo la definizione e le proprietà.

Eteroschedasticità condizionata

Introduciamo quindi il concetto di eteroschedasticità e poi esaminiamo la parte “condizionale”.

Se consideriamo un insieme di variabili casuali, come elementi in un modello di serie temporali, allora l’insieme è eteroschedastico se ci sono determinati gruppi, o sottoinsiemi, di variabili all’interno dell’insieme più grande che hanno una varianza diversa dalle variabili rimanenti.

Ad esempio, in una serie temporale non stazionaria che mostra elementi di stagionalità o di tendenza, possiamo scoprire che la varianza della serie aumenta con la stagionalità o la tendenza. Questa forma di variabilità regolare è nota come eteroschedasticità .

Tuttavia, in finanza ci sono molte ragioni per cui un aumento della varianza è correlato a un ulteriore aumento della varianza.

Ad esempio, si consideri la prevalenza dell’assicurazione di protezione del portafoglio al ribasso impiegata dai gestori di fondi long-only. Se i mercati azionari dovessero avere una giornata particolarmente impegnativa (ossia un calo sostanziale!) potrebbe innescare ordini di vendita automatizzati per la gestione del rischio, che deprimerebbero ulteriormente il prezzo delle azioni all’interno di questi portafogli. Poiché i portafogli più grandi sono generalmente comunque altamente correlati, ciò potrebbe innescare una significativa volatilità al ribasso.

Questi periodi di “svendita”, così come molte altre forme di volatilità che si verificano nella finanza, portano a un’eteroschedasticità che è serialmente correlata e quindi condizionata a periodi di maggiore varianza. Quindi diciamo che tali serie sono eteroschedastiche condizionate.

Uno degli aspetti più critici delle serie eteroschedastiche condizionate è la difficoltà di rilevare la volatilità della serie esclusivamente dal correlogramma, cioè se dovessimo tracciare il correlogramma di una serie finanziaria con alta volatilità è probabile ottenere quella che sembra essere una realizzazione di rumore bianco discreto stazionario. Questo nonostante il fatto che la serie sia decisamente non stazionaria poiché la sua varianza non è costante nel tempo.

In questo articolo descriviamo un meccanismo per rilevare le serie eteroschedastiche condizionate e quindi utilizziamo i modelli ARCH e GARCH per applicare questo meccanismo, ottenendo infine prestazioni di previsione più realistiche e quindi strategie di trading più redditizie.

Modelli autoregressivi eteroschedastici condizionati

Abbiamo introdotto l’eteroschedasticità condizionata (CH) e la sua importanza all’interno delle serie finanziarie. Ora descriviamo un modello che possa incorporare CH in modo naturale. Sappiamo che la classe di modelli ARIMA non tiene conto del CH, quindi come possiamo procedere?

Bene, dobbiamo prevedere  un modello che utilizza un processo autoregressivo per la stessa varianza, cioè un modello che considera effettivamente le modifiche della varianza nel tempo utilizzando i valori passati della  stessa varianza.

Questa è la base del modello Autoregressive Conditional Heteroskedastic (ARCH). Iniziamo descrivendo il caso più semplice possibile, ovvero un modello ARCH che dipende esclusivamente dal valore di varianza precedente nella serie.

Definizione

Modello Autoregressivo a Eteroschedasticità Condizionata di Ordine Unitario
Una serie temporale \(\{ \epsilon_t \}\) è data, ad ogni istanza, da:

\(\begin{eqnarray} \epsilon_t = \sigma_t w_t \end{eqnarray}\)

Dove \(\{ w_t \}\)
è un rumore bianco discreto, con media zero e varianza unitaria, e \(\sigma^2_t\)
è dato da:

\(\begin{eqnarray} \sigma^2_t = \alpha_0 + \alpha_1 \epsilon^2_{t-1} \end{eqnarray}\)

Dove \(\alpha_0\) e \(\alpha_1\) sono i parametri del modello.

Quindi \(\{ \epsilon_t \}\) è un modello autoregressivo  a eteroschedasticità condizionata di ordine unitario, denominato da ARCH(1). Sostituendo \(\sigma^2_t\), otteniamo:

\(\begin{eqnarray} \epsilon_t = w_t \sqrt{\alpha_0 + \alpha_1 \epsilon_{t-1}^2}\end{eqnarray}\)

Perché questo modello di volatilità?

Personalmente trovo la definizione “formale”, di cui sopra, priva di motivazione  relativamente all’introduzione della volatilità. Tuttavia, è da notare come la volatilità viene introdotta nella definizione semplicemente elevando al quadrato entrambi i lati dell’equazione precedente:

\(\begin{eqnarray}
\operatorname{Var}(\epsilon_t) &=& \operatorname{E}[\epsilon^2_t ] – (\operatorname{E}[\epsilon_t ])^2 \\
&=& \operatorname{E}[\epsilon^2_t ] \\
&=& \operatorname{E}[w^2_t ] \operatorname{E}[\alpha_0 + \alpha_1 \epsilon^2_{t-1} ] \\
&=& \operatorname{E}[\alpha_0 + \alpha_1 \epsilon^2_{t-1} ] \\
&=& \alpha_0 + \alpha_1 \operatorname{Var}(\epsilon_{t-1})
\end{eqnarray}\)

Dove abbiamo usato la definizione della varianza \(\operatorname{Var}(x) = \operatorname{E}[x^2] – (\operatorname{E}[x])^2\) e la linearità dell’operatore E, insieme al fatto che \(\{w_t \}\) ha media zero e varianza unitaria.

Possiamo vedere che la varianza della serie è semplicemente una combinazione lineare della varianza dell’elemento precedente della serie. In poche parole, la varianza di un processo ARCH(1) segue un processo AR(1) .

È interessante confrontare il modello ARCH(1) con un modello AR(1). Ricordiamo che quest’ultimo è dato da:

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

Da notare che i modelli sono simili nella forma (ad eccezione del termine  relativo al rumore bianco).

Quando è opportuno applicare ARCH(1)?

Quale approccio possiamo adottare per determinare se un modello ARCH(1) è appropriato per essere applicato a una serie temporale?

Ricordiamo quando si tenta di adattare un modello AR(1), dove siamo preoccupati del decadimento del primo ritardo su un correlogramma della serie.

Tuttavia, se applichiamo la stessa logica al quadrato dei residui e verifichiamo la possibilità di applicare un  modello AR(1) ai residui quadrati, possiamo ottenere un’indicazione che un processo ARCH(1) potrebbe essere appropriato.

Notiamo che ARCH(1) dovrebbe essere applicato solo a una serie per cui abbiamo già adattato un modello appropriato, sufficiente per permettere di considerare i residui come un rumore bianco discreto. Dato che possiamo verificare se un modello ARCH è appropriato solo elevando al quadrato i residui ed esaminando il correlogramma, dobbiamo assicurarci che la media dei residui sia zero.

Fondamentalmente, ARCH dovrebbe essere applicato solo a una serie che non ha tendenze o effetti stagionali, cioè che non hanno una correlazione seriale (evidente). Dopo aver applicato il modello ARIMA a una serie del genere (oppure l’ARIMA stagionale), possiamo ottenere un buon adattamento del modello ARCH.

I modelli ARCH(p)

Il modello ARCH può essere semplicemente esteso a ritardi di ordine superiore. Un processo ARCH(p) è dato da:

\(\begin{eqnarray}\epsilon_t = w_t \sqrt{\alpha_0 + \sum^p_{i=1} \alpha_p \epsilon^2_{t-i}}\end{eqnarray}\)

Possiamo pensare al modello ARCH(p) come all’applicazione di un modello AR(p) alla varianza della serie.

Una domanda ovvia da porsi in questa fase è perché non applicare anche un modello MA(q) a media mobile se è possibile applicare un processo AR(p) alla varianza? O la possibilità di applicare un modello misto come l’ARMA(p,q)?

Questa è in realtà la motivazione per il modello ARCH generalizzato , noto come GARCH, che ora andiamo a definire e descrivere.

Modelli Autoregressivi Generalizzati a

Eteroschedasticità Condizionata

 

Definizione

Modello autoregressivo generalizzato a eteroschedasticità condizionata di ordine p, q
Una serie temporale \(\{ \epsilon_t \}\) è data, ad ogni istanza, da:

\(\begin{eqnarray}\epsilon_t = \sigma_t w_t\end{eqnarray}\)

Dove \(\{ w_t \}\) è un rumore bianco discreto, con media zero e varianza unitaria, e \(\sigma^2_t\) è dato da:

\(\begin{eqnarray}\sigma^2_t = \alpha_0 + \sum^{q}_{i=1} \alpha_i \epsilon^2_{t-i} + \sum^{p}_{j=1} \beta_j \sigma^2_{t-j}\end{eqnarray}\)

Dove \(\alpha_i\) e \(\beta_j\) sono parametri del modello.

Possiamo concludere che \(\{ \epsilon_t \}\) è un modello autoregressivo generalizzato  a eteroschedasticità condizionatà di ordine p,q, indicato con GARCH(p,q).

Questa definizione è simile a quella di ARCH(p), con l’eccezione che stiamo aggiungendo termini di media mobile, cioè il valore di \(\sigma^2\) all’istante \(t\), \(\sigma^2_t\), dipende dai precedenti valori \(\sigma^2_{t-j}\).

Pertanto GARCH è “l’equivalente ARMA” di ARCH, che ha solo una componente autoregressiva.

Simulazioni, Correlogrammi e Model Fitting

Come sempre iniziamo con  il modello più semplice possibile, ovvero GARCH(1,1). Questo significa considerare un singolo ritardo autoregressivo e un singolo ritardo di “media mobile”. Il modello è dato da:

\(\begin{eqnarray}
\epsilon_t &=& \sigma_t w_t \\
\sigma^2_t &=& \alpha_0 + \alpha_1 \epsilon^2_{t-1} + \beta_1 \sigma^2_{t-1}
\end{eqnarray}\)

Da notare che è necessario  per \(\alpha_1 + \beta_1 < 1\) altrimenti la serie diventerà instabile.

Possiamo vedere che il modello ha tre parametri, cioè \(\alpha_0\),  \(\alpha_1\) e \(\beta_1\). Consideriamo \(\alpha_0 = 0.2\),  \(\alpha_1 = 0.5\) e \(\beta_1 = 0.3\).

Per creare il modello GARCH(1,1) con Python dobbiamo eseguire una procedura simile a quella delle simulazioni di una camminata casuale. Cioè, dobbiamo creare un vettore w per memorizzare i valori casuali di rumore bianco, quindi un  separato vettore eps per memorizzare i valori delle serie temporali.

In questo caso usiamo le funzioni di numpy per creare un vettore di zeri da popolare con i valori GARCH:

				
					
import numpy as np
#
# Simulating a GARCH(1, 1) process

np.random.seed(2)

a0 = 0.2
a1 = 0.5
b1 = 0.3

n = 10000
w = np.random.normal(size=n)
eps = np.zeros_like(w)
sigsq = np.zeros_like(w)

for i in range(1, n):
    sigsq[i] = a0 + a1*(eps[i-1]**2) + b1*sigsq[i-1]
    eps[i] = w[i] * np.sqrt(sigsq[i])
				
			

A questo punto abbiamo generato il nostro modello GARCH utilizzando i suddetti parametri su 10.000 campioni. Siamo ora in grado di tracciare il correlogramma:

				
					from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

plot_acf(eps)
plt.show()
				
			

Si noti che la serie sembra la realizzazione di un processo di rumore bianco discreto:

trading-quantitativo-modello_GARCH_1

Tuttavia, se tracciamo il correlogramma del quadrato della serie:

				
					
plot_acf(eps**2)
plt.show()
				
			

Vediamo che si tratta sostanzialmente di un processo condizionalmente eteroschedastico attraverso il decadimento di ritardi successivi:

trading-quantitativo-modello_GARCH_1_2

Come negli articoli precedenti, proviamo ad adattare un modello GARCH a questa serie simulata in modo da verificare se otteniamo gli stessi parametri della seria simulata. A tale scopo dobbiamo utilizzare la libreria arch di Python  che fornisce la funzione arch_model per eseguire questa procedura:

				
					# Fit a GARCH(1, 1) model to our simulated EPS series
# We use the arch_model function from the ARCH package

from arch import arch_model

am = arch_model(eps)
res = am.fit(update_freq=5)
print(res.summary())
				
			
				
					Constant Mean - GARCH Model Results                      
==============================================================================
Dep. Variable:                      y   R-squared:                       0.000
Mean Model:             Constant Mean   Adj. R-squared:                  0.000
Vol Model:                      GARCH   Log-Likelihood:               -12237.3
Distribution:                  Normal   AIC:                           24482.6
Method:            Maximum Likelihood   BIC:                           24511.4
                                        No. Observations:                10000
Date:                     Oct 14 2017   Df Residuals:                     9999
Time:                        16:30:47   Df Model:                            1
                                  Mean Model                                  
==============================================================================
                  coef    std err          t      P>|t|       95.0% Conf. Int.
------------------------------------------------------------------------------
mu         -6.7225e-03  6.735e-03     -0.998      0.318 [-1.992e-02,6.478e-03]
                            Volatility Model                            
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
omega          0.2021  1.043e-02     19.383  1.084e-83 [  0.182,  0.223]
alpha[1]       0.5162  2.016e-02     25.611 1.144e-144 [  0.477,  0.556]
beta[1]        0.2879  1.870e-02     15.395  1.781e-53 [  0.251,  0.325]
========================================================================

Covariance estimator: robust
				
			

Possiamo vedere che i parametri veri rientrano tutti nei rispettivi intervalli di confidenza.

Dati finanziari

Ora che sappiamo come simulare e adattare un modello GARCH, vogliamo applicare la procedura ad alcune serie finanziarie. In particolare, proviamo ad adattare ARIMA e GARCH all’indice S&P500 delle maggiori società statunitensi per capitalizzazione di mercato. Yahoo Finance utilizza il simbolo “^GSPC” per l’indice. Possiamo usare yfinance per ottenere i dati:

				
					import yfinance as yf

symbol = '^GSPC'
data = yf.download(symbol, start="2007-01-01")
data = data.asfreq('b').fillna(method='ffill')
				
			

Possiamo quindi calcolare le differenze dei rendimenti logaritmici del prezzo di chiusura:

				
					import numpy as np
Return = data['Adj Close'].pct_change()
LogRet = np.log(data['Adj Close']).diff().dropna()
				
			

E tracciare il grafico dei valori

				
					import matplotlib.pyplot as plt
plt.plot(LogRet)
plt.show()

				
			

È molto chiaro che ci sono periodi di aumento significativo della volatilità, in particolare intorno al 2008-2009, alla fine del 2011 e, più recentemente, a metà del 2015:

trading-quantitativo-modello_GARCH_sp500_log

Il prossimo passo consiste nell’adattare un modello ARIMA(p,d,q). Abbiamo  descritto come farlo nell’articolo precedente, quindi non ripetiamo la procedura ma riportiamo direttamente il codice Python:

				
					import pandas as pd
from statsmodels.tsa.arima_model import ARIMA

order_aic = []
# Loop over p values from 0-4
for p in range(5):
    # Loop over d values from 0-1
    for d in range(2):
        # Loop over q values from 0-4
        for q in range(5):
            try:
                # create and fit ARMA(p,q) model
                model = ARIMA(LogRet, order=(p, d, q))
                results = model.fit()

                # Append order and results tuple
                order_aic.append((p, d, q, results.aic, results))
            except Exception as e:
                print(str(e))
                pass

# Construct DataFrame from order_aic
order_df = pd.DataFrame(order_aic, columns=['p', 'd', 'q', 'AIC', 'Results'])

# Get the result of best order model
best_result = order_df.sort_values('AIC').iloc[0]
print("p = ", best_result.p)
print("d = ", best_result.d)
print("q = ", best_result.q)
				
			

Dal momento che abbiamo già differenziato i rendimenti della serie SP500, otteniamo la componente integrata d uguale a zero, come previsto:

				
					p =  4
d =  0
q =  3
				
			

Otteniamo un modello ARIMA(4,0,3), ovvero quattro parametri autoregressivi e tre parametri di media mobile.

Ora possiamo verificare se i residui di questo modello adattato hanno evidenze di  un comportamento  di eteroschedasticità condizionata. A tale scopo dobbiamo tracciare il correlogramma dei residui:

				
					from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

# Get residuals of the model
resid = best_result.Results.resid

# Plot ACF of residuals
plot_acf(resid, alpha=0.05, lags=30)
plt.show()
				
			
trading-quantitativo-modello_GARCH_sp500_resid

Sembra la realizzazione di un processo di rumore bianco discreto che indica che abbiamo raggiunto un buon adattamento con il modello ARIMA(4,0,3).

Per verificare il comportamento di eteroschedasticità condizionata dobbiamo quadrare i residui e tracciare il corrispondente correlogramma:

				
					plot_acf(resid**2, alpha=0.05, lags=30)
plt.show()
				
			
trading-quantitativo-modello_GARCH_sp500_resid_2

Possiamo vedere una chiara evidenza di correlazione seriale nei residui quadratici, portandoci alla conclusione che la serie dei rendimenti logaritmici differenziati dell’S&P 500 presenta un comportamento  di eteroschedasticità condizionata.

A questo punto siamo in grado di adattare un modello GARCH utilizzando la libreria arch di Python

				
					from arch import arch_model

am = arch_model(LogRet, vol='garch')
res = am.fit(update_freq=5)
				
			

Infine, per verificare il buon adattamento possiamo tracciare il correlogramma dei residui GARCH:

				
					resid = res.resid
plot_acf(resid, alpha=0.05, lags=30)
plt.show()
				
			
trading-quantitativo-modello_GARCH_sp500_resid_fit

Il correlogramma sembra la realizzazione di un processo di rumore bianco discreto, che indica il buon adattamento del modello.

Ancora una volta, abbiamo quella che sembra la realizzazione di un processo di rumore bianco discreto, indicando che abbiamo “spiegato” la correlazione seriale presente nei residui con un’appropriata miscela di ARIMA(p,d,q) e GARCH(p, q).

Prossimi passi

Finora abbiamo descritto come studiare le serie temporali applicando i modelli ARIMA e GARCH, consentendoci di adattare una combinazione di questi modelli a un indice del mercato azionario e di determinare se abbiamo raggiunto o meno un buon adattamento.

Il passaggio successivo consiste nel produrre effettivamente previsioni sui valori dei rendimenti giornalieri futuri tramite questo approccio e utilizzarlo per creare una strategia di trading di base. Questo sarà l’argomento dei prossimi articoli.

Torna su