require("knitr")
require("tinytex")
require("readr")
require("dplyr")
require("ggplot2")
Se analizará los principales índices bursátiles de México, Alemania y Japón. Los índices elegidos son el IPC, el DAX y el Nikkei 225, respectivamente.
Se extrajo los precios diarios correspondientes desde el 1 de enero del 2020 hasta el 6 de marzo del 2021. Gracias a que los datos son diarios se pudo considerar los log-rendimientos.
La información se obtuvo de la página Investing México y los enlaces se encuentran en la sección de referencias.
IPC <- read_csv("Datos históricos IPC.csv" )
DAX <- read_csv("Datos históricos DAX.csv")
Nikkei <- read_csv("Datos históricos Nikkei 225.csv")
Índices <- c("IPC", "DAX", "Nikkei")
IPC <- IPC %>%
select(Fecha, Cierre) %>%
rename(PreciosIPC = Cierre)
DAX <- DAX %>%
select(Fecha, Cierre) %>%
rename(PreciosDAX = Cierre)
Nikkei <- Nikkei %>%
select(Fecha, Cierre) %>%
rename(PreciosNikkei = Cierre)
Datos <- IPC %>%
inner_join(DAX, "Fecha") %>%
inner_join(Nikkei, "Fecha")
attach(Datos)
RendimientosIPC <- c(NA, PreciosIPC[-1]/PreciosIPC[-nrow(Datos)] - 1)
RendimientosDAX <- c(NA, PreciosDAX[-1]/PreciosDAX[-nrow(Datos)] - 1)
RendimientosNikkei <- c(NA, PreciosNikkei[-1]/PreciosNikkei[-nrow(Datos)] - 1)
Datos <- cbind(Datos, RendimientosIPC, RendimientosDAX, RendimientosNikkei)
Datos <- Datos %>%
mutate(LogRendimientosIPC = log(1+RendimientosIPC),
LogRendimientosDAX = log(1+RendimientosDAX),
LogRendimientosNikkei = log(1+RendimientosNikkei))
attach(Datos)
Primero se observa la serie de tiempo de cada índice.
ggplot(IPC, aes(x=1:length(PreciosIPC), y = PreciosIPC )) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "Precios",
title = "Serie del tiempo de los precios del IPC"
) +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
#DAX
ggplot(DAX, aes(x=1:length(PreciosDAX), y = PreciosDAX )) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "Precios",
title = "Serie del tiempo de los precios del DAX"
) +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
#Nikkei
ggplot(Nikkei, aes(x=1:length(PreciosNikkei), y = PreciosNikkei )) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "Precios",
title = "Serie del tiempo de los precios del Nikkei"
) +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
Para tener una idea concreta de los datos, se muestra los peores 5 precios que alcanzó cada índice a lo largo del año:
kable( data.frame(arrange(IPC,PreciosIPC )[1:5, ],
arrange(DAX,PreciosDAX )[1:5, ],
arrange(Nikkei,PreciosNikkei )[1:5, ]),
col.names = c("Fechas IPC", "Precios IPC", "Fechas DAX", "Precios DAX", "Fechas Nikkei", "Precios Nikkei"),
align = "cccccc",
caption = "Tabla 1. Peores cinco días de cada índice"
)
| Fechas IPC | Precios IPC | Fechas DAX | Precios DAX | Fechas Nikkei | Precios Nikkei |
|---|---|---|---|---|---|
| 23.03.2020 | 270.05 | 18.03.2020 | 8441.71 | 19.03.2020 | 16552.83 |
| 03.04.2020 | 270.99 | 19.03.2020 | 8610.43 | 18.03.2020 | 16726.55 |
| 02.04.2020 | 275.34 | 23.03.2020 | 8741.15 | 23.03.2020 | 16887.78 |
| 01.04.2020 | 276.22 | 16.03.2020 | 8742.25 | 16.03.2020 | 17002.04 |
| 16.04.2020 | 277.07 | 20.03.2020 | 8928.95 | 17.03.2020 | 17011.53 |
Se nota que los peores días para todos los índices se corresponden con el inicio de la pandemia.
Ahora se analizará las propiedades más relevantes de los log-rendimientos.
ResumenIPC <- Datos %>%
summarize(Promedio = mean(LogRendimientosIPC[-1]),
Volatilidad = sd(LogRendimientosIPC[-1]),
Mínimo = min(LogRendimientosIPC[-1]),
Máximo = max(LogRendimientosIPC[-1]),
PrimerCuantil = quantile(LogRendimientosIPC[-1], 0.25, type=2),
Mediana = median(LogRendimientosIPC[-1]),
TercerCuantil = quantile(LogRendimientosIPC[-1], 0.75, type=2)
)
ResumenDAX <- Datos %>%
summarize(Promedio = mean(LogRendimientosDAX[-1]),
Volatilidad = sd(LogRendimientosDAX[-1]),
Mínimo = min(LogRendimientosDAX[-1]),
Máximo = max(LogRendimientosDAX[-1]),
PrimerCuantil = quantile(LogRendimientosDAX[-1], 0.25, type=2),
Mediana = median(LogRendimientosDAX[-1]),
TercerCuantil = quantile(LogRendimientosDAX[-1], 0.75, type=2)
)
ResumenNikkei <- Datos %>%
summarize(Promedio = mean(LogRendimientosNikkei[-1]),
Volatilidad = sd(LogRendimientosNikkei[-1]),
Mínimo = min(LogRendimientosNikkei[-1]),
Máximo = max(LogRendimientosNikkei[-1]),
PrimerCuantil = quantile(LogRendimientosNikkei[-1], 0.25, type=2),
Mediana = median(LogRendimientosNikkei[-1]),
TercerCuantil = quantile(LogRendimientosNikkei[-1], 0.75, type=2)
)
Resumen <- data.frame(t(ResumenIPC), t(ResumenDAX), t(ResumenNikkei))
kable(Resumen,
col.names = Índices,
align = "ccc",
caption = "Tabla 2. Resumen de los índices")
| IPC | DAX | Nikkei | |
|---|---|---|---|
| Promedio | -0.0002589 | -0.0003354 | -0.0007869 |
| Volatilidad | 0.0159085 | 0.0201796 | 0.0161622 |
| Mínimo | -0.0462389 | -0.1041429 | -0.0773137 |
| Máximo | 0.0649644 | 0.1305486 | 0.0627357 |
| PrimerCuantil | -0.0102942 | -0.0092435 | -0.0090927 |
| Mediana | -0.0003302 | 0.0001437 | 0.0001634 |
| TercerCuantil | 0.0074944 | 0.0067435 | 0.0068776 |
A partir de este resumen se puede observar que:
Se tiene una pequeña muestra de los log-rendimientos:
# Muestra de los 10 primeros log-rendimientos
kable( select(Datos, LogRendimientosIPC:LogRendimientosNikkei)[2:11, ],
caption = "Tabla 3. Primeros 10 log-rendimientos")
| LogRendimientosIPC | LogRendimientosDAX | LogRendimientosNikkei | |
|---|---|---|---|
| 2 | -0.0154583 | -0.0325254 | 0.0042033 |
| 3 | -0.0070754 | 0.0096973 | 0.0022767 |
| 4 | 0.0079046 | 0.0016839 | 0.0215087 |
| 5 | -0.0145310 | -0.0028613 | -0.0051191 |
| 6 | -0.0187536 | -0.0019235 | 0.0086448 |
| 7 | -0.0042396 | -0.0162980 | -0.0237943 |
| 8 | -0.0068805 | 0.0067261 | 0.0406676 |
| 9 | 0.0182172 | 0.0069409 | -0.0165970 |
| 10 | -0.0047704 | -0.0018592 | 0.0161912 |
| 11 | -0.0007483 | 0.0030913 | -0.0045904 |
Se graficaron las series de tiempo, donde el intervalo de confianza es el intervalo inter cuantil.
# IPC
ggplot(Datos, aes(x=1:length(LogRendimientosIPC), y = LogRendimientosIPC)) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "Log-rendimientos",
title = "Serie del tiempo de los log-rendimientos del IPC"
) +
geom_hline(yintercept = Resumen["Promedio",1], colour = "#FDB549") +
geom_hline(yintercept = Resumen["PrimerCuantil",1], colour = "#B2D1F2") +
geom_hline(yintercept = Resumen["TercerCuantil",1], colour = "#F7BAE2") +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
# DAX
ggplot(Datos, aes(x=1:length(LogRendimientosDAX), y = LogRendimientosDAX)) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "Log-rendimientos",
title = "Serie del tiempo de los Log-rendimientos del DAX"
) +
geom_hline(yintercept = Resumen["Promedio",2], colour = "#FDB549") +
geom_hline(yintercept = Resumen["PrimerCuantil",2], colour = "#B2D1F2") +
geom_hline(yintercept = Resumen["TercerCuantil",2], colour = "#F7BAE2") +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
# Nikkei
ggplot(Datos, aes(x=1:length(LogRendimientosNikkei), y = LogRendimientosNikkei)) +
geom_line() +
labs(
x = "1 de enero del 2020 hasta 6 de marzo del 2021",
y = "log-rendimientos",
title = "Serie del tiempo de los log-rendimientos del Nikkei"
) +
geom_hline(yintercept = Resumen["Promedio",3], colour = "#FDB549") +
geom_hline(yintercept = Resumen["PrimerCuantil",3], colour = "#B2D1F2") +
geom_hline(yintercept = Resumen["TercerCuantil",3], colour = "#F7BAE2") +
theme_classic() +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
panel.grid = element_blank(),
)
ggplot(Datos, aes(x = LogRendimientosIPC)) +
geom_histogram(fill = "#FDB549") +
labs(
title = "Log-rendimientos del IPC"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir"),
)
ggplot(Datos, aes(x = LogRendimientosDAX)) +
geom_histogram(fill = "#FDB549") +
labs(
title = "Log-rendimientos del DAX"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir")
)
ggplot(Datos, aes(x = LogRendimientosNikkei)) +
geom_histogram(fill = "#FDB549") +
labs(
title = "Log-rendimientos del Nikkei"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir")
)
Se observa que los 3 índices tienen un comportamiento similar; los 3 histogramas muestran una distribución casi simétrica pero ligeramente cargada a la izquierda. Se puede apreciar que hay muchas observaciones atípicas y las hay tanto muy grandes como muy pequeñas; al comparar con la tabla 1 se puede inferir que esto se debe a la pandemia.
#IPC
ggplot(Datos, aes(x = LogRendimientosIPC)) +
geom_boxplot(fill = "#FDB549") +
labs(
title = "Log-rendimientos del IPC"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir")
)
#DAX
ggplot(Datos, aes(x = LogRendimientosDAX)) +
geom_boxplot(fill = "#FDB549") +
labs(
title = "Log-rendimientos del DAX"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir")
)
#Nikkei
ggplot(Datos, aes(x = LogRendimientosNikkei)) +
geom_boxplot(fill = "#FDB549") +
labs(
title = "Log-rendimientos del Nikkei"
) +
theme_classic() +
theme(
text = element_text(family = "Avenir")
)
A partir de los diagramas se aprecia que los valores atípicos del DAX son los más grandes, que los rangos inter cuantil tienen tamaño similar y que debido a la existencia de tantos valores atípicos no sería adecuado considerar que la distribución es normal y debería pensarnse en modelar con alguna distribución con colas grandes como la t de Student con pocos grados de libertad.
Ahora se probará gráficamente si los log-rendimientos pueden ser modelados de manera adecuada con una distribución normal.
#IPC
qqnorm(LogRendimientosIPC,
main = "Q-Q plot para log-rendimientos del IPC",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles muestrales")
qqline(LogRendimientosIPC, col = "#FDB549")
#DAX
qqnorm(LogRendimientosDAX,
main = "Q-Q plot para log-rendimientos del DAX",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles muestrales")
qqline(LogRendimientosDAX, col = "#FDB549")
#Nikkei
qqnorm(LogRendimientosNikkei,
main = "Q-Q plot para log-rendimientos del Nikkei",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles muestrales")
qqline(LogRendimientosNikkei, col = "#FDB549")
Puede observarse que que los datos no se aproximan adecuadamente por una distribución normal, pues si bien coinciden bastante bien con la recta cerca del cero, resulta que conforme los datos se alejan la recta ya no los contiene. A pesar de esto creo que elegir la distribución normal no es una mala opción ya que su error no es tan grande y tiene la propiedad de simestría que no poseen otras distribuciones de colas pesadas.
A partir del análisis se aprecia que la pandemia tuvo un fuerte impacto en el desempeño de los países pues se llegó a alcanzar valores muy grandes y muy bajos, además de que en general los datos estuvieron dispersos. Por otro lado, los 3 países tuvieron un comportamiento similar, lo que se refleja en la consistencia de sus gráficos y aunque no son bien modelados por la distribución normal parece que esta propuesta es bastante sensata. Cabe resaltar que los resultados de México fueron bastante parecidos a los de los otros países desarrollados.