30 nov 2021

Análisis descriptivo sobre series de índices financieros en R

En la siguiente entrada se utiliza la base de datos tipo wide de nombre EuStockMarkets, disponible en R, la misma cuenta con los índices asociados a los siguientes activos financieros (solo se presenta como obtener los datos sin profundizar sobre la forma de interpretación de los mismos):

> head(EuStockMarkets)

         DAX    SMI    CAC   FTSE

[1,] 1628.75 1678.1 1772.8 2443.6

[2,] 1613.63 1688.5 1750.5 2460.2

[3,] 1606.51 1678.6 1718.0 2448.2

[4,] 1621.04 1684.1 1708.1 2470.4

[5,] 1618.16 1686.6 1723.1 2484.7

[6,] 1610.61 1671.6 1714.3 2466.8

Mediante el tidyverse se puede obtener una representación de la evolución de los índices financieros contenidos, verificándose claramente que estos no corresponden a series estacionarias. Al menos en media se verifica que esta cambia en el tiempo. Por lo que, no podemos obtener estadísticos descriptivos sobre estos índices. 

library(tidyverse)

 

data.frame(EuStockMarkets) %>%

  mutate(date = time(EuStockMarkets)) %>%

  gather(id, value, -date) %>%

  ggplot(aes(x = date, y = value)) +

  geom_line(aes(color = id), size = 1)+

  theme_minimal()

Ahora usamos la función mutate, del paquete dplyr, para obtener una variable de la tasa de crecimiento relativa, o nivel de retorno en el mundo financiero. Estas series, al menos presentan estabilidad en media y es sobre esta que obtendremos un análisis descriptivo. Una alternativa es usar la función across para obtener una tasa de variación para cada variable, pero aquí convertimos la data tipo long (wide to long), para posteriormente realizar la operación de crear la tasa de crecimientos mensual (retornos financieros), mediante grupo (cada grupo es una variable).

EuStockMarkets %>%

  data.frame() %>%

  gather(id, value) %>%

  group_by(id) %>%

  mutate(tc_relativa = ((value/dplyr::lag(value,1))-1)*100)

 

# A tibble: 7,440 x 3

# Groups:   id [4]

   id    value tc_relativa

   <chr> <dbl>       <dbl>

 1 DAX   1629.      NA   

 2 DAX   1614.      -0.928

 3 DAX   1607.      -0.441

 4 DAX   1621.       0.904

 5 DAX   1618.      -0.178

 6 DAX   1611.      -0.467

 7 DAX   1631.       1.25

 8 DAX   1640.       0.578

 9 DAX   1635.      -0.287

10 DAX   1646.       0.637

# ... with 7,430 more rows

Ahora, para cada variable se realiza un summarise donde se contiene la media y varianza, indicadores claves en la gestión de cartera financiera. Ahora, es importante tener presente que la diferencia en media entre los diferentes índices no permite comparar el error estándar, por tanto, se utiliza el coeficiente de variación como medida de volatilidad normalizada, que permite comparar nivel de volatilidad entre series. La librería moment se utiliza para obtener la asimetría y la curtosis de las series, indicadores clave de la distribución de carteras, al brinda información principalmente sobre la forma que puede asumir la cola de la distribución de la forma de retornos, indicador usado para obtener indicadores como el Valor en Riesgo (VaR).

Note además que en el siguiente ejemplo se agrega el p-valor asociado a tres test estadísticos: i) Jaque-Bera; ii) L-Jiung test de autocorrelación sobre los retornos; y, iii) L-Jiung test de autocorrelación sobre los retornos al cuadrado, como forma de estudiar normalidad, y persistencia en media y volatilidad respectivamente. 

library(moments)

 

EuStockMarkets %>%

  data.frame() %>%

  gather(id, value) %>%

  group_by(id) %>%

  mutate(tc_relativa = ((value/dplyr::lag(value,1))-1)*100) %>%

  summarise(media = mean(tc_relativa,na.rm = T),

            mediana = median(tc_relativa,na.rm = T),

            Max = max(tc_relativa,na.rm = T),

            Min = min(tc_relativa,na.rm = T),

            Error = sd(tc_relativa,na.rm = T),

            coef_var = Error/media,

            Curtosis = kurtosis(tc_relativa,na.rm = T),

            Simetria = skewness(tc_relativa,na.rm = T),

            JB_test = jarque.test(tc_relativa[-1])$p.value,

            Ljiung = Box.test(tc_relativa, lag = 1, type = "Ljung")$p.value,

            Ljiung2 = Box.test(tc_relativa^2, lag = 1, type = "Ljung")$p.value)

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