Introduccion

Este informe presenta el analisis descriptivo de dos variables cualitativas (estado del mercado y dia de la semana) y dos variables cuantitativas (variacion diaria del oro y nivel del VIX), a partir de la base de datos construida sobre el oro (XAU/USD) y variables del mercado global entre 2010 y 2026.

Para cada variable se presenta su tabla de frecuencias y los indicadores estadisticos correspondientes segun su tipo.

datos <- read.csv("base_oro_riskoff.csv", stringsAsFactors = FALSE)
datos$fecha <- as.Date(datos$fecha)

str(datos)
## 'data.frame':    4174 obs. of  9 variables:
##  $ fecha         : Date, format: "2010-01-05" "2010-01-06" ...
##  $ px_oro        : num  1118 1136 1133 1138 1151 ...
##  $ r_oro         : num  0.000358 0.015795 -0.002468 0.004491 0.010922 ...
##  $ px_vix        : num  19.4 19.2 19.1 18.1 17.5 ...
##  $ r_sp500       : num  0.003111 0.000545 0.003993 0.002878 0.001745 ...
##  $ px_dxy        : num  77.6 77.5 77.9 77.5 77 ...
##  $ pctile_vix    : num  0.5 0.333 0.25 0.2 0.167 ...
##  $ estado_mercado: chr  "normal" "normal" "normal" "normal" ...
##  $ dow           : chr  "martes" "miércoles" "jueves" "viernes" ...

1. Variables cualitativas

1.1 Estado del mercado (estado_mercado)

Esta variable clasifica cada dia como “risk-off” (dia de estres en el mercado) o “normal”, segun el nivel del VIX.

frec_abs <- table(datos$estado_mercado)
frec_rel <- prop.table(frec_abs)
frec_pct <- round(frec_rel * 100, 2)

tabla_estado <- data.frame(
  Categoria = names(frec_abs),
  Frecuencia_absoluta = as.vector(frec_abs),
  Frecuencia_relativa = round(as.vector(frec_rel), 4),
  Porcentaje = as.vector(frec_pct)
)

knitr::kable(tabla_estado, caption = "Tabla de frecuencias: estado del mercado")
Tabla de frecuencias: estado del mercado
Categoria Frecuencia_absoluta Frecuencia_relativa Porcentaje
normal 3617 0.8666 86.66
risk-off 557 0.1334 13.34
barplot(frec_abs,
        main = "Distribucion de dias segun estado del mercado",
        ylab = "Numero de dias",
        col = "gray70")

Interpretacion: la mayoria de los dias del periodo se clasifican como “normal”, mientras que los dias de “risk-off” representan una minoria, concentrada en periodos puntuales de estres (por ejemplo, crisis financieras o caidas fuertes del mercado accionario).

1.2 Dia de la semana (dow)

dow_normalizado <- chartr("áéíóú", "aeiou", tolower(trimws(datos$dow)))
orden_dias <- c("lunes", "martes", "miercoles", "jueves", "viernes")
datos$dow <- factor(dow_normalizado, levels = orden_dias)

frec_abs_dow <- table(datos$dow)
frec_rel_dow <- prop.table(frec_abs_dow)
frec_pct_dow <- round(frec_rel_dow * 100, 2)

tabla_dow <- data.frame(
  Dia = names(frec_abs_dow),
  Frecuencia_absoluta = as.vector(frec_abs_dow),
  Frecuencia_relativa = round(as.vector(frec_rel_dow), 4),
  Porcentaje = as.vector(frec_pct_dow)
)

knitr::kable(tabla_dow, caption = "Tabla de frecuencias: dia de la semana")
Tabla de frecuencias: dia de la semana
Dia Frecuencia_absoluta Frecuencia_relativa Porcentaje
lunes 780 0.1869 18.69
martes 860 0.2060 20.60
miercoles 857 0.2053 20.53
jueves 842 0.2017 20.17
viernes 835 0.2000 20.00
barplot(frec_abs_dow,
        main = "Distribucion de dias segun dia de la semana",
        ylab = "Numero de dias",
        col = "gray70")

Interpretacion: dado que el mercado no opera los fines de semana, los cinco dias habiles (lunes a viernes) deberian tener una frecuencia similar entre si; cualquier diferencia notable puede deberse a dias festivos que caen en dias especificos.


2. Variables cuantitativas

2.1 Variacion diaria del oro (r_oro)

resumen_oro <- summary(datos$r_oro)
media <- mean(datos$r_oro, na.rm = TRUE)
mediana <- median(datos$r_oro, na.rm = TRUE)
desv_est <- sd(datos$r_oro, na.rm = TRUE)
varianza <- var(datos$r_oro, na.rm = TRUE)
rango <- diff(range(datos$r_oro, na.rm = TRUE))
cv <- (desv_est / media) * 100

tabla_indicadores_oro <- data.frame(
  Indicador = c("Media", "Mediana", "Desviacion estandar", "Varianza",
                "Minimo", "Maximo", "Rango", "Coeficiente de variacion (%)"),
  Valor = c(media, mediana, desv_est, varianza,
            min(datos$r_oro, na.rm = TRUE), max(datos$r_oro, na.rm = TRUE),
            rango, cv)
)
tabla_indicadores_oro$Valor <- round(tabla_indicadores_oro$Valor, 6)

knitr::kable(tabla_indicadores_oro, caption = "Indicadores descriptivos: variacion diaria del oro")
Indicadores descriptivos: variacion diaria del oro
Indicador Valor
Media 0.000362
Mediana 0.000455
Desviacion estandar 0.010656
Varianza 0.000114
Minimo -0.098206
Maximo 0.059054
Rango 0.157260
Coeficiente de variacion (%) 2943.372296
# Tabla de frecuencias por intervalos (variable continua)
cortes_oro <- hist(datos$r_oro, breaks = "Sturges", plot = FALSE)

