library(readr)
library(dplyr)
library(tidyverse)
library(lubridate)
library(mice)
library(ggplot2)
library(plotly)
library(tidyr)
library(skimr)
library(naniar)
library(scales)
library(caret)
library(kknn)
library(class)
library(rpart)
library(rpart.plot)
library(e1071)
library(naivebayes)

pacman::p_load(
  rio, here, janitor, epikit, naniar
)

Introducción:

El mercado de valores es uno de los sistemas más complejos de la la economía moderna. El índice de S&P500, agrupa las 500 empresas de mayor capitulización en Estados Unidos, este es considerado como un termometro que representa la economía americana y, una referencia global del comportamiento financiero. No obstante, aunque en teoría, a largo plazo ofrece un rendimiento promedio de 10% anual, su comportamiento no es homogéneo a lo largo del tiempo: existen periodos de estabilidad, donde lo retornos son estables y la volatibilidad es baja y periodos de turbulencia que son conocidos como periodos de “crisis

La motivación de este proyecto surge de la pregunta financiera si: Es posible, a partir de varible macroeconómicas se puede encontrar en el mercado estados de estabilidad y crisis? Por tal razón, decidimos usar técnicas de minería de datos como: KNN, Arboles de decisión y Clasificador Bayesiano, para aprender patrones que diferencian regímenes el mercado y evaluar que tan bien estos modelos pueden clasificarlos.


Parte 1: Base de datos

Fuente de los datos

Todos los datos utilizados en este proyecto fueron descargados de FRED (Federal Reserve Economic Data),el repositorio de series económicas y financieras de la Reserva Federal de los Estados Unidos. FRED es una fuente primaria, de acceso público utilizada para investigaciones académicas y análisis financiero profesional.

El periodo de análisis que utilizamos fue desde 8 de marzo de 2021 hasta el 27 de febrero de 2026, cubriendo así tanto periodos e recuperación post-pandemia, el ciclo e 2022-2023 con el alzamiento de tasas más agresivo de la Reserva Federal y la estabilización después del mercado. Este rango temporal es particularmente rico porque aunque es corto, contiene episodios bien diferenciados de estabilidad y crisis.

Variables seleccionada y justificación

La selección de cada variable no fue arbitraria . Cada una fue escogida porque representa cierta dimensión distinta dentro del comportamiento del mercado y tiene su rol explicativo dentro de la literatura económica y financiera.

S&P500

Descripción: Valor de cierre diario del índice S&P 500

EL S&P 500 es la variable central del estudio. Representa el nivel del mercado de renta variable estadounidense. Sus valores capturan el sentimiento general de los inversores, las expectativas de crecimiento corporativo y la reacción al nivel de riesgo que representa. Su comportamiento en un nivel elevado puede ser indice de estabilidad o confianza; caídas sostenidas señalan deterioro económico o incertidumbre. Es, en esencia, el objeto de estudio que queremos entender y clasificar.

VIX

Descripción: Índice de volatilidad implícita del mercado, calculado por el CBOE a partir de opciones sobre el S&P 500

El VIX s conocido como el “Indice del miedo”. Este mide la volatibilidad esperada por el mercado.Un VIX bajo (por debajo de 20) indica que los participantes del mercado anticipan un ambiente tranquilo; un VIX por encima de 20 refleja incertidumbre elevada, y valores superiores a 30 corresponden a episodios de alta tensión financiera. Esta variable cumple un rol especial en el proyecto: se utiliza como criterio de clasificación para definir si un periodo es de Estabilidad (VIX < 20) o de Crisis (VIX ≥ 20). Es importante destacar que, precisamente por este motivo, el VIX es excluido como predictor en los modelos de clasificación, lo cual se explica en detalle en la sección de metodología.

TASA

Descripción: Rendimiento del bono del Tesoro de los Estados Unidos a 10 años, expresado en porcentaje

La tasa de interés a largo plazo es uno de los indicadores macroeconómicos más importantes para los mercados financieros. Cuando la Reserva Federal sube la tasa de interes para combatir la inflación (como en el periodo de 2022 al 2023), el costo del crédito corporativo aumenta, las valuaciones de las acciones en el mercado caen, y los bonos se vuelven más competitivos. Esta variable captura el estado de la política monetaria y su presión sobre el mercado de acciones.

INFLA

Descripcción: Tasa de inflación esperada a 10 años, derivada de los valores del Tesoro protegidos contra la inflación

Las expectativas de inflación afectan directamente las decisiones de inversión.Una inflación esperada elevada erosiona el valor real de los retornos futuros, genera presión sobre la Reserva Federal para subir tasas, y aumenta la incertidumbre macroeconómica. Durante el periodo 2021–2023, las expectativas de inflación jugaron un papel central en la volatilidad del S&P 500, lo que hace que esta variable sea especialmente relevante para nuestro análisis.

Dollar

Descripcción: Valor del dólar frente a una canasta de monedas de los principales socios comerciales de Estados Unidos

