• Ctrl+Shift+c= Para comentar • Ctrl+Shift+m =Función pipe %>% ó |> —“Concatenar funciones” • Atl+(-) = asigno <-
1.1 ¿Qué es Quarto?
Plataforma de publicación científica
Compatible con R, Python, Julia, ObservableJS
Produce HTML, PDF, Word, presentaciones
Basado en Markdown + chunks de código
1.2 Librerias a utilizar
1.3 ¿Qué es el YAML?
El encabezado en formato YAML (YAML Ain’t Markup Language) aparece al principio del documento de Quarto. Aunque es optativo, bajo ciertas circunstancias se genera automáticamente durante el proceso de renderizado que genera el archivo de salida. Tanto el inicio como la finalización del encabezado YAML están definidos por tres guiones aislados en una línea. La información contenida dentro de esas dos líneas constituye el encabezado YAML. Allí suelen incluirse metadatos (tales como título, autor y fecha) y opciones generales que determinan la edición y las salidas (tales como el modo de edición predeterminado, el formato de salida y el tamaño de las imágenes).
Este YAML configura qué mostrar (título, autor, subtítulo, fecha), cómo mostrarlo (HTML, PDF, Word con tablas de contenido, secciones numeradas, tablas bonitas) y permite incluir bibliografía y parámetros dinámicos.
1.4 Información general del documento
title:"Análisis del Precio del Oro"
→ El título principal del documento.
subtitle:"Dirección de Comercialización de Oro – BCE"
→ Subtítulo que aparece debajo del título.
author:"Econ. William Ramos"
→ Autor o responsable del documento.
date:"2025-09-12"
→ Inserta la fecha del sistema de manera automática cuando se renderiza.
(Ejemplo: si hoy es 12/09/2025, el reporte saldrá con esa fecha).
1.5 Formatos de salida
Aquí defines a qué formatos se exportará el documento (HTML, Word, PDF) y con qué configuraciones.
HTML
toc: true → agrega tabla de contenidos.
toc-depth: 3 → muestra hasta nivel 3 de títulos (###).
code-fold: true → permite plegar/desplegar bloques de código.
number-sections: true → numera los títulos y secciones.
docx
Genera un archivo en Word con configuración por defecto.
PDF
toc: true → tabla de contenidos.
number-sections: true → numeración de secciones.
df-print: kable → imprime tablas en formato kable (más presentable en PDF).
Bibliografía
Apunta a un archivo BibTeX (.bib) con tus referencias.
Permite citar dentro del documento con @Referencia.
Idioma
Establece el idioma principal (afecta a etiquetas automáticas como “Tabla”, “Figura”, etc.).
Parámetros (params)
Sirven para pasar valores dinámicos al documento.
Aquí defines fecha_corte como "2024-12-31".
Luego lo puedes llamar en el texto con:
1.6 Chunk setup
1.7 Práctica de Quarto
Análisis del oro
El oro ha desempeñado históricamente un papel central en la economía mundial, tanto como medio de intercambio en los sistemas monetarios clásicos (patrón oro), como en su función contemporánea de activo refugio. A diferencia de otros metales, el oro no solo posee valor industrial o ornamental, sino que se ha consolidado como un instrumento financiero clave para preservar valor frente a la inflación, la volatilidad cambiaria y la incertidumbre económica.
En la actualidad, el análisis del precio del oro se realiza desde múltiples perspectivas:
Económica y macrofinanciera:
Factores como la fortaleza del dólar estadounidense, las tasas de interés reales, la inflación y la política monetaria de la Reserva Federal influyen directamente en la cotización del oro. Una depreciación del dólar o tasas de interés bajas suelen impulsar la demanda del metal.
De mercado y de portafolio:
Para los inversionistas, el oro actúa como un activo diversificador, ya que tiende a mostrar correlaciones negativas o débiles con otros activos de riesgo, como acciones y bonos. Esto lo convierte en una herramienta de cobertura (hedging) frente a escenarios adversos.
Análisis técnico y de series temporales:
Se utilizan métodos econométricos (ARIMA, GARCH, VAR) y modelos más recientes de machine learning (LSTM, random forests) para identificar patrones, volatilidad y posibles escenarios futuros del precio del oro.
Perspectiva estructural y geopolítica:
La oferta mundial de oro está determinada por la producción minera y el reciclaje, mientras que la demanda proviene de la joyería, la industria tecnológica, la inversión financiera y las compras de bancos centrales. A esto se suman factores de riesgo geopolítico y crisis internacionales, que suelen incrementar la demanda del metal como refugio Ghule et al. (2022).
d %>%ggplot(aes(date,GOLD))+geom_line(linewidth=0.8)+labs(x=NULL, y="USD/oz", title ="Evolución mensual del precio del oro (USD)",subtitle="2006-presente",caption="Fuente: Yahoo Finance")+theme_minimal()+theme(plot.title =element_text(hjust =0.5, size =14, face ="bold"),plot.subtitle =element_text(hjust =0.5, size =12, face ="italic"),plot.caption =element_text(hjust =0.5, size =9) )
Tabla
Código
d |>select(date,GOLD) %>%tail(12) %>%gt() %>%cols_label(date="Fecha",GOLD="Precio Oro (USD)/oz" ) %>%tab_header(title ="Oro: últimos 12 meses") %>%fmt_usd(columns = GOLD) %>%tab_source_note(source_note ="Fuente:FED" )
Oro: últimos 12 meses
Fecha
Precio Oro (USD)/oz
2023-08-01
$1.918,52
2023-09-01
$1.913,71
2023-11-01
$1.985,07
2023-12-01
$2.033,55
2024-02-01
$2.026,54
2024-03-01
$2.158,30
2024-04-01
$2.328,41
2024-05-01
$2.347,47
2024-07-01
$2.390,48
2024-08-01
$2.465,85
2024-10-01
$2.688,00
2024-11-01
$2.654,04
Fuente:FED
2Unidad 2. Introducción a Machine Learning: Regresión Lineal
2.1 Machine Learning
Métodos que permiten que los sistemas aprendan patrones de datos
Diferencias con econometría tradicional:
ML enfatiza predicción, no solo inferencia causal
Maneja relaciones no lineales y alta dimensión
Aplicaciones en finanzas: precios, riesgo, trading.
Jordan & Mitchell (2015), Science
¿En donde podemos aplicar Machine Learning (ML)?
El oro depende de múltiples variables: dólar, petróleo, tasas de interés, inflación
ML captura relaciones no lineales y complejas
2.2 ¿Qué es modelar?
Conceptos claves
Unidad de análisis
Set de entrenamiento (Utilizados para modelar)
Atributos
Variable dependiente, de respuesta o target (Valor predicho)
Motores: lm, glmnet, xgboost Ejemplo: mod <- linear_reg() |> set_engine(‘lm’)
2.11Yardstick (Métricas de Ajuste)
Evaluación de modelos.
Métricas principales: RMSE – Error cuadrático medio MAE – Error absoluto medio R² – Varianza explicada
Comparación de modelos con métricas comunes.
2.12 Comentarios Finales
ML complementa la econometría
Útil cuando hay muchas variables
Relación no lineal o compleja
Usos BCE: predicción de oro, inflación, riesgo financiero
3Unidad 3. Creación de un flujo de trabajo de Machine Learning (ML)
3.1 Introducción a la regresión lineal en R-lm
La regresión lineal es un modelo estadístico y de machine learning supervisado que se utiliza para explicar y predecir una variable dependiente (también llamada variable respuesta o Y) a partir de una o varias variables independientes (también llamadas regresores, predictores o X).
La idea central es ajustar una línea recta (o hiperplano en dimensiones mayores) que relacione los valores de X con los de Y, minimizando la diferencia entre los valores observados y los predichos.
Forma matemática
Para una regresión lineal simple (con una sola variable (X)):
\(Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i\)
\(Y_i\): Variable dependiente (lo que queremos explicar).
\(X_i\): Variable independiente (el predictor).
\(\beta_0\): Intercepto (valor de \(Y\) cuando \(X=0\)).
\(\beta_1\): Pendiente (cambio promedio en \(Y\) por cada unidad adicional de \(X\)).
\(\varepsilon_i\): término de error (factores no observados).
En la regresión múltiple (con varios predictores):
Se utiliza el método de Mínimos Cuadrados Ordinarios (MCO / OLS, por sus siglas en inglés), que busca los valores de los coeficiente que minimizan la suma de los errores al cuadrado:
\(\beta_0\): Ingreso esperado si la educación = \(0\)
\(\beta_1\): Cuanto aumenta (en promedio) el ingreso por cada año adicional de educación.
En Resumen
Un modelo estadístico y predictivo.
Busca una relación lineal entre variables
Se estima normalmente con mínimos cuadrados.
Es una de las herramientas más usadas en estadística, econometría y machine learning.
¡Vamos a la practica!
Observamos la gráfica del oro
Código
plot(d$date, d$GOLD, type ="l", # "l" = linecol ="blue", lwd =2, # grosor de la líneaxlab ="Fecha", ylab ="Valor Oro en niveles", main ="Evolución del oro en niveles")
Observamos la gráfica del dólar
Código
plot(d$date, d$DOLLAR, type ="l", # "l" = linecol ="blue", lwd =2, # grosor de la líneaxlab ="Fecha", ylab ="Dolar en niveles", main ="Evolución del dólar en niveles")
Retornos en gráficos: Oro
Código
plot(d$date, d$gold_ret, type ="l", # "l" = linecol ="blue", lwd =2, # grosor de la líneaxlab ="Fecha", ylab ="Retorno del oro", main ="Evolución del retorno del oro")
Retornos en gráficos: Dolar
Código
plot(d$date, d$dollar_ret, type ="l", # "l" = linecol ="blue", lwd =2, # grosor de la líneaxlab ="Fecha", ylab ="Retorno del dólar", main ="Evolución del retorno del dólar")
Código
s1 <- d |>select(date, gold_ret, dollar_ret) |>drop_na()print(s1)
Cuando el retorno del dólar es cero, el retorno promedio del oro es aproximadamente \(0.66\%\).
Es significativo al \(5\%\) (\(p < 0.05\)).
Pediente: \((-1.0913,\; p < 0.001)\)
Por cada incremento de \(1\) unidad en el retorno del dólar, el retorno del oro disminuye en promedio \(1.09\) unidades.
Es altamente significativo (\(p \approx 0.000000425\)).
El signo negativo confirma la teoría: la apreciación del dólar tiende a reducir el precio del oro.
Coeficientes
Intercepto\((0.006652,\; p=0.019)\)
Cuando el retorno del dólar es cero:
\[
\hat{Y} = 0.006652
\]
El retorno promedio del oro es ≈ \(0.66\%\).
Es significativo al \(5\%\) (\(p < 0.05\)).
Pendiente\((-1.0913,\; p < 0.001)\)
Por cada incremento de \(1\) unidad en el retorno del dólar:
El retorno del oro disminuye en promedio \(1.09\) unidades.
Es altamente significativo (\(p \approx 0.000000425\)).
El signo negativo confirma la teoría: la apreciación del dólar tiende a reducir el precio del oro.
🔹 Bondad de ajuste
\[
R^2 = 0.1612 \quad (16.1\%)
\]
El modelo explica solo un \(16\%\) de la variación en el retorno del oro.
Esto es común en series financieras: el oro depende de múltiples factores, no solo del dólar.
\[
R^2_{ajustado} = 0.155
\]
Confirma que la complejidad no añade mucha pérdida.
Error estándar residual:
\[
\sigma_{\hat{\varepsilon}} = 0.03408
\]
En promedio, los residuos (errores) son de \(3.4\) puntos porcentuales.
🔹 Pruebas de significancia global
\[
F = 28.06, \quad p < 0.001
\]
El modelo en su conjunto es estadísticamente significativo.
Al menos un coeficiente (aquí \(\beta_1\)) difiere de cero.
🔹 Resumen interpretativo
Dirección: relación negativa clara entre dólar y oro.
Magnitud: movimientos del dólar tienen un efecto importante en el oro.
Significancia: el efecto es estadísticamente robusto.
Limitación: el modelo explica solo una fracción pequeña de la variación (\(16\%\)).
📊 Conclusión
La regresión simple muestra evidencia sólida de que el dólar influye en el oro de forma negativa.
Sin embargo, la baja capacidad predictiva (\(R^2\) bajo) implica que se necesitan otros factores (petróleo, tasas de interés, inflación, shocks geopolíticos) para construir un modelo predictivo más fuerte.
Cuadro resumen
Código
library(gt)#| label: simple-lmlm_s <-lm(gold_ret ~ dollar_ret, data = s1)broom::tidy(lm_s, conf.int =TRUE) |>gt() |>tab_header(title ="OLS (simple): coeficientes e IC 95%") |>fmt_num(c(estimate, std.error, statistic, p.value, conf.low, conf.high), dec =6)
OLS (simple): coeficientes e IC 95%
term
estimate
std.error
statistic
p.value
conf.low
conf.high
(Intercept)
0,006652
0,002804
2,371849
0,019004
0,001109
0,012194
dollar_ret
−1,091295
0,206016
−5,297149
0,000000
−1,498453
−0,684137
Un cuadro mas completo
Código
library(gt)resumen <- broom::tidy(lm_s, conf.int =TRUE) |>mutate(sig =case_when( p.value <0.01~"***", p.value <0.05~"**", p.value <0.1~"*",TRUE~"" ),interpretacion =c("Cuando el retorno del dólar es 0, el oro sube ≈ 0.66% en promedio","Un aumento de 1% en el retorno del dólar reduce el retorno del oro en ≈ 1.09%" ) )gt(resumen) |>fmt_number(columns =c(estimate, std.error, statistic, p.value, conf.low, conf.high),decimals =6, dec_mark =",", sep_mark =".") |>tab_header(title ="OLS (simple): coeficientes e interpretación") |>cols_label(term ="Variable",estimate ="Estimador",std.error ="Error Est.",statistic ="t",p.value ="p-valor",conf.low ="IC 95% (Inf)",conf.high ="IC 95% (Sup)",sig ="Sig.",interpretacion ="Interpretación" )
OLS (simple): coeficientes e interpretación
Variable
Estimador
Error Est.
t
p-valor
IC 95% (Inf)
IC 95% (Sup)
Sig.
Interpretación
(Intercept)
0,006652
0,002804
2,371849
0,019004
0,001109
0,012194
**
Cuando el retorno del dólar es 0, el oro sube ≈ 0.66% en promedio
dollar_ret
−1,091295
0,206016
−5,297149
0,000000
−1,498453
−0,684137
***
Un aumento de 1% en el retorno del dólar reduce el retorno del oro en ≈ 1.09%
¿Cómo se ve gráficamente esta relación lineal?
Código
# Gráfico de dispersión correctoplot(d$dollar_ret, d$gold_ret,main ="Regresión lineal: Oro vs Dólar",xlab ="Rendimiento del dólar",ylab ="Rendimiento del oro",pch =19, col ="darkgray")# Modelo consistentemodelo <-lm(gold_ret ~ dollar_ret, data = d)# Línea de regresiónabline(modelo, col ="blue", lwd =2)
Gráfico con ggplot
Código
s1 |>ggplot(aes(dollar_ret, gold_ret)) +geom_point(alpha =0.6) +geom_smooth(method ="lm", se =TRUE, linewidth =0.9) +labs(x ="Retorno del Dólar (DXY)", y ="Retorno del Oro", title ="Regresión lineal simple") +theme_minimal()
Diagnostico predictivo inicial
Código
library(broom)
Warning: package 'broom' was built under R version 4.4.3
Código
library(gt)# Ajuste del modelolm_s <-lm(gold_ret ~ dollar_ret, data = d)# Resumen del modeloglance_tbl <- broom::glance(lm_s)# Tabla con formateoglance_tbl %>%gt() %>%tab_header(title ="Diagnóstico global (R², F, σ, AIC/BIC)") %>%fmt_number(columns =c(r.squared, adj.r.squared, sigma, statistic, p.value, AIC, BIC, logLik, deviance),decimals =6,dec_mark =",",sep_mark ="." )
Diagnóstico global (R², F, σ, AIC/BIC)
r.squared
adj.r.squared
sigma
statistic
p.value
df
logLik
AIC
BIC
deviance
df.residual
nobs
0,161208
0,155463
0,034085
28,059791
0,000000
1
291,080891
−576,161781
−567,170145
0,169621
146
148
Estadístico
Valor
Interpretación
R²
0.161
El modelo explica el 16.1% de la variación en el retorno del oro a partir del retorno del dólar.
R² ajustado
0.155
Similar al R², ajusta por el número de predictores. Confirma que el modelo no está sobreajustado.
σ (residual standard error)
0.0341
El error típico de los residuos es ≈ 3.4 puntos porcentuales en los retornos del oro. Indica la magnitud del error de predicción.
F (statistic)
28.06
Prueba de significancia global: el modelo como conjunto es significativo.
p-value (modelo)
< 0.0001
Muy fuerte evidencia de que al menos un coeficiente (el retorno del dólar) explica parte de la variación en el oro.
df (grados de libertad regresor)
1
Solo hay un predictor (dollar_ret).
df.residual
146
Grados de libertad de los residuos (n - k - 1).
nobs
148
Observaciones efectivas utilizadas.
LogLik
291.08
Valor de la función de verosimilitud. Base para comparar modelos.
AIC
-576.16
Criterio de Akaike: más bajo indica mejor ajuste relativo.
BIC
-567.17
Criterio de Bayes: penaliza más por complejidad, útil en comparación de modelos.
Deviance
0.1696
Suma de residuos al cuadrado (varianza no explicada).
3.2 Supuestos de OLS y diagnósticos
Linealidad: Este supuesto implica que la relación entre las variables independientes y la variable dependiente debe ser lineal. Si la relación es no lineal, los resultados de la regresión (lineal) pueden ser poco confiables y conducir a interpretaciones erróneas sobre la relación entre las variables.
Normalidad: El supuesto de normalidad establece que los errores de la regresión deben seguir una distribución normal. ¡Cuidado con esto!, los errores, no las variables. Cuando este supuesto se cumple, las pruebas de hipótesis y los intervalos de confianza pueden interpretarse con mayor precisión. Si la normalidad no se cumple, los intervalos de confianza y las pruebas de hipótesis pueden verse afectados, lo que puede conducir a conclusiones erróneas.
Homocedasticidad: Este supuesto implica que la varianza de los errores debe ser constante en todos los niveles de las variables predictoras. Cuando se viola este supuesto, se produce heterocedasticidad, lo que significa que la dispersión de los errores varía en diferentes rangos de las variables predictoras. La presencia de heterocedasticidad puede distorsionar los intervalos de confianza y los valores p-value, lo que puede afectar la precisión de las pruebas de hipótesis.
Independencia: El supuesto de independencia indica que los errores de la regresión no deben estar correlacionados entre sí. Si hay autocorrelación presente, puede afectar la precisión de los coeficientes y las pruebas de hipótesis, lo que lleva a conclusiones erróneas sobre la importancia de las variables predictoras. ¿Qué es la autocorrelación? la presencia de autocorrelación en los residuos indica que los errores del modelo muestran cierto patrón sistemático en su distribución a lo largo del tiempo. Recordad que los errores o residuos de un modelo de regresión deberían distribuirse de manera aleatoria y seguir una distribución normal con media cero y varianza constante.
En el eje X están los valores ajustados (predichos por el modelo)
En el eje Y están los residuos (diferencia entre observado y predicho).
Interpretación:
La nube de puntos parece estar dispersa alrededor de la línea horizontal 0, sin un patrón claro.
Esto es bueno: sugiere que no hay heterocedasticidad fuerte ni relación sistemática no captada por el modelo.
Si vieras una forma de “abanico” (residuos más grandes a medida que crece el ajustado) o una curva, eso indicaría problemas como heterocedasticidad o falta de linealidad.
Uso en clase: sirve para explicar la verificación de dos supuestos:
La varianza constante de los errores (homocedasticidad).
Que el modelo capta la relación lineal y no deja un patrón estructurado en los residuos.
1 variable objetivo (gold_next_ret) y 6 predictores (los listados)
Training information
La receta “aprendió” usando 118 observaciones de train y no encontró filas incompletas
Operations
Zero variance: no se eliminó ninguna ( <none> ).
Centering and scaling: se normalizaron todos los predictores numéricos.
Correlation filter on: ma12: el filtro de correlación eliminó ma12 por estar muy correlacionada (|ρ| ≥ 0.95) con otra(s) variable(s) —típicamente con ma6, porque son medias móviles muy parecidas.
En otras palabras: tu diseño final para el modelo quedó con los predictores normalizados y sin ma12 (para evitar colinealidad).
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: linear_reg()
── Preprocessor ────────────────────────────────────────────────────────────────
3 Recipe Steps
• step_zv()
• step_normalize()
• step_corr()
── Model ───────────────────────────────────────────────────────────────────────
Linear Regression Model Specification (regression)
Computational engine: lm
Se define un modelo de regresión lineal (linear_reg()),
Se indica que se va a usar el motor de R base "lm" (set_engine("lm")).
Esto es la parte de parsnip: declara qué modelo quieres, pero aún no lo entrenas.
workflow() crea un contenedor donde integras preprocesamiento + modelo.
add_recipe(rec) añade la receta (rec) donde definiste las transformaciones de los datos.
add_model(mod_lm) añade el modelo de regresión lineal que acabas de definir.
Preprocessor: Recipe
Indica que usaste una receta con 3 pasos:
step_zv(): elimina variables con varianza cero (sin información).
step_normalize(): normaliza las variables (media 0, varianza 1).
Eje X → valores reales de la variable dependiente (gold_next_ret).
Eje Y → valores predichos por el modelo (.pred).
La línea azul es un ajuste lineal auxiliar que indica la tendencia.
Interpretación:
Existe una relación positiva, pero débil: cuando el valor real aumenta, el modelo tiende a predecir valores mayores, aunque con bastante dispersión.
Muchos puntos se alejan de la línea, lo que indica que el modelo no captura bien la variabilidad de los datos.
Idealmente, si el modelo fuera perfecto, los puntos deberían alinearse en una diagonal con pendiente = 1 (línea identidad). Aquí, la nube dispersa muestra que el ajuste es limitado.
La línea punteada en 0 indica el ideal (residuos centrados en cero).
Interpretación
Los residuos oscilan en torno a cero, pero se observan patrones cíclicos (suben y bajan en bloques).
Esto sugiere que el modelo no captura componentes temporales o estacionales de la serie (muy típico en series financieras/temporales)
Aunque no hay una tendencia clara de crecimiento en magnitud (no aumenta la varianza con el tiempo), sí se aprecia estructura → indicio de autocorrelación en los errores.
Conclusión general
El modelo de regresión lineal capta la dirección general (positiva) pero con poder predictivo débil.
Los residuos muestran estructura temporal, lo que indica que no son completamente aleatorios → se viola el supuesto de independencia.
Para datos con fechas (series temporales), sería recomendable probar modelos que incorporen dependencia temporal, como:
Modelos de machine learning adaptados a series temporales (XGBoost con lags, Prophet, LSTM, etc.).
Durbin-Watson test
data: eng
DW = 2.1906, p-value = 0.7778
alternative hypothesis: true autocorrelation is greater than 0
studentized Breusch-Pagan test
data: eng
BP = 12.134, df = 5, p-value = 0.03299
5.2.3 1. Durbin–Watson
Hipótesis:
H₀: no hay autocorrelación de primer orden en los residuos.
H₁: existe autocorrelación positiva.
Resultado: DW = 2.1906, p-valor = 0.7778.
Interpretación: DW ≈ 2 y p-valor alto → no se rechaza H₀
5.2.4 2. Breusch–Pagan
Hipótesis:
H₀: varianza constante de los residuos (homocedasticidad).
H₁: heterocedasticidad.
Resultado: BP = 12.134, p-valor = 0.03299.
Interpretación: p-valor < 0.05 → se rechaza H₀. Hay evidencia de heterocedasticidad en los residuos.
Panel gráfico
Posterior Predictive Check
La densidad de los datos observados y predichos es parecida, aunque el modelo suaviza demasiado los extremos.
Ajuste razonable pero con pérdida de variabilidad en colas
Linearity
Residuos frente a valores ajustados → no hay una curva clara, pero sí dispersión irregular.
La relación lineal es aceptable, aunque no perfecta.
Homogeneity of Variance
Los residuos deberían estar en una banda horizontal.
Aquí se observa dispersión creciente en algunos tramos.
Refuerza lo detectado por Breusch–Pagan: heterocedasticidad.
Influential Observations (Cook’s D / leverage)
La mayoría de puntos está dentro de las líneas de influencia, pero algunos se acercan al borde.
xisten observaciones influyentes, aunque no excesivas.
Collinearity (VIF)
Todos los predictores tienen VIF < 5 (umbral de preocupación).
No hay problema grave de multicolinealidad.
Normality of Residuals (Q-Q plot)
La mayoría de puntos sigue la diagonal, salvo en las colas.
Los residuos son aproximadamente normales, con ligeras desviaciones en valores extremos. ## Métricas y validación temporal
Código
yardstick::metrics(preds, truth = gold_next_ret, estimate = .pred) |>gt() |>tab_header(title="Métricas en Test") |>fmt_num(.estimate, dec=6)
Métricas en Test
.metric
.estimator
.estimate
rmse
standard
0,043117
rsq
standard
0,130291
mae
standard
0,034454
RMSE (Root Mean Squared Error) = 0.0431
→ Error cuadrático medio de alrededor del 4.3% en los retornos.
Mientras más bajo, mejor.
MAE (Mean Absolute Error) = 0.0345
→ En promedio, la predicción se equivoca en ±3.4% del retorno.
R² (rsq) = 0.1303
→ El modelo explica apenas el 13% de la variabilidad en el retorno del oro.
Esto es bastante bajo, indicando que la regresión lineal simple capta muy poco de la dinámica real.
Conclusión: el modelo tiene baja capacidad predictiva en el test. Captura algo de señal, pero la mayoría del comportamiento sigue siendo ruido.
RMSE promedio = 0.0366 (±0.0021)
→ En promedio, el error cuadrático medio de predicción es ~3.7%.
→ Es un poco mejor que el RMSE en el test simple (0.0431).
R² promedio = 0.0479 (±0.0140)
→ El modelo solo explica alrededor del 5% de la variabilidad en los retornos.
→ Es incluso más bajo que en el test simple (0.13).
→ Esto confirma que el modelo no generaliza bien a lo largo del tiempo.
Capacidad predictiva: aunque el RMSE no es alto en términos absolutos, el R² cercano a cero muestra que la regresión lineal apenas supera a un modelo trivial (predicción constante en la media).
Confirmación: lo que viste en test simple no fue casualidad: el modelo lineal no logra capturar patrones temporales en los retornos del oro.
El modelo de regresión lineal tiene poco poder explicativo en series financieras de retornos
Usar algoritmos de ML más flexibles con rolling CV (Random Forest, XGBoost, redes neuronales).
Para mejorar, se recomienda:
Incorporar lags (retardos) del oro y de los predictores.
5.3 Conclusión Final del Modelo
Ajuste del modelo
Se especificó y entrenó un modelo de regresión lineal en el framework tidymodels, con un flujo completo: preprocesamiento (normalización, eliminación de variables redundantes), ajuste y evaluación.
El modelo permitió obtener predicciones y realizar diagnósticos formales (residuos, autocorrelación, heterocedasticidad, normalidad, influencia),
Resultados en Test
RMSE ≈ 0.043 y MAE ≈ 0.034 → errores moderados en escala de retornos.
R² ≈ 0.13 → el modelo explica apenas un 13% de la variabilidad.
Validación Temporal (rolling-origin)
RMSE promedio ≈ 0.037, estable en distintas ventanas temporales.
R² promedio ≈ 0.048, cercano a cero → el modelo tiene poca capacidad explicativa.
Esto confirma que los resultados en test simple no fueron casualidad: la regresión lineal no capta patrones temporales robustos en los retornos.
Diagnóstico de supuestos
No autocorrelación significativa de los residuos (Durbin–Watson correcto).
Heterocedasticidad presente (Breusch–Pagan significativo).
Residuos aproximadamente normales, con desvíos en colas.
Sin problemas graves de multicolinealidad (VIF < 5).
Interpretación económica y práctica
El retorno del oro no puede explicarse bien solo con regresores lineales como dólar, petróleo, inflación o indicadores técnicos.
Los resultados reflejan la alta aleatoriedad y ruido en series financieras de retornos, donde los modelos lineales básicos son insuficientes.
Código
library(tidyverse)library(gt)# Intento 1: pedir IC al workflow (parsnip reciente lo soporta)preds_ci <-tryCatch({predict(fit_lm, new_data = test, type ="conf_int") %>%bind_cols(predict(fit_lm, new_data = test, type ="numeric"), test %>%select(date, gold_next_ret) )}, error =function(e) {# Fallback: extraer el lm interno y hornear test con la receta rec_prep <- recipes::prep(rec) test_baked <- recipes::bake(rec_prep, new_data = test) eng_lm <- workflows::extract_fit_engine(fit_lm) # objeto 'lm' ci_lm <-as.data.frame(predict(eng_lm, newdata = test_baked, interval ="confidence"))names(ci_lm) <-c(".pred", ".pred_lower", ".pred_upper")bind_cols(test %>%select(date, gold_next_ret), ci_lm)})# Rango de fechas efectivamente predicho en TESTrango <- preds_ci %>%summarise(min_fecha =min(date), max_fecha =max(date))print(rango)
# Tabla de los últimos 12 mesespreds_ci %>%arrange(date) %>%slice_tail(n =12) %>%select(date, gold_next_ret, .pred, .pred_lower, .pred_upper) %>%gt() %>%tab_header(title ="LM múltiple: Real vs Predicho (IC 95%) — últimos 12 meses") %>%fmt_number(columns =c(gold_next_ret, .pred, .pred_lower, .pred_upper),decimals =6, dec_mark =",", sep_mark =".")
LM múltiple: Real vs Predicho (IC 95%) — últimos 12 meses
date
gold_next_ret
.pred
.pred_lower
.pred_upper
2023-08-01
−0,002505
−0,021000
−0,042025
0,000026
2023-09-01
0,000969
−0,020952
−0,042479
0,000575
2023-11-01
0,024420
−0,000790
−0,028023
0,026443
2023-12-01
−0,002707
−0,003507
−0,027848
0,020835
2024-02-01
0,065018
−0,011772
−0,030535
0,006990
2024-03-01
0,078818
−0,005882
−0,027013
0,015249
2024-04-01
0,008184
−0,009868
−0,032426
0,012690
2024-05-01
−0,009112
−0,002909
−0,028283
0,022465
2024-07-01
0,031529
−0,002817
−0,028128
0,022495
2024-08-01
0,043402
0,001260
−0,027939
0,030459
2024-10-01
−0,012634
−0,006938
−0,037252
0,023376
2024-11-01
−0,003942
−0,012919
−0,044631
0,018793
Código
library(ggplot2)preds_ci %>%arrange(date) %>%ggplot(aes(date)) +geom_line(aes(y = gold_next_ret), linewidth =0.7, alpha =0.9) +geom_ribbon(aes(ymin = .pred_lower, ymax = .pred_upper), alpha =0.20) +geom_line(aes(y = .pred), linewidth =0.9, color ="blue") +labs(title ="Regresión lineal múltiple: Real vs Predicho con IC 95%",x =NULL, y ="Retorno del oro (t+1)",caption ="Línea negra: real | Línea azul: predicho | Banda: IC 95% (media condicional)" ) +theme_minimal()
Regresión lineal múltiple: Real vs Predicho con IC 95%
6 Unidad 4. Regresión Logística
En análisis econométrico, cuando la variable dependiente es binaria (toma valores 0 o 1), como por ejemplo:
Trabaja (1) o no trabaja (0)
Está enfermo (1) o no está enfermo (0),
Vota por un candidato (1) o no (0),
El uso de un modelo de regresión lineal tradicional no es adecuado. El modelo logit se propone como una solución, garantizando que las probabilidades predichas estén siempre en el rango [0,1] gracias a la función logística.
Esto es peor que lanzar una moneda al aire (50%), lo cual indica que el modelo no está aprendiendo un patrón útil con el umbral de 0.5.
Kappa (Cohen’s Kappa): 0.000
Kappa mide el acuerdo entre lo predicho y lo real, corrigiendo por el azar.
Un valor cercano a 0 significa que el modelo no predice mejor que el azar.
Valores aceptables suelen estar sobre 0.2 (débil), 0.4 (moderado), 0.6+ (fuerte).
7.8 🔎 Interpretación
Sesgo hacia una clase
El modelo probablemente predice la mayoría de las veces la clase DOWN, lo que hace que falle cuando la clase real es UP.
Esto puede deberse a un desbalance de clases en los datos de entrenamiento.
Umbral fijo (0.5)
Con un umbral de decisión de 0.5, el modelo puede estar siendo demasiado rígido. Quizás ajustando el umbral se mejore el equilibrio entre sensibilidad (recall) y precisión (precision).
Valor práctico
Tal como está, el modelo no es confiable para tomar decisiones, porque no supera el azar. Necesita:
Revisión de balance de clases (ej. downsample, upsample, SMOTE).
Revisión de features (quizás faltan variables explicativas relevantes).
Ajuste del umbral para clasificar.
7.9 Matriz de confusión + sensibilidad /especificidad
Código
cm <-conf_mat(pred_cls, truth = up_next, estimate = .pred_class)cm
Truth
Prediction DOWN UP
DOWN 14 16
UP 0 0
Código
# Sensibilidad (TPR) y especificidad (TNR)sens <-sens(pred_cls, truth = up_next, estimate = .pred_class, event_level ="second") # 'UP' es el segundo nivelspec <-spec(pred_cls, truth = up_next, estimate = .pred_class, event_level ="second")bind_rows(sens, spec) |>gt() |>tab_header(title ="Sensibilidad y Especificidad (umbral 0.5)")
Sensibilidad y Especificidad (umbral 0.5)
.metric
.estimator
.estimate
sens
binary
0
spec
binary
1
14 aciertos en DOWN → el modelo predijo DOWN cuando realmente fue DOWN.
16 errores en UP → el modelo siempre predijo DOWN, incluso cuando la realidad era UP.
0 aciertos en UP → el modelo nunca predijo UP.
Sensibilidad (Recall para UP):
La sensibilidad mide la capacidad de detectar correctamente los positivos (UP).
Aquí es 0%, porque nunca se predijo UP cuando realmente ocurrió.
⚠️ El modelo falla totalmente en detectar la clase UP.
Especificidad (Recall para DOWN): 1
La especificidad mide la capacidad de detectar correctamente los negativos (DOWN).
Aquí es 100%, porque todo lo que fue DOWN se predijo como DOWN.
Pero ojo: esto se logra porque el modelo siempre predice DOWN, lo cual sesga completamente los resultados.
El modelo está totalmente sesgado hacia la clase DOWN.
Esto es típico en un problema de desbalance de clases: si hay más casos de DOWN en los datos de entrenamiento, el modelo aprende a “jugar seguro” prediciendo siempre esa clase.
Por eso:
Accuracy global bajo (≈47%)
Kappa = 0 (no mejor que el azar).
Sensibilidad = 0 (incapaz de detectar UP).
Especificidad = 1 (detecta bien DOWN, pero por sesgo, no por aprendizaje real).
Código
table(train_cls$up_next) /nrow(train_cls)
DOWN UP
0.4830508 0.5169492
7.9.1Curva ROC/AUC y Pr AUC
Código
roc_auc(pred_cls, truth = up_next, .pred_UP, event_level ="second")
pr_df <-pr_curve(pred_cls, truth = up_next, .pred_UP, event_level ="second")autoplot(pr_df) +ggtitle("Precision–Recall Curve")
Por qué: ROC/AUC resumen discriminación global; PR-AUC útil cuando la clase positiva es rara.
7.10 Resultados clave
ROC AUC = 0.585
El área bajo la curva ROC mide la capacidad del modelo para discriminar entre UP y DOWN.
Un valor de 0.5 indica azar puro, y 1.0 indica discriminación perfecta.
Con 0.585, tu modelo discrimina apenas un poco mejor que el azar, lo cual es débil desempeño.
Curva ROC
La curva está muy cercana a la diagonal (línea punteada = azar).
Esto confirma que el poder predictivo es bajo: el modelo no logra separar bien entre positivos (UP) y negativos (DOWN).
Curva Precisión–Recall
La precisión cae rápido a medida que aumenta el recall.
Esto muestra que cuando intentas capturar más casos UP (mayor recall), lo haces a costa de perder precisión (muchos falsos positivos).
Una curva que se mantiene alta y hacia la esquina superior derecha indicaría buen desempeño, pero aquí está bastante dispersa.
7.10.1 Afinar umbral
Código
library(tidymodels)# 1) Curva PR (precision & recall por umbral)pr_tbl <-pr_curve(pred_cls,truth = up_next, .pred_UP, # sin "estimate ="event_level ="second") # 'UP' es la clase positiva# 2) Calcular F1 por umbral y elegir el mejorbest_row <- pr_tbl %>%filter(!is.na(.threshold)) %>%# descarta el punto inicial (NA)mutate(F1 =2* precision * recall / (precision + recall)) %>%arrange(desc(F1)) %>%slice(1)best_row
# A tibble: 1 × 4
.threshold recall precision F1
<dbl> <dbl> <dbl> <dbl>
1 0.101 0.938 0.6 0.732
Código
thr <- best_row$.threshold# 3) Re-clasificar con el umbral óptimo y evaluarpred_thr <- pred_cls %>%mutate(.pred_class_thr =factor(if_else(.pred_UP >= thr, "UP", "DOWN"),levels =c("DOWN","UP")))metrics(pred_thr, truth = up_next, estimate = .pred_class_thr) %>%gt() %>%tab_header(title =paste0("Métricas con umbral óptimo (F1) = ", round(thr, 3)))
Métricas con umbral óptimo (F1) = 0.101
.metric
.estimator
.estimate
accuracy
binary
0.6333333
kap
binary
0.2325581
7.11 Resultados con umbral óptimo (F1)
Umbral = 0.101
→ Esto significa que cualquier probabilidad de UP ≥ 0.101 se clasifica como UP.
→ Es un umbral mucho más bajo que 0.5, lo que permite al modelo detectar casos UP que antes ignoraba.
Recall (sensibilidad para UP) = 0.938
→ El modelo ahora detecta el 93.7% de los casos UP.
→ Excelente mejora (antes era 0%).
Precision (precisión para UP) = 0.60
→ De todas las predicciones UP, el 60% fueron correctas.
→ Aceptable, considerando que antes era inexistente.
F1 = 0.731
→ El F1 combina recall y precision.
→ Mejoró sustancialmente (antes ≈0).
Accuracy = 0.633
→ El modelo acierta en el 63.3% de los casos totales.
→ Mejor que el azar (50%) y también mejor que con umbral 0.5 (46.7%).
Kappa = 0.233
→ Aún bajo, pero mejor que 0.
→ Indica un acuerdo débil, aunque ya superior al azar.
7.12 🔎 Interpretación
El ajuste de umbral corrige el sesgo: ahora el modelo sí detecta UP.
El costo: aumenta la probabilidad de falsos positivos, pero se logra un balance mejor entre sensibilidad y precisión.
Este cambio mejora notablemente la utilidad práctica del modelo, especialmente si es crítico no perder casos UP.
Sin embargo, la AUC (≈0.58) muestra que la capacidad discriminativa del modelo sigue siendo limitada.
7.13 🚀 Recomendaciones
Mantener este análisis como evidencia de que el umbral fijo 0.5 no era adecuado.
Explorar técnicas adicionales para mejorar la discriminación:
Balanceo de clases en el entrenamiento (SMOTE, undersampling, oversampling).
Modelos no lineales (árboles, random forest, XGBoost).
Inclusión de más variables predictoras relevantes.
Reportar tanto las métricas con umbral estándar (0.5) como con umbral optimizado (≈0.101) para mostrar la ganancia.
📌 Resumen:
Con el umbral optimizado (0.101), el modelo pasó de “no detectar nunca UP” a capturar casi todos los UP (93.7% de recall), con un nivel razonable de precisión (60%) y una mejora clara en exactitud y F1.
7.13.1Interpretación del Modelo
Código
# Extraer el glm "interno" y ver coeficienteseng_log <- fit_log |>extract_fit_engine() # objeto glmsummary(eng_log)
Call:
stats::glm(formula = ..y ~ ., family = stats::binomial, data = data)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.08030 0.19643 0.409 0.68267
dollar_ret -0.15646 0.24280 -0.644 0.51933
wti_ret -0.04014 0.23044 -0.174 0.86170
infl_yoy -0.38921 0.23832 -1.633 0.10244
ma6 -0.30566 0.20723 -1.475 0.14022
rsi14 0.62340 0.22838 2.730 0.00634 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 163.45 on 117 degrees of freedom
Residual deviance: 148.93 on 112 degrees of freedom
AIC: 160.93
Number of Fisher Scoring iterations: 4
Se ajustó un GLM binomial (logit) para explicar la probabilidad de que la variable dependiente yyy tome valor 1, en función de:
dollar_ret (retorno del dólar)
wti_ret (retorno del petróleo WTI)
infl_yoy (inflación interanual)
ma6 (media móvil a 6 periodos)
rsi14 (indicador técnico RSI 14 días.
7.15 Coeficientes (log-odds)
En el primer cuadro (summary(eng_log)):
Los coeficientes representan cambios en los log-odds de que \(Y\)=1.
El signo indica la dirección del efecto:
Negativo → reduce la probabilidad de éxito.
Positivo → aumenta la probabilidad de éxito.
La columna Pr(>|z|) indica si el efecto es estadísticamente significativo.
Resultados principales:
Intercepto: 0.080 (p=0.682). No significativo.
dollar_ret: -0.156 (p=0.519). No significativo.
wti_ret: -0.040 (p=0.861). No significativo.
infl_yoy: -0.389 (p=0.102). Cercano a significancia, indica que mayor inflación podría reducir la probabilidad de éxito.
ma6: -0.306 (p=0.140). No significativo, pero con tendencia negativa.
rsi14: 0.623 (p=0.006). Significativo al 1%, fuerte predictor positivo.
7.16 Odds Ratios (exp(beta))
En la tabla de odds ratios (segunda imagen):
Interpretación: valores >1 indican que un aumento en la variable incrementa la probabilidad de éxito; <1 indican lo contrario.
Incluyen intervalos de confianza al 95%.
Resultados principales:
dollar_ret (0.855, IC 0.521–1.369) → efecto negativo, pero no significativo.
wti_ret (0.961, IC 0.610–1.552) → prácticamente sin efecto, no significativo.
infl_yoy (0.678, IC 0.413–1.062) → reduce la probabilidad (odds más bajos), casi significativo.
ma6 (0.737, IC 0.485–1.099) → reduce la probabilidad, aunque no significativo.
rsi14 (1.865, IC 1.207–2.973) → efecto positivo y significativo: cada aumento de una unidad en RSI multiplica por 1.86 las odds de que el evento ocurra.
7.17 Diagnóstico del modelo
Deviance nula: 163.45
Deviance residual: 148.93
→ El modelo reduce la devianza, pero no de forma drástica.
AIC = 160.93 → métrica de ajuste y comparación entre modelos (menor es mejor).
Iteraciones de Fisher: 4 → convergencia rápida, modelo estable.
7.18 Conclusiones
El único predictor robusto es rsi14, que aumenta significativamente la probabilidad de éxito en el modelo.
Inflación (infl_yoy) muestra un efecto negativo que merece atención, aunque no alcanza significancia al 5% (sí cercana al 10%).
Retornos del dólar y del WTI no parecen aportar información relevante en este caso.
El modelo en general tiene un ajuste moderado (devianza reducida, AIC ~161). Puede mejorarse con:
Transformaciones de variables.
Inclusión de nuevas covariables (ej. tasas de interés reales, volatilidad implícita, indicadores técnicos adicionales).
Modelos no lineales o interacciones.
📌 Interpretación práctica:
El RSI de 14 días es el mejor indicador para explicar la probabilidad de cambio en el oro en este modelo logit. Un aumento en RSI se traduce en casi el doble de probabilidades de que el evento ocurra, manteniendo las demás variables constantes.