tabla_frec_oro <- data.frame(
  Intervalo = paste(round(cortes_oro$breaks[-length(cortes_oro$breaks)], 4),
                     round(cortes_oro$breaks[-1], 4), sep = " a "),
  Frecuencia_absoluta = cortes_oro$counts,
  Frecuencia_relativa = round(cortes_oro$counts / sum(cortes_oro$counts), 4)
)

knitr::kable(tabla_frec_oro, caption = "Tabla de frecuencias por intervalos: variacion diaria del oro")
Tabla de frecuencias por intervalos: variacion diaria del oro
Intervalo Frecuencia_absoluta Frecuencia_relativa
-0.1 a -0.09 1 0.0002
-0.09 a -0.08 0 0.0000
-0.08 a -0.07 0 0.0000
-0.07 a -0.06 3 0.0007
-0.06 a -0.05 3 0.0007
-0.05 a -0.04 10 0.0024
-0.04 a -0.03 26 0.0062
-0.03 a -0.02 93 0.0223
-0.02 a -0.01 382 0.0915
-0.01 a 0 1451 0.3476
0 a 0.01 1633 0.3912
0.01 a 0.02 452 0.1083
0.02 a 0.03 89 0.0213
0.03 a 0.04 23 0.0055
0.04 a 0.05 5 0.0012
0.05 a 0.06 3 0.0007
hist(datos$r_oro,
     main = "Distribucion de la variacion diaria del oro",
     xlab = "Variacion diaria (proporcion)",
     ylab = "Frecuencia",
     col = "gray70")

boxplot(datos$r_oro,
        main = "Diagrama de caja: variacion diaria del oro",
        ylab = "Variacion diaria (proporcion)",
        col = "gray70")

Interpretacion: la variacion diaria del oro se concentra alrededor de cero, lo cual es esperable en un activo financiero (la mayoria de los dias el precio cambia poco). El diagrama de caja permite identificar si existen datos atipicos (dias con variaciones inusualmente grandes).

2.2 Nivel del VIX (px_vix)

media_vix <- mean(datos$px_vix, na.rm = TRUE)
mediana_vix <- median(datos$px_vix, na.rm = TRUE)
desv_est_vix <- sd(datos$px_vix, na.rm = TRUE)
varianza_vix <- var(datos$px_vix, na.rm = TRUE)
rango_vix <- diff(range(datos$px_vix, na.rm = TRUE))
cv_vix <- (desv_est_vix / media_vix) * 100

tabla_indicadores_vix <- data.frame(
  Indicador = c("Media", "Mediana", "Desviacion estandar", "Varianza",
                "Minimo", "Maximo", "Rango", "Coeficiente de variacion (%)"),
  Valor = c(media_vix, mediana_vix, desv_est_vix, varianza_vix,
            min(datos$px_vix, na.rm = TRUE), max(datos$px_vix, na.rm = TRUE),
            rango_vix, cv_vix)
)
tabla_indicadores_vix$Valor <- round(tabla_indicadores_vix$Valor, 4)

knitr::kable(tabla_indicadores_vix, caption = "Indicadores descriptivos: nivel del VIX")
Indicadores descriptivos: nivel del VIX
Indicador Valor
Media 18.4304
Mediana 16.7550
Desviacion estandar 6.7821
Varianza 45.9970
Minimo 9.1400
Maximo 82.6900
Rango 73.5500
Coeficiente de variacion (%) 36.7984
cortes_vix <- hist(datos$px_vix, breaks = "Sturges", plot = FALSE)

tabla_frec_vix <- data.frame(
  Intervalo = paste(round(cortes_vix$breaks[-length(cortes_vix$breaks)], 2),
                     round(cortes_vix$breaks[-1], 2), sep = " a "),
  Frecuencia_absoluta = cortes_vix$counts,
  Frecuencia_relativa = round(cortes_vix$counts / sum(cortes_vix$counts), 4)
)

knitr::kable(tabla_frec_vix, caption = "Tabla de frecuencias por intervalos: nivel del VIX")
Tabla de frecuencias por intervalos: nivel del VIX
Intervalo Frecuencia_absoluta Frecuencia_relativa
5 a 10 59 0.0141
10 a 15 1384 0.3316
15 a 20 1520 0.3642
20 a 25 656 0.1572
25 a 30 299 0.0716
30 a 35 154 0.0369
35 a 40 48 0.0115
40 a 45 25 0.0060
45 a 50 10 0.0024
50 a 55 5 0.0012
55 a 60 3 0.0007
60 a 65 4 0.0010
65 a 70 2 0.0005
70 a 75 1 0.0002
75 a 80 3 0.0007
80 a 85 1 0.0002
hist(datos$px_vix,
     main = "Distribucion del nivel del VIX",
     xlab = "Nivel del VIX",
     ylab = "Frecuencia",
     col = "gray70")

boxplot(datos$px_vix,
        main = "Diagrama de caja: nivel del VIX",
        ylab = "Nivel del VIX",
        col = "gray70")

Interpretacion: el VIX suele mantenerse en niveles bajos la mayor parte del tiempo (mercado tranquilo), con picos ocasionales que reflejan momentos de mayor incertidumbre o estres en los mercados globales. Esto se refleja en una distribucion con cola hacia la derecha (algunos valores altos poco frecuentes).


3. Conclusiones