3 abr 2025

Análisis de eventos en R: Dow Jones Industrial Average (DJIA) durante diferentes administraciones presidenciales de USA

El siguiente ejemplo en R para realizar un análisis comparativo del Dow Jones Industrial Average (DJIA) durante diferentes administraciones presidenciales. Este código te permitirá realizar el estudio de eventos que deseas sobre el comportamiento del DJIA durante los diferentes periodos presidenciales.

 1.       Descarga datos

El código utiliza read_excel para cargar los datos directamente desde tu ruta específica, con el nombre de la hoja "Daily, Close".

 # 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 misma normalización, tomando como base 100 el primer día disponible de cada administración presidencial. Busca la fecha igual al inicio o la próximo disponible próximo al evento, para evitar valores en blanco cuando no se tenga fecha.

 # 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))



Análisis de eventos en R: Dow Jones Industrial Average (DJIA) durante diferentes administraciones presidenciales de USA

El siguiente ejemplo en R para realizar un análisis comparativo del Dow Jones Industrial Average (DJIA) durante diferentes administraciones ...