La relación del dólar y el mercado es ciertamente compleja, un dólar fuerte puede perjudicar a las empresas exportadoras del S&P 500.Pero también, puede reflejar lo que se conoce como un “flight to safety”, la búsqueda de activos refugio en periodos de crisis global.

Diccionario de Variables:

Aquí presentamos el diccionario completo de la base de datos, incluyendo las variables originales y las variables derivadas que se crean durante el proceso de preparación:

Variable Tipo Descripción Unidad
date Fecha Fecha de observación YYYY-MM-DD
SP500 Numérica Valor de cierre del índice S&P 500 Puntos
VIX Numérica Índice de volatilidad implícita Puntos
TASA Numérica Rendimiento del Tesoro a 10 años % anual
INFLA Numérica Expectativas de inflación a 10 años % anual
Dollar Numérica Índice del valor del dólar Índice
retorno_diario Numérica Variación porcentual diaria del SP500 %
volatilidad_movil Numérica Desviación estándar de retornos (ventana 20 días)
anio Entera Año de la observación Año
periodo Factor Clasificación del periodo: Estabilidad / Crisis Categórica

Variables Derivadas

retorno_diario

Se calcula como la variación porcentual del SP500 respecto al día anterior usando lag(). Esta es la medida estándar de retorno en finanzas. Es más informativa que el nivel del índice porque nos dice cuánto ganó o perdió el mercado en un día, independientemente del nivel absoluto del índice.

volatilidad_movil

Es la desviación estándar de los últimos 20 retornos diarios. Una ventana de 20 días equivale aproximadamente a un mes de trading (días hábiles), que es el periodo convencional para medir volatilidad de corto plazo en finanzas. A mayor volatilidad móvil, mayor incertidumbre en el mercado.

periodo

Clasifica cada observación como “Estabilidad” o “Crisis” según si el VIX es menor o mayor que 20. Se eligió este umbral porque es el estándar ampliamente reconocido en la industria financiera: un VIX por debajo de 20 indica condiciones tranquilas, mientras que un VIX de 20 o más señala tensión. Valores superiores a 30 corresponden a episodios severos. Es importante destacar que aunque el VIX forma parte del dataset, se excluye como predictor en los modelos para evitar data leakage, ya que es la misma variable que define la etiqueta que los modelos intentan predecir. Este punto se desarrolla en la sección de metodología.

Descarga Base de Datos aquí:

Descargar ivestmentFinal


Visualización de Datos:

En esta sección presentamos tres gráficos diseñados para entender visualmente el comportamiento del SP500 a lo largo del tiempo y las diferencias entre periodos de Estabilidad y Crisis. Cada gráfico responde a una pregunta específica sobre los datos.

Gráfico 1 — Evolución del SP500 con periodos de crisis resaltados

plot_ly() %>%
  # Línea base completa en gris (toda la serie continua)
  add_lines(data = base_completa,
            x    = ~date,
            y    = ~SP500,
            name = "SP500",
            line = list(color = "#185FA5", width = 1),
            showlegend = FALSE) %>%
  # Puntos rojos encima para marcar los días de Crisis
  add_markers(data   = crisis,
              x      = ~date,
              y      = ~SP500,
              name   = "Crisis",
              marker = list(color = "#E24B4A",
                            size  = 3,
                            opacity = 0.6)) %>%
  layout(
    title  = "Evolución del S&P 500 (2021-2026)",
    xaxis  = list(title      = "Fecha",
                  type       = "date",
                  tickformat = "%Y"),
    yaxis  = list(title = "Valor del índice (puntos)"),
    legend = list(title = list(text = "Periodo"))
  )

Observación:

Gráfica 2:Boxplot de retornos diarios por periodo

plot_ly(base_completa,
        x     = ~periodo,
        y     = ~retorno_diario,
        color = ~periodo,
        colors = c("Estabilidad" = "#185FA5",
                   "Crisis"      = "#E24B4A")) %>%
  add_boxplot() %>%
  layout(
    title  = "Distribución del retorno diario por periodo",
    xaxis  = list(title = "Periodo"),
    yaxis  = list(title = "Retorno diario (%)"),
    legend = list(title = list(text = "Periodo"))
  )

Observación:

Gráfico 3 — Dispersión retorno diario vs volatilidad móvil

p_scatter <- ggplot(base_completa,
                    aes(x     = retorno_diario,
                        y     = volatilidad_movil,
                        color = periodo)) +
  geom_point(alpha = 0.5, size = 1.5) +
  geom_smooth(method = "lm", linetype = "dashed", se = TRUE) +
  scale_color_manual(values = c("Estabilidad" = "#185FA5",
                                "Crisis"      = "#E24B4A")) +
  labs(title = "Retorno diario vs Volatilidad móvil (20 días)",
       x     = "Retorno diario (%)",
       y     = "Volatilidad móvil (%)") +
  theme_minimal()

ggplotly(p_scatter)

Observación: