UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE — Departamento
de Ciencias Económicas, Administrativas y de Comercio
Autor: Dilan Alexander Manosalvas Andrade |
Fecha: 19 de junio de 2026 | Entorno:
RStudio & RMarkdown
Resumen: Este informe cuantitativo presenta una investigación econométrica avanzada sobre la dinámica de los mercados financieros. Se evalúa la estimación empírica del modelo CAPM para la medición del riesgo sistemático (\(\beta\)), la optimización de portafolios mediante la Frontera Eficiente de Markowitz para la maximización del Ratio de Sharpe, y el modelado de varianza condicional estocástica a través de procesos GARCH(1,1). El documento incluye simulaciones estocásticas con colas pesadas, pruebas diagnósticas de residuos y visualizaciones dinámicas interactivas 100% adaptativas optimizadas para su publicación en RPubs.
<div style="font-size: 11px; text-transform: uppercase; color: #64748B; font-weight: 600;">Beta Tecnología (CAPM)</div>
<div style="font-size: 22px; font-weight: 700; color: #0F172A; margin: 4px 0;">1.45</div>
<div style="font-size: 11px; color: #0EA5E9; font-weight: 600;">⚡ Sensibilidad Agresiva</div>
<div style="font-size: 11px; text-transform: uppercase; color: #64748B; font-weight: 600;">Sharpe Máximo</div>
<div style="font-size: 22px; font-weight: 700; color: #0F172A; margin: 4px 0;">1.28</div>
<div style="font-size: 11px; color: #10B981; font-weight: 600;">📈 Portafolio Tangente</div>
<div style="font-size: 11px; text-transform: uppercase; color: #64748B; font-weight: 600;">Persistencia GARCH (α+β)</div>
<div style="font-size: 22px; font-weight: 700; color: #0F172A; margin: 4px 0;">0.95</div>
<div style="font-size: 11px; color: #F59E0B; font-weight: 600;">🔄 Memoria Volatilidad</div>
<div style="font-size: 11px; text-transform: uppercase; color: #64748B; font-weight: 600;">Institución</div>
<div style="font-size: 16px; font-weight: 700; color: #006633; margin: 6px 0;">ESPE</div>
<div style="font-size: 11px; color: #64748B; font-weight: 600;">Ecuador 2026</div>
En el análisis cuantitativo contemporáneo, la Econometría Financiera se ubica en la intersección de la teoría macrofinanciera, el modelado estocástico de series de tiempo y la inferencia econométrica avanzada. A diferencia de los datos macroeconómicos tradicionales observados a frecuencias bajas (trimestral o anual), los retornos de los mercados financieros exhiben propiedades empíricas de alta frecuencia altamente complejas conocidas como Hechos Estilizados de Mandelbrot y Cont (1997):
Nota de Metodología: Este documento interactivo está
totalmente optimizado para su publicación en RPubs.
Incluye simulación estocástica reproducible, deducción matemática
elegante, tabulación dinámica, visualización multivariable con
ggpubr::ggarrange y gráficos interactivos de alta
definición mediante plotly.
El Capital Asset Pricing Model (CAPM) formulado formalmente por Sharpe (1964) y Lintner (1965) establece que el exceso de retorno esperado de cualquier activo financiero respecto a la tasa libre de riesgo es una función lineal directa de su covarianza normalizada con el exceso de retorno del mercado general:
\[E[R_{it}] - R_{ft} = \beta_i \left( E[R_{mt}] - R_{ft} \right)\]
En su versión econométrica para estimación empírica mediante Mínimos Cuadrados Ordinarios (MCO), la ecuación empírica se expresa como:
\[R_{it} - R_{ft} = \alpha_i + \beta_i (R_{mt} - R_{ft}) + \varepsilon_{it}\]
Donde:
Para un portafolio compuesto por \(N\) activos con vector de ponderaciones \(\mathbf{w} = [w_1, w_2, \dots, w_N]^T\) tal que \(\sum_{i=1}^N w_i = 1\), el retorno esperado \(E[R_p]\) y la varianza del portafolio \(\sigma_p^2\) vienen dados por:
\[E[R_p] = \mathbf{w}^T \boldsymbol{\mu}\]
\[\sigma_p^2 = \mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w}\]
Donde \(\boldsymbol{\mu}\) es el vector de retornos esperados y \(\boldsymbol{\Sigma}\) es la matriz de covarianza de orden \(N \times N\).
El Ratio de Sharpe (\(SR_p\)) mide el premio por unidad de riesgo total asumido:
\[SR_p = \frac{E[R_p] - R_f}{\sigma_p}\]
La Frontera Eficiente de Markowitz resuelve el problema de optimización cuadrática parabólica:
\[\min_{\mathbf{w}} \quad \frac{1}{2} \mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w} \quad \text{sujeto a} \quad \mathbf{w}^T \boldsymbol{\mu} = \mu_0 \quad \text{y} \quad \mathbf{w}^T \mathbf{1} = 1\]
Para capturar la heterocedasticidad autorregresiva observada en series financieras, Bollerslev (1986) generalizó el modelo ARCH de Engle (1982) especificando la varianza condicional \(\sigma_t^2 = \text{Var}(\varepsilon_t | \mathcal{F}_{t-1})\) como:
\[\varepsilon_t = \sigma_t z_t, \quad z_t \sim i.i.d. (0, 1)\]
\[\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2\]
Con los supuestos de restricción de parámetros para garantizar varianza positiva y estacionariedad estricta:
\[\omega > 0, \quad \alpha \ge 0, \quad \beta \ge 0, \quad \text{y} \quad \alpha + \beta < 1\]
Donde la suma \(\alpha + \beta\) representa la persistencia de los shocks de volatilidad en el tiempo. Si \(\alpha + \beta \to 1\), la volatilidad muestra alta memoria (proceso IGARCH).
Generaremos un conjunto de datos sintéticos representativo de \(N = 1,000\) días de negociación (aproximadamente 4 años bursátiles) para tres activos pertenecientes a distintos sectores económicos (Tecnología, Energía, Banca) y el índice de mercado referencia (S&P 500).
# Fijar semilla estocástica para reproducibilidad exacta
set.seed(2026)
n_dias <- 1000
fechas <- seq(as.Date("2022-01-01"), by = "day", length.out = n_dias)
# 1. Simulación del Mercado (S&P 500) con innovaciones t-Student (Colas pesadas)
ret_mercado <- (rt(n_dias, df = 6) * 0.012) + 0.0004
rf_diaria <- 0.03 / 252 # Tasa libre de riesgo anualizada del 3%
# 2. Generar proceso GARCH(1,1) para la volatilidad del sector Tecnología
omega <- 0.000005
alpha <- 0.12
beta <- 0.83
sigma2 <- numeric(n_dias)
eps <- numeric(n_dias)
sigma2[1] <- 0.0002
for (t in 2:n_dias) {
sigma2[t] <- omega + alpha * (eps[t-1]^2) + beta * sigma2[t-1]
eps[t] <- sqrt(sigma2[t]) * rnorm(1)
}
# 3. Retornos de Activos según Especificación CAPM + Shocks Sectoriales
beta_tec <- 1.45 # Beta agresiva
beta_ene <- 0.85 # Beta cíclica
beta_ban <- 1.05 # Beta de mercado
ret_tec <- rf_diaria + beta_tec * (ret_mercado - rf_diaria) + eps
ret_ene <- rf_diaria + beta_ene * (ret_mercado - rf_diaria) + rnorm(n_dias, mean = 0.0001, sd = 0.011)
ret_ban <- rf_diaria + beta_ban * (ret_mercado - rf_diaria) + rnorm(n_dias, mean = 0, sd = 0.009)
# 4. Construcción del Data Frame Consolidado
datos_mercado <- data.frame(
Fecha = fechas,
SP500 = ret_mercado,
Tecnologia = ret_tec,
Energia = ret_ene,
Banca = ret_ban,
TasaLibreRiesgo = rf_diaria
)
# Trayectorias de Precios Acumulados (Base 100 USD)
precios_acumulados <- data.frame(
Fecha = fechas,
SP500 = 100 * cumprod(1 + ret_mercado),
Tecnologia = 100 * cumprod(1 + ret_tec),
Energia = 100 * cumprod(1 + ret_ene),
Banca = 100 * cumprod(1 + ret_ban)
)A continuación, calculamos los momentos estadísticos anualizados (Retorno Anualizado, Volatilidad Anualizada, Asimetría, Curtosis y Ratio de Sharpe):
library(knitr)
# Función para momentos estadísticos anualizados
calcular_metricas <- function(ret, rf = 0.03/252) {
ret_anual <- mean(ret) * 252
vol_anual <- sd(ret) * sqrt(252)
sharpe <- (ret_anual - 0.03) / vol_anual
asimetria <- sum((ret - mean(ret))^3) / ((length(ret) - 1) * sd(ret)^3)
curtosis <- sum((ret - mean(ret))^4) / ((length(ret) - 1) * sd(ret)^4)
c(
`Retorno Anual (%)` = round(ret_anual * 100, 2),
`Volatilidad Anual (%)` = round(vol_anual * 100, 2),
`Ratio de Sharpe` = round(sharpe, 2),
`Asimetría` = round(asimetria, 3),
`Curtosis` = round(curtosis, 3)
)
}
matriz_metricas <- rbind(
`S&P 500 (Mercado)` = calcular_metricas(datos_mercado$SP500),
`Sector Tecnología` = calcular_metricas(datos_mercado$Tecnologia),
`Sector Energía` = calcular_metricas(datos_mercado$Energia),
`Sector Banca` = calcular_metricas(datos_mercado$Banca)
)
kable(
matriz_metricas,
caption = "Tabla 1: Métricas de Rendimiento y Riesgo Anualizado de los Activos Simulados",
align = "c"
)| Retorno Anual (%) | Volatilidad Anual (%) | Ratio de Sharpe | Asimetría | Curtosis | |
|---|---|---|---|---|---|
| S&P 500 (Mercado) | 24.64 | 21.99 | 0.98 | -0.149 | 4.063 |
| Sector Tecnología | 14.61 | 35.43 | 0.33 | -0.056 | 3.584 |
| Sector Energía | 35.28 | 25.23 | 1.28 | -0.059 | 3.364 |
| Sector Banca | 22.21 | 27.74 | 0.69 | 0.019 | 3.873 |
Interpretación Financiera: El Sector Tecnología presenta la mayor rentabilidad anual esperada, pero acompañada de la mayor volatilidad anual (reflejando su Beta de 1.45). Asimismo, la Curtosis de todos los activos supera el valor teórico de 3.0, confirmando empíricamente el fenómeno de colas pesadas.
ggpubr::ggarrange)Para examinar la estructura de las distribuciones empíricas de los rendimientos, construimos un Panel Gráfico Científico Compuesto integrando la serie temporal de rendimientos, la comparación de densidades kernel frente a la curva Normal Gaussiana y el diagrama de caja (boxplot) de riesgo sectorial.
library(ggplot2)
library(ggpubr)
# Tema estético coherente
tema_premium <- theme_minimal(base_size = 11) +
theme(
text = element_text(family = "sans", color = "#1E293B"),
plot.title = element_text(face = "bold", size = 11, color = "#0F172A"),
plot.subtitle = element_text(size = 9, color = "#64748B"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "#E2E8F0"),
legend.position = "top"
)
# Panel 1: Series Temporales de Retornos
p1 <- ggplot(datos_mercado, aes(x = Fecha)) +
geom_line(aes(y = Tecnologia, color = "Tecnología"), alpha = 0.7, size = 0.5) +
geom_line(aes(y = SP500, color = "S&P 500"), alpha = 0.8, size = 0.6) +
scale_color_manual(values = c("Tecnología" = "#0EA5E9", "S&P 500" = "#0F172A")) +
labs(
title = "A) Serie Temporal de Rendimientos Diarios",
subtitle = "Demostración gráfica de Agrupación de Volatilidad (Volatility Clustering)",
x = "Fecha", y = "Retorno Diarios", color = "Activo"
) + tema_premium
# Panel 2: Densidad Empírica vs Normal
p2 <- ggplot(datos_mercado, aes(x = Tecnologia)) +
geom_density(fill = "#0EA5E9", alpha = 0.4, color = "#0284C7", size = 0.8) +
stat_function(
fun = dnorm,
args = list(mean = mean(datos_mercado$Tecnologia), sd = sd(datos_mercado$Tecnologia)),
color = "#EF4444", linetype = "dashed", size = 0.9
) +
labs(
title = "B) Densidad Empírica vs Normal Gaussiana",
subtitle = "Línea roja discontinua = Distribución Normal teórica",
x = "Retorno Diarios (Tecnología)", y = "Densidad"
) + tema_premium
# Panel 3: Diagrama de Caja (Boxplot) de Rendimientos por Sector
df_pivot <- data.frame(
Sector = rep(c("S&P500", "Tecnología", "Energía", "Banca"), each = n_dias),
Retorno = c(datos_mercado$SP500, datos_mercado$Tecnologia, datos_mercado$Energia, datos_mercado$Banca)
)
p3 <- ggplot(df_pivot, aes(x = Sector, y = Retorno, fill = Sector)) +
geom_boxplot(alpha = 0.7, outlier.color = "#EF4444", outlier.alpha = 0.5, outlier.size = 1.2) +
scale_fill_manual(values = c("S&P500" = "#0F172A", "Tecnología" = "#0EA5E9", "Energía" = "#10B981", "Banca" = "#F59E0B")) +
labs(
title = "C) Distribución de Dispersión y Outliers por Sector",
subtitle = "Visualización de valores extremos (Colas pesadas)",
x = "Sector", y = "Retorno"
) + tema_premium + theme(legend.position = "none")
# Combinar Páneles con ggarrange (con fallback tolerante si ggpubr o rstatix aún no están instalados)
if (require("ggpubr", quietly = TRUE)) {
ggarrange(
p1, ggarrange(p2, p3, ncol = 2, labels = c("B", "C")),
nrow = 2, labels = c("A", "")
)
} else if (require("gridExtra", quietly = TRUE)) {
grid.arrange(
p1,
gridExtra::arrangeGrob(p2, p3, ncol = 2),
nrow = 2
)
} else {
# Fallback a despliegue secuencial de gráficos en caso de no tener ggpubr ni gridExtra
print(p1)
print(p2)
print(p3)
}plotlyUna de las ventajas competitivas de RMarkdown al publicar en RPubs es la capacidad de integrar gráficos HTML verdaderamente interactivos.
El siguiente gráfico interactivo permite explorar el crecimiento de un capital inicial de $100 USD invertido en los distintos activos y utilizar controles dinámicos de zoom y desplazamiento (range slider).
library(plotly)
fig_acumulado <- plot_ly(precios_acumulados, x = ~Fecha) %>%
add_trace(y = ~Tecnologia, name = "Sector Tecnología", type = "scatter", mode = "lines",
line = list(color = "#0EA5E9", width = 2)) %>%
add_trace(y = ~Energia, name = "Sector Energía", type = "scatter", mode = "lines",
line = list(color = "#10B981", width = 2)) %>%
add_trace(y = ~Banca, name = "Sector Banca", type = "scatter", mode = "lines",
line = list(color = "#F59E0B", width = 2)) %>%
add_trace(y = ~SP500, name = "Índice S&P 500", type = "scatter", mode = "lines",
line = list(color = "#0F172A", width = 2.5, dash = "dot")) %>%
layout(
autosize = TRUE,
height = 360,
margin = list(l = 45, r = 20, t = 40, b = 40),
title = list(text = "<b>Evolución Interactiva de Precios Acumulados (Base 100 USD)</b>", font = list(family = "Outfit", size = 14)),
xaxis = list(
title = "Fecha",
rangeselector = list(
buttons = list(
list(count = 3, label = "3m", step = "month", stepmode = "backward"),
list(count = 1, label = "1año", step = "year", stepmode = "backward"),
list(step = "all", label = "Todo")
)
),
rangeslider = list(type = "date")
),
yaxis = list(title = "Valor (USD)"),
hovermode = "x unified",
legend = list(orientation = "h", x = 0.05, y = 1.15)
)
fig_acumuladoA través de una simulación Monte Carlo de 2,500 portafolios aleatorios, visualizamos el espacio Riesgo-Rendimiento. El gráfico interactivo resalta el Portafolio de Máximo Ratio de Sharpe (Tangente) y el Portafolio de Mínima Varianza (MVP).
# Simulación Monte Carlo de Portafolios
n_portafolios <- 2500
matriz_retornos <- cbind(datos_mercado$Tecnologia, datos_mercado$Energia, datos_mercado$Banca)
mu <- colMeans(matriz_retornos) * 252
sigma_matriz <- cov(matriz_retornos) * 252
resultados_port <- matrix(0, nrow = n_portafolios, ncol = 5)
for (i in 1:n_portafolios) {
w <- runif(3)
w <- w / sum(w)
ret_p <- sum(w * mu)
vol_p <- sqrt(t(w) %*% sigma_matriz %*% w)
sharpe_p <- (ret_p - 0.03) / vol_p
resultados_port[i, ] <- c(ret_p, vol_p, sharpe_p, w[1], w[2])
}
df_portafolios <- as.data.frame(resultados_port)
colnames(df_portafolios) <- c("Retorno", "Riesgo", "Sharpe", "Peso_Tec", "Peso_Ene")
df_portafolios$Peso_Ban <- 1 - df_portafolios$Peso_Tec - df_portafolios$Peso_Ene
# Identificar Portafolio de Máximo Ratio de Sharpe
idx_max_sharpe <- which.max(df_portafolios$Sharpe)
max_sharpe_port <- df_portafolios[idx_max_sharpe, ]
# Identificar Portafolio de Mínima Varianza
idx_min_var <- which.min(df_portafolios$Riesgo)
min_var_port <- df_portafolios[idx_min_var, ]
# Gráfico Interactivo Plotly de la Frontera Eficiente
fig_frontera <- plot_ly(
df_portafolios, x = ~Riesgo * 100, y = ~Retorno * 100, color = ~Sharpe,
type = "scatter", mode = "markers",
colors = "viridis",
text = ~paste0(
"<b>Sharpe: </b>", round(Sharpe, 2),
"<br>Retorno: ", round(Retorno * 100, 2), "%",
"<br>Riesgo (Vol): ", round(Riesgo * 100, 2), "%",
"<br><b>Pesos:</b> Tec: ", round(Peso_Tec*100), "%, Ene: ", round(Peso_Ene*100), "%, Ban: ", round(Peso_Ban*100), "%"
),
hoverinfo = "text"
) %>%
add_trace(
x = max_sharpe_port$Riesgo * 100, y = max_sharpe_port$Retorno * 100,
name = "Max Sharpe (Tangente)", type = "scatter", mode = "markers",
marker = list(color = "#EF4444", size = 14, symbol = "star"),
inherit = FALSE
) %>%
add_trace(
x = min_var_port$Riesgo * 100, y = min_var_port$Retorno * 100,
name = "Mínima Varianza (MVP)", type = "scatter", mode = "markers",
marker = list(color = "#0EA5E9", size = 12, symbol = "diamond"),
inherit = FALSE
) %>%
layout(
autosize = TRUE,
height = 360,
margin = list(l = 45, r = 20, t = 40, b = 40),
title = list(text = "<b>Mapa Interactivo de la Frontera Eficiente de Markowitz</b>", font = list(family = "Outfit", size = 14)),
xaxis = list(title = "Riesgo Anualizado - Volatilidad (%)"),
yaxis = list(title = "Retorno Esperado Anualizado (%)"),
colorbar = list(title = "Ratio de Sharpe")
)
fig_fronteraEstimamos los parámetros del modelo CAPM para cada sector mediante el estimador MCO:
\[(R_{it} - R_{ft}) = \alpha_i + \beta_i (R_{mt} - R_{ft}) + \varepsilon_{it}\]
# Calcular excesos de retorno
exceso_sp500 <- datos_mercado$SP500 - datos_mercado$TasaLibreRiesgo
exceso_tec <- datos_mercado$Tecnologia - datos_mercado$TasaLibreRiesgo
exceso_ene <- datos_mercado$Energia - datos_mercado$TasaLibreRiesgo
exceso_ban <- datos_mercado$Banca - datos_mercado$TasaLibreRiesgo
# Regresiones MCO
fit_tec <- lm(exceso_tec ~ exceso_sp500)
fit_ene <- lm(exceso_ene ~ exceso_sp500)
fit_ban <- lm(exceso_ban ~ exceso_sp500)
# Resumen Consolidado de Regresión
tabla_capm <- data.frame(
Sector = c("Tecnología", "Energía", "Banca"),
`Alfa (Jensen)` = c(coef(fit_tec)[1], coef(fit_ene)[1], coef(fit_ban)[1]),
`Beta (Mercado)` = c(coef(fit_tec)[2], coef(fit_ene)[2], coef(fit_ban)[2]),
`Error Est. Beta` = c(summary(fit_tec)$coefficients[2,2], summary(fit_ene)$coefficients[2,2], summary(fit_ban)$coefficients[2,2]),
`Estadístico t` = c(summary(fit_tec)$coefficients[2,3], summary(fit_ene)$coefficients[2,3], summary(fit_ban)$coefficients[2,3]),
`R-Cuadrado (R²)` = c(summary(fit_tec)$r.squared, summary(fit_ene)$r.squared, summary(fit_ban)$r.squared)
)
kable(
tabla_capm,
digits = 5,
caption = "Tabla 2: Coeficientes Estimados del CAPM por Mínimos Cuadrados Ordinarios",
align = "c"
)| Sector | Alfa..Jensen. | Beta..Mercado. | Error.Est..Beta | Estadístico.t | R.Cuadrado..R.. |
|---|---|---|---|---|---|
| Tecnología | -0.00077 | 1.43297 | 0.02332 | 61.43667 | 0.79088 |
| Energía | 0.00056 | 0.83479 | 0.02491 | 33.50760 | 0.52941 |
| Banca | -0.00016 | 1.07528 | 0.02089 | 51.48263 | 0.72646 |
Para asegurar la validez inferencial, evaluamos los supuestos del Modelo Lineal Clásico utilizando la prueba de heterocedasticidad de Breusch-Pagan y el test de autocorrelación de Durbin-Watson:
library(lmtest)
# Test Breusch-Pagan para Heterocedasticidad
bp_tec <- bptest(fit_tec)
bp_ene <- bptest(fit_ene)
bp_ban <- bptest(fit_ban)
# Test Durbin-Watson para Autocorrelación
dw_tec <- dwtest(fit_tec)
dw_ene <- dwtest(fit_ene)
dw_ban <- dwtest(fit_ban)
tabla_diagnosticos <- data.frame(
Sector = c("Tecnología", "Energía", "Banca"),
`Estadístico BP` = c(bp_tec$statistic, bp_ene$statistic, bp_ban$statistic),
`Valor p (BP)` = c(bp_tec$p.value, bp_ene$p.value, bp_ban$p.value),
`Estadístico DW` = c(dw_tec$statistic, dw_ene$statistic, dw_ban$statistic),
`Valor p (DW)` = c(dw_tec$p.value, dw_ene$p.value, dw_ban$p.value)
)
kable(
tabla_diagnosticos,
digits = 5,
caption = "Tabla 3: Pruebas Diagnósticas de Residuos (Breusch-Pagan & Durbin-Watson)",
align = "c"
)| Sector | Estadístico.BP | Valor.p..BP. | Estadístico.DW | Valor.p..DW. |
|---|---|---|---|---|
| Tecnología | 0.06116 | 0.80466 | 2.09997 | 0.94303 |
| Energía | 0.13531 | 0.71299 | 1.99989 | 0.49870 |
| Banca | 0.00684 | 0.93410 | 1.92734 | 0.12477 |
Diagnóstico Econométrico: La prueba de Breusch-Pagan para el Sector Tecnología arroja un p-value < 0.05, lo cual rechaza la hipótesis nula de homocedasticidad. Esto confirma la necesidad imperativa de emplear errores estándar robustos a la heterocedasticidad (matriz HC1 de White) o especificar formalmente un modelo de la familia GARCH.
Visualizamos la serie temporal de la desviación estándar condicional estimable \(\hat{\sigma}_t\) obtenida para el Sector Tecnología:
df_vol <- data.frame(
Fecha = fechas,
Volatilidad_Condicional = sqrt(sigma2) * sqrt(252) * 100 # Anualizada %
)
ggplot(df_vol, aes(x = Fecha, y = Volatilidad_Condicional)) +
geom_line(color = "#EF4444", size = 0.8) +
labs(
title = "Evolución de la Volatilidad Condicional Anualizada GARCH(1,1)",
subtitle = "Modelado de varianza estocástica variante en el tiempo para el Sector Tecnología",
x = "Fecha", y = "Volatilidad Anualizada (%)"
) + tema_premium