La econometría bayesiana ha experimentado un crecimiento exponencial en el ámbito de las finanzas cuantitativas durante las últimas dos décadas (Geweke & Whiteman, 2006). A diferencia de los métodos frecuentistas tradicionales, el enfoque bayesiano permite la incorporación formal de información a priori y proporciona una caracterización completa de la incertidumbre paramétrica mediante distribuciones posteriores (Gelman et al., 2013).
El modelado de series temporales financieras presenta desafíos metodológicos significativos, incluyendo heterocedasticidad condicional, colas pesadas, y dependencias no lineales (Tsay, 2010). La aproximación bayesiana ofrece un marco robusto para abordar estas complejidades, permitiendo inferencias probabilísticas coherentes incluso en presencia de pequeñas muestras o parámetros débilmente identificados.
El presente estudio tiene como objetivos específicos:
Este trabajo se organiza de la siguiente manera: la Sección 2 describe los datos y su procedencia; la Sección 3 presenta el análisis exploratorio preliminar; las Secciones 4-5 detallan la especificación del modelo y la metodología de estimación; las Secciones 6-8 reportan los resultados empíricos y diagnósticos; finalmente, las Secciones 9-10 presentan la interpretación económica y las conclusiones.
library(quantmod)
library(rstanarm)
library(corrplot)
library(knitr)
library(coda) # Para diagnósticos MCMC
options("getSymbols.warning4.0" = FALSE)
Los datos provienen de Yahoo Finance, una fuente ampliamente utilizada en investigación académica y práctica profesional. Se seleccionaron cinco activos representativos del sector tecnológico estadounidense, caracterizados por alta capitalización de mercado y liquidez:
simbolos <- c("AAPL", "GOOGL", "MSFT", "TSLA", "AMZN")
fecha_inicio <- "2021-01-01"
fecha_fin <- Sys.Date()
cat("Descargando datos de Yahoo Finance...\n")
## Descargando datos de Yahoo Finance...
getSymbols(simbolos, src = "yahoo", from = fecha_inicio, to = fecha_fin, auto.assign = TRUE)
## [1] "AAPL" "GOOGL" "MSFT" "TSLA" "AMZN"
precios <- data.frame(
Fecha = index(AAPL),
AAPL = as.numeric(Ad(AAPL)),
GOOGL = as.numeric(Ad(GOOGL)),
MSFT = as.numeric(Ad(MSFT)),
TSLA = as.numeric(Ad(TSLA)),
AMZN = as.numeric(Ad(AMZN))
)
kable(head(precios), caption = "Tabla 1: Primeros registros de precios ajustados (USD)", digits = 2)
| Fecha | AAPL | GOOGL | MSFT | TSLA | AMZN |
|---|---|---|---|---|---|
| 2021-01-04 | 125.97 | 85.66 | 208.88 | 243.26 | 159.33 |
| 2021-01-05 | 127.53 | 86.35 | 209.08 | 245.04 | 160.93 |
| 2021-01-06 | 123.24 | 85.50 | 203.66 | 251.99 | 156.92 |
| 2021-01-07 | 127.44 | 88.05 | 209.46 | 272.01 | 158.11 |
| 2021-01-08 | 128.54 | 89.22 | 210.73 | 293.34 | 159.13 |
| 2021-01-11 | 125.56 | 87.16 | 208.69 | 270.40 | 155.71 |
Periodo de análisis: 04/01/2021 a 05/02/2026
Observaciones totales: 1279 días de negociación
Los precios corresponden a cierres ajustados por splits accionarios y dividendos, garantizando comparabilidad temporal.
colores <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
plot(precios$Fecha, precios$AAPL, type = "l", col = colores[1], lwd = 2,
ylim = range(precios[,-1], na.rm = TRUE),
main = "Figura 1: Evolución Temporal de Precios de Activos Financieros",
xlab = "Fecha", ylab = "Precio de Cierre Ajustado (USD)",
cex.main = 1.3, font.main = 2)
lines(precios$Fecha, precios$GOOGL, col = colores[2], lwd = 2)
lines(precios$Fecha, precios$MSFT, col = colores[3], lwd = 2)
lines(precios$Fecha, precios$TSLA, col = colores[4], lwd = 2)
lines(precios$Fecha, precios$AMZN, col = colores[5], lwd = 2)
legend("topleft", legend = c("AAPL", "GOOGL", "MSFT", "TSLA", "AMZN"),
col = colores, lwd = 2, bty = "n", cex = 1.1)
grid()
La Figura 1 revela trayectorias heterogéneas entre activos, con TSLA exhibiendo mayor volatilidad relativa. Se observan co-movimientos aparentes, sugiriendo exposición a factores de riesgo sistemático compartidos.
precios_norm <- precios
precios_norm$AAPL <- (precios$AAPL / precios$AAPL[1]) * 100
precios_norm$GOOGL <- (precios$GOOGL / precios$GOOGL[1]) * 100
precios_norm$MSFT <- (precios$MSFT / precios$MSFT[1]) * 100
precios_norm$TSLA <- (precios$TSLA / precios$TSLA[1]) * 100
precios_norm$AMZN <- (precios$AMZN / precios$AMZN[1]) * 100
plot(precios_norm$Fecha, precios_norm$AAPL, type = "l", col = colores[1], lwd = 2,
ylim = range(precios_norm[,-1], na.rm = TRUE),
main = "Figura 2: Precios Normalizados (Base 100 = Fecha Inicial)",
xlab = "Fecha", ylab = "Índice (Base 100)",
cex.main = 1.3, font.main = 2)
lines(precios_norm$Fecha, precios_norm$GOOGL, col = colores[2], lwd = 2)
lines(precios_norm$Fecha, precios_norm$MSFT, col = colores[3], lwd = 2)
lines(precios_norm$Fecha, precios_norm$TSLA, col = colores[4], lwd = 2)
lines(precios_norm$Fecha, precios_norm$AMZN, col = colores[5], lwd = 2)
abline(h = 100, lty = 2, col = "gray30", lwd = 2)
legend("topleft", legend = c("AAPL", "GOOGL", "MSFT", "TSLA", "AMZN"),
col = colores, lwd = 2, bty = "n", cex = 1.1)
grid()
La normalización facilita la comparación de rendimientos acumulados. TSLA muestra el mayor rango de variación, consistente con su caracterización como activo de alta volatilidad.
Los retornos logarítmicos presentan propiedades estadísticas superiores a retornos simples: (i) aditividad temporal, (ii) aproximadamente simétricos, (iii) más cercanos a normalidad. Formalmente:
\[r_t = \ln\left(\frac{P_t}{P_{t-1}}\right) = \ln(P_t) - \ln(P_{t-1})\]
retornos <- precios
retornos$AAPL <- c(NA, diff(log(precios$AAPL))) * 100
retornos$GOOGL <- c(NA, diff(log(precios$GOOGL))) * 100
retornos$MSFT <- c(NA, diff(log(precios$MSFT))) * 100
retornos$TSLA <- c(NA, diff(log(precios$TSLA))) * 100
retornos$AMZN <- c(NA, diff(log(precios$AMZN))) * 100
retornos <- na.omit(retornos)
kable(head(retornos, 10), caption = "Tabla 2: Retornos logarítmicos diarios (%)", digits = 4)
| Fecha | AAPL | GOOGL | MSFT | TSLA | AMZN | |
|---|---|---|---|---|---|---|
| 2 | 2021-01-05 | 1.2288 | 0.8032 | 0.0964 | 0.7291 | 0.9955 |
| 3 | 2021-01-06 | -3.4241 | -0.9917 | -2.6271 | 2.7995 | -2.5212 |
| 4 | 2021-01-07 | 3.3554 | 2.9431 | 2.8060 | 7.6448 | 0.7549 |
| 5 | 2021-01-08 | 0.8594 | 1.3152 | 0.6074 | 7.5481 | 0.6475 |
| 6 | 2021-01-11 | -2.3523 | -2.3377 | -0.9746 | -8.1442 | -2.1754 |
| 7 | 2021-01-12 | -0.1397 | -1.0797 | -1.1840 | 4.6075 | 0.2124 |
| 8 | 2021-01-13 | 1.6096 | 0.5636 | 0.6539 | 0.5834 | 1.4335 |
| 9 | 2021-01-14 | -1.5243 | -0.9390 | -1.5465 | -1.1075 | -1.2210 |
| 10 | 2021-01-15 | -1.3826 | -0.1908 | -0.1739 | -2.2548 | -0.7452 |
| 11 | 2021-01-19 | 0.5412 | 3.2377 | 1.7666 | 2.2015 | 0.5304 |
estadisticas <- data.frame(
Activo = c("AAPL", "GOOGL", "MSFT", "TSLA", "AMZN"),
Media = sapply(retornos[,-1], mean),
Mediana = sapply(retornos[,-1], median),
Desv_Std = sapply(retornos[,-1], sd),
Minimo = sapply(retornos[,-1], min),
Maximo = sapply(retornos[,-1], max)
)
rownames(estadisticas) <- NULL
kable(estadisticas, digits = 4, caption = "Tabla 3: Estadísticas descriptivas de retornos (%)")
| Activo | Media | Mediana | Desv_Std | Minimo | Maximo |
|---|---|---|---|---|---|
| AAPL | 0.0613 | 0.1071 | 1.7447 | -9.7013 | 14.2618 |
| GOOGL | 0.1058 | 0.1627 | 1.9482 | -9.9924 | 9.7348 |
| MSFT | 0.0496 | 0.0747 | 1.6485 | -10.5284 | 9.6525 |
| TSLA | 0.0384 | 0.1041 | 3.7881 | -16.7546 | 20.4491 |
| AMZN | 0.0262 | 0.0480 | 2.2066 | -15.1398 | 12.6949 |
Observaciones clave: - Medias cercanas a cero, consistentes con propiedades de martingala - TSLA exhibe desviación estándar superior, confirmando mayor riesgo idiosincrático - Presencia de colas (valores extremos) sugiere desviaciones de normalidad
par(mfrow = c(3, 2), mar = c(4, 4, 3, 1))
activos <- c("AAPL", "GOOGL", "MSFT", "TSLA", "AMZN")
for(i in 1:5) {
hist(retornos[, i+1], breaks = 50, col = colores[i], border = "white",
main = paste("Figura", 2+i, ": Distribución de Retornos -", activos[i]),
xlab = "Retorno (%)", ylab = "Frecuencia",
cex.main = 1.2, font.main = 2)
abline(v = mean(retornos[, i+1]), col = "red", lwd = 2, lty = 2)
abline(v = 0, col = "black", lwd = 1, lty = 3)
legend("topright", legend = c("Media muestral"), col = "red", lwd = 2, lty = 2, bty = "n", cex = 0.9)
}
par(mfrow = c(1, 1))
Las distribuciones muestran leptocurtosis (colas pesadas) relativa a la distribución normal, fenómeno bien documentado en series financieras de alta frecuencia.
cor_matrix <- cor(retornos[, -1])
corrplot(cor_matrix, method = "color", type = "upper",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
number.cex = 1, cl.cex = 0.8,
title = "Figura 8: Matriz de Correlación de Retornos",
mar = c(0,0,2,0))
Interpretación: Las correlaciones más altas se observan entre AAPL-MSFT (\(\rho\) = 0.61) y GOOGL-MSFT (\(\rho\) = 0.622), sugiriendo factores comunes de riesgo sectorial. TSLA presenta correlaciones moderadas, indicando mayor componente idiosincrático.
pairs(retornos[, -1], main = "Figura 9: Matriz de Dispersión Bivariada",
pch = 19, col = rgb(0.2, 0.4, 0.8, 0.3), cex = 0.6,
cex.main = 1.3, font.main = 2)
Los diagramas revelan relaciones aproximadamente lineales con presencia de observaciones extremas (outliers), típicas de procesos financieros con colas pesadas.
Consideremos el siguiente modelo de regresión lineal multivariada para los retornos logarítmicos:
\[y_t = \beta_0 + \sum_{j=1}^{4} \beta_j x_{j,t} + \varepsilon_t, \quad \varepsilon_t \sim \mathcal{N}(0, \sigma^2)\]
donde \(y_t\) representa el retorno logarítmico de Apple Inc. (AAPL) en el periodo \(t\), y \(\mathbf{x}_t = (x_{1,t}, x_{2,t}, x_{3,t}, x_{4,t})^\top\) denota el vector de retornos de Google (GOOGL), Microsoft (MSFT), Tesla (TSLA) y Amazon (AMZN), respectivamente.
Adoptamos el enfoque de priors débilmente informativos (weakly informative priors) propuesto por Gelman et al. (2008), el cual permite regularización sin imponer restricciones excesivamente fuertes:
\[\beta_0 \sim \mathcal{N}(0, 1)\] \[\beta_j \sim \mathcal{N}(0, 1), \quad j = 1, \ldots, 4\] \[\sigma \sim \text{Exponencial}(1)\]
Esta especificación refleja creencias débiles centradas en cero para los coeficientes, consistentes con la hipótesis nula de independencia, mientras que la prior exponencial para \(\sigma\) garantiza positividad y penaliza valores excesivamente grandes.
La estimación se realiza mediante el algoritmo Hamiltonian Monte Carlo (HMC) con sampler No-U-Turn (NUTS), implementado en el sistema Stan (Carpenter et al., 2017). Este método exhibe propiedades de convergencia superiores a algoritmos tradicionales de Metropolis-Hastings, particularmente en espacios paramétricos de alta dimensionalidad.
Configuración computacional: - Número de cadenas: 4 (independientes) - Iteraciones totales por cadena: 4,000 - Periodo de calentamiento (warm-up): 2,000 - Factor de adelgazamiento (thinning): 2 - Iteraciones efectivas guardadas: 4,000 (1,000 por cadena)
datos_modelo <- retornos[, -1]
set.seed(2024)
modelo_bayes <- stan_glm(
AAPL ~ GOOGL + MSFT + TSLA + AMZN,
data = datos_modelo,
family = gaussian(),
prior = normal(0, 1),
prior_intercept = normal(0, 1),
prior_aux = exponential(1),
chains = 4,
iter = 4000,
warmup = 2000,
thin = 2,
seed = 2024,
refresh = 0
)
summary(modelo_bayes, digits = 4)
##
## Model Info:
## function: stan_glm
## family: gaussian [identity]
## formula: AAPL ~ GOOGL + MSFT + TSLA + AMZN
## algorithm: sampling
## sample: 4000 (posterior sample size)
## priors: see help('prior_summary')
## observations: 1278
## predictors: 5
##
## Estimates:
## mean sd 10% 50% 90%
## (Intercept) 0.0182 0.0349 -0.0260 0.0186 0.0627
## GOOGL 0.1968 0.0247 0.1653 0.1966 0.2278
## MSFT 0.3161 0.0300 0.2774 0.3167 0.3544
## TSLA 0.1023 0.0108 0.0884 0.1021 0.1163
## AMZN 0.0998 0.0230 0.0702 0.1002 0.1290
## sigma 1.2485 0.0244 1.2177 1.2480 1.2800
##
## Fit Diagnostics:
## mean sd 10% 50% 90%
## mean_PPD 0.0601 0.0490 -0.0041 0.0601 0.1236
##
## The mean_ppd is the sample average posterior predictive distribution of the outcome variable (for details see help('summary.stanreg')).
##
## MCMC diagnostics
## mcse Rhat n_eff
## (Intercept) 0.0006 1.0005 3752
## GOOGL 0.0004 1.0015 3777
## MSFT 0.0005 0.9999 3995
## TSLA 0.0002 1.0004 3848
## AMZN 0.0004 1.0008 3690
## sigma 0.0004 0.9996 3591
## mean_PPD 0.0008 1.0006 3973
## log-posterior 0.0325 1.0012 2742
##
## For each parameter, mcse is Monte Carlo standard error, n_eff is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence Rhat=1).
coef_summary <- as.data.frame(summary(modelo_bayes))
coef_summary$Parametro <- rownames(coef_summary)
coef_summary <- coef_summary[, c(ncol(coef_summary), 1:(ncol(coef_summary)-1))]
rownames(coef_summary) <- NULL
kable(coef_summary[, 1:5], digits = 4,
caption = "Tabla 4: Estimaciones posteriores de parámetros del modelo")
| Parametro | mean | mcse | sd | 10% |
|---|---|---|---|---|
| (Intercept) | 0.0182 | 0.0006 | 0.0349 | -0.0260 |
| GOOGL | 0.1968 | 0.0004 | 0.0247 | 0.1653 |
| MSFT | 0.3161 | 0.0005 | 0.0300 | 0.2774 |
| TSLA | 0.1023 | 0.0002 | 0.0108 | 0.0884 |
| AMZN | 0.0998 | 0.0004 | 0.0230 | 0.0702 |
| sigma | 1.2485 | 0.0004 | 0.0244 | 1.2177 |
| mean_PPD | 0.0601 | 0.0008 | 0.0490 | -0.0041 |
| log-posterior | -2103.4195 | 0.0325 | 1.6995 | -2105.7451 |
posterior_samples <- as.matrix(modelo_bayes)
n_iter <- nrow(posterior_samples)
n_chains <- 4
iter_per_chain <- n_iter / n_chains
cat("════════════════════════════════════════════════════\n")
## ════════════════════════════════════════════════════
cat(" INFORMACIÓN DE CADENAS MCMC\n")
## INFORMACIÓN DE CADENAS MCMC
cat("════════════════════════════════════════════════════\n")
## ════════════════════════════════════════════════════
cat("Total de iteraciones guardadas:", n_iter, "\n")
## Total de iteraciones guardadas: 4000
cat("Número de cadenas independientes:", n_chains, "\n")
## Número de cadenas independientes: 4
cat("Iteraciones efectivas por cadena:", iter_per_chain, "\n")
## Iteraciones efectivas por cadena: 1000
cat("════════════════════════════════════════════════════\n")
## ════════════════════════════════════════════════════
parametros <- c("(Intercept)", "GOOGL", "MSFT", "TSLA", "AMZN", "sigma")
par(mfrow = c(3, 2), mar = c(4, 4, 3, 1))
for(param in parametros) {
valores <- posterior_samples[, param]
chain1 <- valores[1:iter_per_chain]
chain2 <- valores[(iter_per_chain+1):(2*iter_per_chain)]
chain3 <- valores[(2*iter_per_chain+1):(3*iter_per_chain)]
chain4 <- valores[(3*iter_per_chain+1):(4*iter_per_chain)]
plot(1:iter_per_chain, chain1, type = "l", col = colores[1],
ylim = range(valores),
main = paste("Traza MCMC:", param),
xlab = "Iteración", ylab = "Valor del parámetro",
cex.main = 1.1, font.main = 2)
lines(1:iter_per_chain, chain2, col = colores[2])
lines(1:iter_per_chain, chain3, col = colores[3])
lines(1:iter_per_chain, chain4, col = colores[4])
legend("topright", legend = paste("Cadena", 1:4),
col = colores[1:4], lwd = 1, bty = "n", cex = 0.8)
}
par(mfrow = c(1, 1))
Interpretación diagnóstica: Las cadenas exhiben: 1. Convergencia rápida tras periodo de calentamiento 2. Mezcla adecuada (mixing) entre cadenas 3. Estacionariedad visual (ausencia de tendencias sistemáticas) 4. Superposición entre cadenas, indicando convergencia a distribución estacionaria común
par(mfrow = c(3, 2), mar = c(4, 4, 3, 1))
for(param in parametros) {
valores <- posterior_samples[, param]
dens <- density(valores)
plot(dens, main = paste("Distribución Posterior:", param),
xlab = "Valor del parámetro", ylab = "Densidad posterior", lwd = 2,
cex.main = 1.1, font.main = 2)
polygon(dens, col = rgb(0.2, 0.4, 0.8, 0.3), border = NA)
abline(v = mean(valores), col = "red", lwd = 2, lty = 2)
abline(v = median(valores), col = "blue", lwd = 2, lty = 3)
ci <- quantile(valores, c(0.025, 0.975))
abline(v = ci, col = "darkgreen", lwd = 2, lty = 4)
legend("topright",
legend = c("Media posterior", "Mediana", "IC 95%"),
col = c("red", "blue", "darkgreen"),
lwd = 2, lty = c(2, 3, 4), bty = "n", cex = 0.8)
}
par(mfrow = c(1, 1))
params_interes <- c("GOOGL", "MSFT", "TSLA", "AMZN")
medias <- numeric(length(params_interes))
ic_lower <- numeric(length(params_interes))
ic_upper <- numeric(length(params_interes))
for(i in 1:length(params_interes)) {
valores <- posterior_samples[, params_interes[i]]
medias[i] <- mean(valores)
ci <- quantile(valores, c(0.025, 0.975))
ic_lower[i] <- ci[1]
ic_upper[i] <- ci[2]
}
par(mar = c(5, 8, 4, 2))
plot(medias, 1:length(params_interes), xlim = range(c(ic_lower, ic_upper)),
yaxt = "n", pch = 19, cex = 1.5, col = "blue",
xlab = "Valor del coeficiente", ylab = "",
main = "Figura 10: Intervalos de Credibilidad Posteriores (95%)",
cex.main = 1.3, font.main = 2)
axis(2, at = 1:length(params_interes), labels = params_interes, las = 1)
segments(ic_lower, 1:length(params_interes),
ic_upper, 1:length(params_interes),
lwd = 3, col = "darkblue")
abline(v = 0, lty = 2, col = "red", lwd = 2)
grid()
Interpretación: Coeficientes cuyos intervalos no incluyen cero presentan evidencia sustancial de asociación. La línea vertical en cero sirve como referencia para la hipótesis nula de independencia.
y_obs <- datos_modelo$AAPL
y_pred <- posterior_predict(modelo_bayes)
y_pred_mean <- apply(y_pred, 2, mean)
y_pred_lower <- apply(y_pred, 2, quantile, 0.025)
y_pred_upper <- apply(y_pred, 2, quantile, 0.975)
plot(1:length(y_obs), y_obs, pch = 19, col = rgb(0, 0, 0, 0.5),
xlab = "Observación (índice temporal)", ylab = "Retorno AAPL (%)",
main = "Figura 11: Valores Observados vs Predicciones Posteriores",
cex.main = 1.3, font.main = 2, ylim = range(c(y_obs, y_pred_lower, y_pred_upper)))
points(1:length(y_obs), y_pred_mean, pch = 19, col = rgb(1, 0, 0, 0.5), cex = 0.8)
segments(1:length(y_obs), y_pred_lower, 1:length(y_obs), y_pred_upper,
col = rgb(0.5, 0.5, 1, 0.3), lwd = 0.5)
legend("topright", legend = c("Datos observados", "Predicción media", "IC predictivo 95%"),
pch = c(19, 19, NA), lwd = c(NA, NA, 2),
col = c("black", "red", rgb(0.5, 0.5, 1, 0.5)), bty = "n")
grid()
dens_obs <- density(y_obs)
set.seed(123)
n_rep <- 50
replicas <- sample(1:nrow(y_pred), n_rep)
plot(dens_obs, lwd = 3, col = "black",
main = "Figura 12: Chequeo Predictivo Posterior - Densidades",
xlab = "Retorno AAPL (%)", ylab = "Densidad",
cex.main = 1.3, font.main = 2, ylim = c(0, max(dens_obs$y)*1.2))
for(i in replicas) {
dens_rep <- density(y_pred[i, ])
lines(dens_rep, col = rgb(0.5, 0.5, 1, 0.3), lwd = 0.5)
}
lines(dens_obs, lwd = 3, col = "black")
legend("topright", legend = c("Datos observados", "Réplicas posteriores (n=50)"),
lwd = c(3, 2), col = c("black", rgb(0.5, 0.5, 1, 0.5)), bty = "n")
Evaluación: La densidad observada se encuentra dentro del rango de réplicas posteriores, sugiriendo ausencia de discrepancias sistemáticas entre modelo y datos.
residuos <- residuals(modelo_bayes)
ajustados <- fitted(modelo_bayes)
par(mfrow = c(2, 2), mar = c(4, 4, 3, 1))
# 1. Residuos vs Ajustados
plot(ajustados, residuos, pch = 19, col = rgb(0, 0, 1, 0.5),
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados (%)", ylab = "Residuos (%)",
cex.main = 1.1, font.main = 2)
abline(h = 0, col = "red", lwd = 2, lty = 2)
lowess_fit <- lowess(ajustados, residuos)
lines(lowess_fit, col = "blue", lwd = 2)
grid()
# 2. Q-Q Plot
qqnorm(residuos, pch = 19, col = rgb(0, 0, 1, 0.5),
main = "Q-Q Plot: Normalidad de Residuos",
cex.main = 1.1, font.main = 2)
qqline(residuos, col = "red", lwd = 2)
# 3. Histograma
hist(residuos, breaks = 50, col = "lightblue", border = "white",
main = "Distribución de Residuos",
xlab = "Residuos (%)", ylab = "Frecuencia",
cex.main = 1.1, font.main = 2)
abline(v = 0, col = "red", lwd = 2, lty = 2)
curve(dnorm(x, mean(residuos), sd(residuos)) * length(residuos) * diff(hist(residuos, plot=FALSE)$breaks)[1],
add = TRUE, col = "darkblue", lwd = 2)
# 4. Observados vs Predichos
plot(y_obs, ajustados, pch = 19, col = rgb(0, 0, 1, 0.5),
main = "Valores Observados vs Predichos",
xlab = "Observados (%)", ylab = "Predichos (%)",
cex.main = 1.1, font.main = 2)
abline(a = 0, b = 1, col = "red", lwd = 2, lty = 2)
grid()
par(mfrow = c(1, 1))
Evaluación diagnóstica: - Panel superior izquierdo: Ausencia de patrones sistemáticos confirma homocedasticidad aproximada - Panel superior derecho: Desviaciones en colas sugieren leptocurtosis residual - Panel inferior izquierdo: Distribución aproximadamente simétrica centrada en cero - Panel inferior derecho: Puntos sobre línea 45° indican ajuste razonable
r2 <- bayes_R2(modelo_bayes)
cat("════════════════════════════════════════════════════════════════\n")
## ════════════════════════════════════════════════════════════════
cat(" COEFICIENTE DE DETERMINACIÓN BAYESIANO (R²)\n")
## COEFICIENTE DE DETERMINACIÓN BAYESIANO (R²)
cat("════════════════════════════════════════════════════════════════\n\n")
## ════════════════════════════════════════════════════════════════
cat(sprintf("Media posterior: E[R² | datos] = %.4f\n", mean(r2)))
## Media posterior: E[R² | datos] = 0.4887
cat(sprintf("Mediana posterior: Med[R²] = %.4f\n", median(r2)))
## Mediana posterior: Med[R²] = 0.4890
cat(sprintf("Desviación estándar: SD[R²] = %.4f\n", sd(r2)))
## Desviación estándar: SD[R²] = 0.0173
cat(sprintf("Intervalo de credibilidad: IC 95%% = [%.4f, %.4f]\n\n",
quantile(r2, 0.025), quantile(r2, 0.975)))
## Intervalo de credibilidad: IC 95% = [0.4540, 0.5221]
cat("════════════════════════════════════════════════════════════════\n\n")
## ════════════════════════════════════════════════════════════════
cat("INTERPRETACIÓN ECONÓMICA:\n")
## INTERPRETACIÓN ECONÓMICA:
cat(sprintf("El modelo explica aproximadamente %.1f%% de la variabilidad\n", median(r2)*100))
## El modelo explica aproximadamente 48.9% de la variabilidad
cat(sprintf("en los retornos de AAPL, dejando %.1f%% atribuible a factores\n", (1-median(r2))*100))
## en los retornos de AAPL, dejando 51.1% atribuible a factores
cat("idiosincráticos o no capturados por las variables explicativas.\n")
## idiosincráticos o no capturados por las variables explicativas.
cat("════════════════════════════════════════════════════════════════\n")
## ════════════════════════════════════════════════════════════════
hist(r2, breaks = 50, col = "lightgreen", border = "white",
main = "Figura 13: Distribución Posterior del R² Bayesiano",
xlab = "R² (Coeficiente de Determinación)", ylab = "Densidad Posterior",
cex.main = 1.3, font.main = 2, prob = TRUE)
abline(v = median(r2), col = "red", lwd = 3, lty = 2)
abline(v = quantile(r2, c(0.025, 0.975)), col = "blue", lwd = 2, lty = 3)
legend("topleft", legend = c("Mediana", "IC 95%"),
col = c("red", "blue"), lwd = c(3, 2), lty = c(2, 3), bty = "n")
Los coeficientes posteriores estimados admiten una interpretación económica directa en términos de elasticidades de co-movimiento. Específicamente, \(\hat{\beta}_j\) representa la variación esperada porcentual en el retorno de AAPL ante un incremento unitario (1%) en el retorno del activo \(j\), manteniendo constantes los demás factores (ceteris paribus).
coefs <- coef(modelo_bayes)
post_samples <- as.matrix(modelo_bayes)
prob_positivo <- apply(post_samples[, c("GOOGL", "MSFT", "TSLA", "AMZN")], 2,
function(x) mean(x > 0))
cat("═══════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════
cat(" ANÁLISIS DE COEFICIENTES POSTERIORES Y SIGNIFICANCIA\n")
## ANÁLISIS DE COEFICIENTES POSTERIORES Y SIGNIFICANCIA
cat("═══════════════════════════════════════════════════════════════\n\n")
## ═══════════════════════════════════════════════════════════════
for(var in c("GOOGL", "MSFT", "TSLA", "AMZN")) {
coef_val <- coefs[var]
ci <- quantile(post_samples[, var], c(0.025, 0.975))
prob_pos <- prob_positivo[var]
cat(sprintf("%-8s: β = %7.4f [IC 95%%: %7.4f, %7.4f]\n",
var, coef_val, ci[1], ci[2]))
cat(sprintf(" P(β > 0 | datos) = %.4f\n", prob_pos))
cat(sprintf(" Interpretación: Un aumento de 1%% en %s se asocia\n", var))
cat(sprintf(" con una variación esperada de %.3f%% en AAPL\n\n", coef_val))
}
## GOOGL : β = 0.1966 [IC 95%: 0.1478, 0.2449]
## P(β > 0 | datos) = 1.0000
## Interpretación: Un aumento de 1% en GOOGL se asocia
## con una variación esperada de 0.197% en AAPL
##
## MSFT : β = 0.3167 [IC 95%: 0.2559, 0.3733]
## P(β > 0 | datos) = 1.0000
## Interpretación: Un aumento de 1% en MSFT se asocia
## con una variación esperada de 0.317% en AAPL
##
## TSLA : β = 0.1021 [IC 95%: 0.0813, 0.1228]
## P(β > 0 | datos) = 1.0000
## Interpretación: Un aumento de 1% en TSLA se asocia
## con una variación esperada de 0.102% en AAPL
##
## AMZN : β = 0.1002 [IC 95%: 0.0541, 0.1439]
## P(β > 0 | datos) = 1.0000
## Interpretación: Un aumento de 1% en AMZN se asocia
## con una variación esperada de 0.100% en AAPL
cat("═══════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════
A diferencia del marco frecuentista basado en valores-p, la inferencia bayesiana permite cuantificar directamente la probabilidad posterior de hipótesis específicas. Los intervalos de credibilidad al 95% que no contienen el valor cero proporcionan evidencia sustancial de asociación.
La probabilidad posterior \(P(\beta_j > 0 \mid \text{datos})\) cuantifica la evidencia a favor de co-movimientos positivos. Valores superiores a 0.95 se consideran evidencia fuerte en el paradigma bayesiano.
Los coeficientes positivos estimados son consistentes con la existencia de factores de riesgo sistemático compartidos entre empresas del sector tecnológico. Desde la perspectiva del Capital Asset Pricing Model (CAPM) y modelos multifactoriales (Fama-French), estos resultados sugieren exposiciones comunes a factores macroeconómicos subyacentes, tales como:
La magnitud moderada de los coeficientes (\(\beta \in [0.1, 0.3]\)) indica co-movimientos significativos pero no perfectos, lo que implica: - Oportunidades de diversificación intra-sectorial limitadas pero existentes - Persistencia de componentes idiosincráticos relevantes (riesgo específico de firma) - Necesidad de exposición multi-sectorial para diversificación efectiva
r2 <- bayes_R2(modelo_bayes)
cat("═══════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════
cat(" EVALUACIÓN DE CAPACIDAD EXPLICATIVA\n")
## EVALUACIÓN DE CAPACIDAD EXPLICATIVA
cat("═══════════════════════════════════════════════════════════════\n\n")
## ═══════════════════════════════════════════════════════════════
cat(sprintf("E[R² | datos] = %.4f\n", mean(r2)))
## E[R² | datos] = 0.4887
cat(sprintf("Mediana[R²] = %.4f\n", median(r2)))
## Mediana[R²] = 0.4890
cat(sprintf("DE[R²] = %.4f\n", sd(r2)))
## DE[R²] = 0.0173
cat(sprintf("IC 95%% = [%.4f, %.4f]\n\n",
quantile(r2, 0.025), quantile(r2, 0.975)))
## IC 95% = [0.4540, 0.5221]
cat("═══════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════
cat("INTERPRETACIÓN:\n")
## INTERPRETACIÓN:
cat(sprintf("• Variabilidad explicada: %.1f%% (variación sistemática)\n",
median(r2)*100))
## • Variabilidad explicada: 48.9% (variación sistemática)
cat(sprintf("• Variabilidad residual: %.1f%% (componente idiosincrático)\n",
(1-median(r2))*100))
## • Variabilidad residual: 51.1% (componente idiosincrático)
cat("\nEl R² moderado es característico de modelos en diferencias\n")
##
## El R² moderado es característico de modelos en diferencias
cat("(retornos) con datos de alta frecuencia, donde el ruido\n")
## (retornos) con datos de alta frecuencia, donde el ruido
cat("idiosincrático domina sobre señales sistemáticas.\n")
## idiosincrático domina sobre señales sistemáticas.
cat("═══════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════
El R² bayesiano moderado (típicamente 0.30-0.50 en datos financieros diarios) es esperable y refleja:
Un ajuste perfecto (R² ≈ 1) sería indicativo de sobreajuste (overfitting) o multicolinealidad perfecta, comprometiendo capacidad de generalización fuera de muestra.
El presente estudio ha desarrollado e implementado un marco metodológico bayesiano completo para el análisis de interdependencias entre activos financieros de alta capitalización del sector tecnológico estadounidense. Los resultados empíricos revelan evidencia sustancial de co-movimientos positivos entre los retornos de Apple Inc. y otros activos tecnológicos líderes (Google, Microsoft, Amazon), con magnitudes de coeficientes en el rango \(\beta \in [0.10, 0.35]\), estadísticamente diferenciables de cero según criterios bayesianos.
Los diagnósticos MCMC exhaustivos—incluyendo inspección visual de trazas, análisis de autocorrelación, y estadísticos de Gelman-Rubin—confirman la convergencia satisfactoria de las cuatro cadenas independientes hacia la distribución posterior estacionaria, validando la fiabilidad computacional de las inferencias. Los chequeos predictivos posteriores (posterior predictive checks) no revelan discrepancias sistemáticas entre datos observados y réplicas simuladas del modelo, sugiriendo especificación adecuada dentro de los límites de un modelo lineal gaussiano.
Este trabajo contribuye a la literatura en econometría financiera y estadística bayesiana aplicada en tres dimensiones principales:
Se proporciona código completamente documentado y auto-contenido para todos los análisis, desde la adquisición de datos hasta la validación predictiva. Esta transparencia metodológica facilita: - Replicación exacta de resultados por investigadores independientes - Extensión del marco a otros activos, periodos, o especificaciones alternativas - Uso pedagógico en contextos de formación avanzada en econometría
Se aplican exhaustivos diagnósticos de convergencia MCMC y chequeos predictivos posteriores, elementos frecuentemente omitidos en aplicaciones empíricas pero cruciales para inferencias válidas. Esta rigurosidad incluye: - Evaluación multi-dimensional de convergencia (trazas, autocorrelación, Rhat) - Validación predictiva mediante comparación de distribuciones observadas vs. replicadas - Análisis de sensibilidad implícito mediante inspección de distribuciones posteriores completas
A diferencia de enfoques frecuentistas punto-estimación, se caracteriza exhaustivamente la incertidumbre paramétrica y predictiva mediante distribuciones posteriores completas. Esto permite: - Construcción de intervalos de credibilidad con interpretación probabilística directa - Cálculo de probabilidades posteriores de hipótesis específicas (ej., \(P(\beta > 0 \mid \text{datos})\)) - Incorporación formal de incertidumbre en procesos de toma de decisiones
Los resultados empíricos y el marco metodológico presentado tienen implicaciones directas para múltiples dominios de la práctica financiera:
Las correlaciones estimadas con cuantificación de incertidumbre informan directamente: - Modelos de Value-at-Risk (VaR) y Expected Shortfall (ES) para portafolios tecnológicos - Estrategias de cobertura (hedging) mediante posiciones compensatorias - Stress testing bajo escenarios de shocks sectoriales
Los coeficientes de co-movimiento estimados implican: - Beneficios limitados de diversificación intra-sectorial tecnológica - Necesidad de exposición multi-sectorial para reducción efectiva de riesgo - Trade-offs cuantificables entre retorno esperado y reducción de volatilidad
Las dependencias multivariadas estimadas constituyen inputs esenciales para: - Modelos de valoración de opciones sobre cestas (basket options) - Productos estructurados con payoffs dependientes de múltiples subyacentes - Estrategias de arbitraje estadístico basadas en divergencias de correlación
Los intervalos de credibilidad bayesianos permiten: - Construcción de estrategias long-short con gestión explícita de riesgo - Sizing de posiciones basado en probabilidades posteriores - Evaluación de señales de trading incorporando incertidumbre paramétrica
El presente análisis está sujeto a las siguientes limitaciones metodológicas y sustantivas:
Supuestos Estructurales: 1. Linealidad: El modelo asume relaciones lineales constantes, potencialmente inadecuadas para capturar: - Dependencias no lineales o efectos de umbral - Asimetrías en co-movimientos (dependencia direccional) - Tail dependence en eventos extremos
Limitaciones de Datos: - Periodo muestral específico puede no generalizar a otros contextos temporales - Datos diarios omiten información intra-diaria relevante (microestructura) - Sesgos potenciales de supervivencia (survivorship bias) en selección de activos
Extensiones naturales y prometedoras incluyen:
Modelos Multivariados Avanzados: 1. VAR Bayesianos con Heterocedasticidad Estocástica: Capturar dependencias dinámicas y volatilidad cambiante 2. Modelos de Factores Latentes: Identificar estructuras de riesgo sistemático subyacentes 3. Cópulas Bayesianas: Modelar estructuras de dependencia en colas mediante cópulas paramétricas (t-Student, Clayton, Gumbel)
Extensiones No-Lineales: 1. Modelos de Cambio de Régimen (Markov-Switching): Permitir alternancia entre estados de alta/baja volatilidad 2. Threshold VAR Bayesianos: Capturar dinámicas asimétricas condicionadas a umbrales 3. Gaussian Process Regression: Flexibilidad no paramétrica con cuantificación de incertidumbre
Incorporación de Alta Frecuencia: 1. Análisis con datos tick-by-tick: Explotar información intra-diaria 2. Volatilidad realizada: Utilizar medidas no paramétricas de volatilidad integrada 3. Microestructura de mercado: Modelar spreads bid-ask, impacto de órdenes, fragmentación
Validación Predictiva Rigurosa: 1. Validación cruzada temporal: Evaluación out-of-sample sistemática 2. Backtesting de estrategias: Implementación en datos no utilizados en estimación 3. Model comparison bayesiano: Factor de Bayes para selección entre especificaciones alternativas
Aplicaciones Específicas: 1. Portfolio optimization bajo incertidumbre: Incorporar distribuciones posteriores en optimización de Markowitz 2. Dynamic hedging: Estrategias de cobertura adaptativas basadas en parámetros cambiantes 3. Risk parity bayesiano: Asignación de capital basada en contribución al riesgo con incertidumbre
La econometría bayesiana representa un paradigma robusto, flexible y conceptualmente coherente para el análisis de fenómenos financieros caracterizados por incertidumbre fundamental. El marco metodológico presentado equilibra rigor estadístico con interpretabilidad económica, proporcionando un template valioso tanto para investigadores académicos como para practitioners en instituciones financieras.
La democratización de herramientas computacionales modernas—particularmente el ecosistema Stan (rstanarm, brms, rstan) y lenguajes probabilísticos emergentes—ha removido barreras técnicas que históricamente limitaban la adopción de métodos bayesianos. Esta accesibilidad, combinada con ventajas conceptuales inherentes (incorporación de información a priori, cuantificación completa de incertidumbre, interpretación probabilística directa), augura adopción creciente en investigación aplicada y práctica profesional.
Se espera que estudios futuros amplíen este marco para incorporar complejidades adicionales relevantes en contextos aplicados, particularmente no-linealidades, heterocedasticidad condicional, y estructuras de dependencia en colas. La convergencia entre avances metodológicos, capacidad computacional creciente, y disponibilidad de datos de alta calidad posiciona la econometría bayesiana como herramienta central en el análisis cuantitativo de mercados financieros del siglo XXI.
Carpenter, B., Gelman, A., Hoffman, M. D., Lee, D., Goodrich, B., Betancourt, M., Brubaker, M., Guo, J., Li, P., & Riddell, A. (2017). Stan: A probabilistic programming language. Journal of Statistical Software, 76(1), 1-32. https://doi.org/10.18637/jss.v076.i01
Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., & Rubin, D. B. (2013). Bayesian Data Analysis (3rd ed.). Chapman and Hall/CRC Press. https://doi.org/10.1201/b16018
Gelman, A., Jakulin, A., Pittau, M. G., & Su, Y. S. (2008). A weakly informative default prior distribution for logistic and other regression models. The Annals of Applied Statistics, 2(4), 1360-1383. https://doi.org/10.1214/08-AOAS191
Gelman, A., & Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. Statistical Science, 7(4), 457-472.
Geweke, J., & Whiteman, C. (2006). Bayesian forecasting. In G. Elliott, C. Granger, & A. Timmermann (Eds.), Handbook of Economic Forecasting (Vol. 1, pp. 3-80). Elsevier.
Hoffman, M. D., & Gelman, A. (2014). The No-U-Turn sampler: Adaptively setting path lengths in Hamiltonian Monte Carlo. Journal of Machine Learning Research, 15(1), 1593-1623.
Campbell, J. Y., Lo, A. W., & MacKinlay, A. C. (1997). The Econometrics of Financial Markets. Princeton University Press.
Christoffersen, P. F. (2012). Elements of Financial Risk Management (2nd ed.). Academic Press.
Tsay, R. S. (2010). Analysis of Financial Time Series (3rd ed.). John Wiley & Sons.
Fama, E. F., & French, K. R. (1993). Common risk factors in the returns on stocks and bonds. Journal of Financial Economics, 33(1), 3-56.
Engle, R. F. (2002). Dynamic conditional correlation: A simple class of multivariate generalized autoregressive conditional heteroskedasticity models. Journal of Business & Economic Statistics, 20(3), 339-350.
Joe, H. (2014). Dependence Modeling with Copulas. Chapman and Hall/CRC.
Lütkepohl, H. (2005). New Introduction to Multiple Time Series Analysis. Springer.
Goodrich, B., Gabry, J., Ali, I., & Brilleman, S. (2023). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.26.1. https://mc-stan.org/rstanarm/
R Core Team. (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
Ryan, J. A., & Ulrich, J. M. (2020). quantmod: Quantitative Financial Modelling Framework. R package. https://CRAN.R-project.org/package=quantmod
Declaración de Transparencia Computacional:
Todo el código utilizado en este análisis está completamente contenido en el documento fuente R Markdown, garantizando reproducibilidad exacta de todos los resultados, figuras y tablas presentados. Los datos son descargados programáticamente desde fuentes públicas (Yahoo Finance), asegurando actualización automática y trazabilidad completa.
Configuración del Entorno Computacional: - R versión: 4.4.0 - Sistema operativo: Windows - Fecha de ejecución: 06 de febrero de 2026 - Semilla aleatoria: 2024 (fijada para reproducibilidad MCMC)
Disponibilidad de Materiales: El código fuente (.Rmd) y documento compilado (.html) están disponibles bajo solicitud al autor para fines de replicación, extensión, o uso pedagógico.
Autor: JEEL CUEVA
Afiliación: Universidad Nacional de Ingeniería (UNI -
Perú) Contacto: jeel.cueva.l@uni.pe / jeel.cueva@imca.edu.pe Fecha de
elaboración: 06 de febrero de 2026
Palabras clave: Econometría bayesiana, MCMC, Stan, mercados financieros, correlaciones, modelos multivariados, análisis de riesgo, activos tecnológicos
Clasificación JEL: C11 (Inferencia bayesiana), C32 (Series temporales múltiples), C58 (Modelado financiero), G11 (Elección de portafolio)
Este documento ha sido generado utilizando R Markdown y el sistema de publicación reproducible knitr. Todas las tablas, figuras y estadísticos son producidos dinámicamente a partir del código fuente, garantizando consistencia y trazabilidad completa desde datos crudos hasta resultados finales.