27 jul 2022

4 Curso de Econometría Aplicada en R

Parte I. Introducción a la Economettría
Curso 1. Regresión y naturaleza del análisis econométrico
Clase 1. Naturaleza del modelo Econometríco
Clase 2. Repaso de inferencia estadística
Clase 3. Modelo de regresión
Clase 4. Modelo de regresión múltiple
Clase 5. Modelo de regresión en R

Curso 2. Análisis del modelo de regresión y econometría aplicada
Clase 6. Test de hipótesis 
Clase 7. Inferencia sobre el modelo de regresión en R
Clase 8. Formas funcionales y variables discretas
Clase 9. Formas funcionales en R
Clase 10. Selección de modelos en R

Parte II. Microeconometría y datos de Panel
Curso 3. Microeconometría y datos de panal
Clase 1. Causalidad estadística
Clase 2. Endogeneidad y variables instrumentales
Clase 3. Modelos de probabilidad
Clase 4. Panel estatico 

Parte III. Econometría Financiera y de Series Temporales
Curso 4. Econometría financiera en R
Clase 1. Modelos ARIMA en R
Clase 2. Modelos de volatilidad (GARCH en R)
Clase 3. Modelos factoriales y riesgo sistémico 
Clase 4. Valor en riesgo (VaR)
Clase 5. Vectores autoregresivos (VAR)


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 ...