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.
El código utiliza read_excel
para cargar los datos directamente desde tu ruta específica, con el nombre de
la hoja "Daily, Close".
library(readxl)
library(ggplot2)
library(dplyr)
library(lubridate)
library(zoo)
sheet = "Daily, Close", col_types = c("date", "numeric"))
#View(DJIA)
names(DJIA) <- c("Fecha", "Valor")
na.omit()
Maneja la estructura de datos donde las columnas son observation_date
y DJIA
,
renombrándolas a "Fecha" y "Valor" para mayor claridad.
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
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.
# 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
DJIA$Fecha <- as.Date(DJIA$Fecha)
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")
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
)
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
}
}
administraciones <- administraciones[!is.na(administraciones$Fecha_Inicio),]
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")
}
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
}
}
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
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)
}
resultados <- list()
temp <- normalizar_por_administracion(DJIA, administraciones[i,])
if(!is.null(temp)) {
resultados[[i]] <- temp
}
}
datos_normalizados <- bind_rows(resultados)
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.
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))