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:
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:
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:
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()
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()
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()
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.