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(tibble)
library(fGarch)
library(ggplot2)
library(stargazer)
library(tidyr)
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.
as.tibble() %>%
mutate(
across(everything(),
~((./dplyr::lag(.)-1)*100)
)) %>%
na.omit()
# 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[[i]] <- garchFit( ~ garch(1, 1), trace = F, data = data_returns[,i])
}
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.
dataVol <- data.frame(do.call(cbind, vols_models))
colnames(dataVol) <- colnames(EuStockMarkets)
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
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)