El siguiente ejemplo en R muestra como realizar un análisis comparativo
del Dow Jones Industrial Average (DJIA) durante diferentes administraciones
presidenciales de USA. Este código te permitirá realizar el estudio de eventos que
deseas sobre el comportamiento del DJIA durante los diferentes periodos
presidenciales. Puntualmente, se normalizan las series, en relación a una fecha inicial, para describir o comparar la dinámica de las mismas.
1.
Descarga datos
En primer lugar se cargan los datos desde FRED (https://fred.stlouisfed.org/series/DJIA). El código utiliza read_excel
para cargar los datos directamente desde tu ruta específica, con el nombre de
la hoja "Daily, Close". es decir, el Excel descargado debe estar en el directorio.
# Cargar las bibliotecas necesarias
library(readxl)
library(ggplot2)
library(dplyr)
library(lubridate)
library(zoo)
DJIA <- read_excel("//… /DJIA.xlsx",
sheet = "Daily,
Close", col_types = c("date", "numeric"))
#View(DJIA)
# Renombrar columnas para mayor
claridad (opcional)
names(DJIA) <- c("Fecha",
"Valor")
DJIA |>
na.omit()
Maneja la estructura de datos donde las columnas son observation_date y DJIA,
renombrándolas a "Fecha" y "Valor" para mayor claridad.
# A tibble: 2,608 × 2
Fecha Valor
<date> <dbl>
1
2015-04-06 17881.
2 2015-04-07 17875.
3 2015-04-08 17903.
4 2015-04-09 17959.
5 2015-04-10 18058.
6 2015-04-13 17977.
7 2015-04-14 18037.
8 2015-04-15 18113.
9 2015-04-16 18106.
10 2015-04-17 17826.
# ℹ
2,598 more rows
# ℹ Use
`print(n = ...)` to see more rows
2. Normalización: Para cada
administración (Obama 1, Obama 2, Trump 1, Biden, Trump 2), el código normaliza
el índice tomando como base 100 el primer día de cada gobierno.
El código sigue realizando la normalización de las series,
tomando como base 100 el primer día disponible de cada administración
presidencial. Busca la fecha igual al inicio o la fecha próxima disponible próximo al
evento, para evitar valores en blanco cuando no se tengan valores para la fecha del día de incio.
# Establecer fechas para cada
administración presidencial
# Obama 1: 20 de enero de 2009
# Obama 2: 20 de enero de 2013
# Trump 1: 20 de enero de 2017
# Biden: 20 de enero de 2021
# Trump 2: 20 de enero de 2025
# Asegurarse que Fecha es tipo Date
DJIA$Fecha <- as.Date(DJIA$Fecha)
# Ver el rango de fechas disponibles
fecha_min <- min(DJIA$Fecha)
fecha_max <- max(DJIA$Fecha)
cat("Rango de fechas
disponibles:", as.character(fecha_min), "a",
as.character(fecha_max), "\n")
# Establecer fechas para cada
administración presidencial
administraciones <- data.frame(
Nombre = c("Trump 1", "Biden", "Trump 2"),
Fecha_Oficial = as.Date(c("2017-01-20",
"2021-01-20", "2025-01-20")),
stringsAsFactors = FALSE
)
# Encontrar la primera fecha disponible
después de la fecha oficial para cada administración
for (i in 1:nrow(administraciones)) {
fecha_oficial <- administraciones$Fecha_Oficial[i]
primera_fecha_disponible <- min(DJIA$Fecha[DJIA$Fecha >=
fecha_oficial], na.rm = TRUE)
# Solo considerar administraciones que tienen datos dentro del rango
if (primera_fecha_disponible <= fecha_max) {
administraciones$Fecha_Inicio[i] <- primera_fecha_disponible
} else {
administraciones$Fecha_Inicio[i] <- NA
}
}
# Eliminar administraciones sin datos
disponibles
administraciones <-
administraciones[!is.na(administraciones$Fecha_Inicio),]
# Imprimir fechas de inicio reales
utilizadas
cat("Fechas de inicio utilizadas
para cada administración:\n")
for (i in 1:nrow(administraciones)) {
cat(administraciones$Nombre[i], ": Fecha oficial =",
as.character(administraciones$Fecha_Oficial[i]),
", Fecha utilizada =",
as.character(administraciones$Fecha_Inicio[i]), "\n")
}
# Añadir fechas de fin (último día de
la administración o fecha más reciente disponible)
for (i in 1:nrow(administraciones)) {
if (i < nrow(administraciones)) {
# Último día antes de la siguiente administración
administraciones$Fecha_Fin[i] <- administraciones$Fecha_Inicio[i+1] -
1
} else {
# Para la última administración, usar la fecha más reciente disponible
administraciones$Fecha_Fin[i] <- fecha_max
}
}
# Función para normalizar por
administración
normalizar_por_administracion <-
function(df, admin_row) {
nombre <- admin_row$Nombre
fecha_inicio <- admin_row$Fecha_Inicio
fecha_fin <- admin_row$Fecha_Fin
# Filtrar por período
periodo <- df %>%
filter(Fecha >= fecha_inicio & Fecha <= fecha_fin)
# Si no hay datos para este período, retornar NULL
if(nrow(periodo) == 0) {
return(NULL)
}
# Normalizar al primer día disponible
primer_valor
<- periodo$Valor[1]
periodo$Valor_Normalizado <- periodo$Valor / primer_valor * 100
# Añadir información de administración y días transcurridos
periodo$Administracion <- nombre
periodo$Dias <- as.numeric(periodo$Fecha - fecha_inicio)
return(periodo)
}
# Aplicar normalización para cada
administración
resultados <- list()
for(i in 1:nrow(administraciones)) {
temp <- normalizar_por_administracion(DJIA, administraciones[i,])
if(!is.null(temp)) {
resultados[[i]] <- temp
}
}
# Combinar resultados
datos_normalizados <-
bind_rows(resultados)
# Definir colores para cada
administración - paleta sobria para paper económico
colores_admin <- c("Obama
2" = "steelblue", "Trump 1" = "#F5ABB2",
"Biden" = "#89ACC2", "Trump 2" =
"#732F37")
3. Visualización: Crea un gráfico
de líneas donde puedes ver el rendimiento relativo del DJIA a lo largo del
tiempo para cada administración, lo que facilita la comparación entre ellas.
# Crear gráfico
ggplot(datos_normalizados, aes(x =
Dias, y = Valor_Normalizado, color = Administracion)) +
geom_line(size = 0.8) +
scale_color_manual(values = colores_admin) +
labs(
title = "Rendimiento relativo del DJIA por administración
presidencial",
subtitle = "Índice relativo al primer día de cada administración
(100 = primer día)",
x = "Días desde inicio de administración",
y = "DJIA (Normalizado, Primer día = 100)",
color = "Administración"
) +
theme_bw() +
theme(
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "gray90"),
legend.position = "bottom",
legend.title = element_text(face = "plain", size = 10),
legend.text = element_text(size = 9),
plot.title = element_text(hjust = 0.5, face = "bold", size =
11),
plot.subtitle = element_text(hjust = 0.5, size = 10, face =
"italic"),
axis.title = element_text(size = 10),
axis.text = element_text(size = 9)
) +
scale_x_continuous(breaks = seq(0, 1500, 365), labels = function(x) paste0(round(x/365,
1), " años")) +
scale_y_continuous(breaks = seq(80, 180, 20))