1 jul 2022

Modelos GARCH sobre múltiples series financieras

 En la siguiente entrada vamos a estimar un modelo de volatilidad condicional para cada una de las variables contenidas en una base de datos, independientemente al numero de variables. Para tal ejemplo usamos la data EuStockMarkets que continente algunos índices financieros. Primero revisamos hemos importado los datos correctamente y realizamos un análisis descriptivo. En este caso no lo hacemos, pero recuerde siempre verificar temas como cambios estructurales, datos perdidos, distribución de los datos, ….

library(dplyr)
library(tibble)
library(fGarch)
library(ggplot2)
library(stargazer)
library(tidyr)

head(EuStockMarkets)
Time Series:
Start = c(1991, 130)
End = c(1991, 135)
Frequency = 260
             DAX    SMI    CAC   FTSE
1991.496 1628.75 1678.1 1772.8 2443.6
1991.500 1613.63 1688.5 1750.5 2460.2
1991.504 1606.51 1678.6 1718.0 2448.2
1991.508 1621.04 1684.1 1708.1 2470.4
1991.512 1618.16 1686.6 1723.1 2484.7
1991.515 1610.61 1671.6 1714.3 2466.8

Posteriormente usamos la función across para obtener la variación de cada serie. Es importante precisar que un análisis formal requeriría un test de estacionariedad sobre las series.  

data_returns <- EuStockMarkets %>%
  as.tibble() %>%
  mutate(
    across(everything(),
           ~((./dplyr::lag(.)-1)*100)
    )) %>%
  na.omit()
 
head(data_returns)
# A tibble: 6 × 4
     DAX    SMI    CAC   F+TSE
   <dbl>  <dbl>  <dbl>  <dbl>
1 -0.928  0.620 -1.26   0.679
2 -0.441 -0.586 -1.86  -0.488
3  0.904  0.328 -0.576  0.907
4 -0.178  0.148  0.878  0.579
5 -0.467 -0.889 -0.511 -0.720
6  1.25   0.676  1.18   0.855

Ahora, guardamos en una lista el modelo GARCH(1,1) correspondiente a cada una de las columnas de mi base de datos. Cada modelo se guarda en una lista dado que permite posteriormente recuperar todos los elementos de la salida de la función garchFit.

models0 <- list()
 
for (i in 1:ncol(data_returns)){
  models0[[i]] <- garchFit( ~  garch(1, 1), trace = F, data = data_returns[,i])
}
 
El commando stargazer nos permite obtener una tabla con los coeficientes asociado a cada variable.
stargazer(models0, type="text")
===========================================================
                              Dependent variable:         
                    ---------------------------------------
                        [         [         [         [   
                       (1)       (2)       (3)       (4)  
-----------------------------------------------------------
mu                  0.070***  0.106***   0.049**  0.052***
                     (0.021)   (0.020)   (0.025)   (0.017)
                                                          
omega               0.044***  0.120***   0.081**   0.009* 
                     (0.012)   (0.024)   (0.037)   (0.005)
                                                           
alpha1              0.068***  0.127***  0.051***  0.046***
                     (0.015)   (0.024)   (0.015)   (0.012)
                                                          
beta1               0.891***  0.735***  0.882***  0.941***
                     (0.023)   (0.043)   (0.042)   (0.018)
                                                          
-----------------------------------------------------------
Observations          1,859     1,859     1,859     1,859 
Log Likelihood      2,587.920 2,412.241 2,788.477 2,136.479
Akaike Inf. Crit.     2.789     2.600     3.004     2.303 
Bayesian Inf. Crit.   2.800     2.611     3.016     2.315 
===========================================================
Note:                           *p<0.1; **p<0.05; ***p<0.01

Otra opción es recuperar la volatilidad histórica asociada a cada modelo. Para esto utilizamos la función vectorizada lapply que nos permite repetir una operación/función, para cada uno de los elementos de una lista, generando una lista de vectores de volatilidades que convertimos en una matriz a partir de la función do.call.

 vols_models <- lapply(models0, function(x) x@sigma.t)
dataVol <- data.frame(do.call(cbind, vols_models))
colnames(dataVol) <- colnames(EuStockMarkets)
 
dataVol %>%  head()
 
        DAX       SMI      CAC      FTSE
1 1.0281714 0.9246996 1.102485 0.7967414
2 1.0265176 0.8843931 1.114000 0.7901069
3 1.0004172 0.8695389 1.167243 0.7807891
4 0.9915619 0.8258928 1.141444 0.7849713
5 0.9614558 0.7884808 1.125005 0.7754941
6 0.9420005 0.8386133 1.101589 0.7760277

 A partir de estas series de volatilidades, podemos obtener una representación gráfica de las series de volatilidades:

dataVol %>%
  mutate(fecha = 1:nrow(dataVol)) %>%
  as.data.frame() %>%
  pivot_longer(!fecha, names_to = "var", values_to = "value") %>%
     ggplot(aes(x = fecha, y = value)) +
     geom_line(aes(color = var))+
     facet_wrap(~var, scales='free_y', ncol = 2) +
     theme_classic()+
  theme(legend.position = "none",
        axis.ticks = element_line(colour = "grey70", size = 0.2),
        strip.background = element_blank()) +
  scale_colour_grey(start = 0.1,end = 0.1)

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...