Introducción

Este informe analiza la base de datos ‘Commodities_2000_2025.xlsx’, que contiene precios diarios de materias primas entre enero de 2000 y enero de 2025. Para el modelado de series de tiempo, los datos se agregan a frecuencia mensual tomando el último día hábil de cada mes, con estacionalidad \(s = 12\)

El objetivo principal es estudiar la dinámica del precio del Brent (USD/barril), identificando patrones de tendencia, estacionalidad y choques. Se emplea la metodología Box–Jenkins mediante modelos SARIMA, y se exploran especificaciones con variable exógena (SARIMAX) utilizando el Bloomberg Commodity Index para evaluar mejoras de ajuste y pronóstico.

A continuación, se presenta el diccionario que enlista cada una de las variables a manipular en el siguiente informe:

Diccionario de variables del dataset de commodities (2000–2025)

Variable Descripción Unidad Notas
Fecha Fecha de observación YYYY-MM-DD Se agrega a fin de mes (último día).
Brent Precio spot del crudo Brent USD/barril Serie diaria.
WTI Precio spot del crudo WTI USD/barril Serie diaria.
Bloomberg_Commodity_Index Bloomberg Commodity Index (BCOM) Índice Serie diaria.
CRB_Index CRB Commodity Index Índice Serie diaria.
RICI Rogers International Commodity Index Índice Serie diaria.

Fuente: serie obtenida vía Reuters a partir de FRED – Federal Reserve Economic Data.

Análisis exploratorio de los datos

Esta etapa permite conocer en profundidad la estructura, distribución y comportamiento general de las variables, así como identificar patrones, detectar valores atípicos, datos faltantes o inconsistencias que podrían afectar la calidad y validez de los modelos y análisis posteriores.

(mensual_ult_dia[, c("Brent","WTI","Bloomberg_Commodity_Index","CRB_Index","RICI")])
## # A tibble: 301 × 5
##    Brent   WTI Bloomberg_Commodity_Index CRB_Index  RICI
##    <dbl> <dbl>                     <dbl>     <dbl> <dbl>
##  1  26.0  27.6                      96.8      165. 1345.
##  2  28.1  30.4                      98.1      170. 1406.
##  3  24.8  26.8                      98.5      170. 1394.
##  4  24.0  25.7                      96.9      168. 1364.
##  5  28.3  29.0                     103.       182. 1468.
##  6  30.5  32.4                     105.       188. 1540.
##  7  26.9  27.4                      99.0      179. 1455.
##  8  31.7  33.1                     108.       195. 1607.
##  9  29.8  30.9                     107.       193. 1584.
## 10  30.8  32.7                     104.       191. 1595.
## # ℹ 291 more rows

1. Petróleo (Brent y WTI)

  • Valores mínimos cercanos a 19 USD/barril, reflejan episodios de crisis en el mercado (ej. pandemia 2020).
  • Mediana: ~66 USD para Brent y ~63 USD para WTI → indican que, en la mitad del período, los precios estuvieron en ese rango.
  • Media: ligeramente mayor (Brent: 67, WTI: 63), mostrando cierta asimetría hacia precios altos.
  • Máximos: ~140 USD, corresponden a picos históricos (ej. crisis energética 2008).
  • Distribución: la media y mediana son cercanas → no hay fuerte sesgo, pero los máximos muestran volatilidad típica del mercado petrolero.
  1. Bloomberg Commodity Index (BCOM)
  • Mínimo: 60.9, máximo: 233.03 → rango amplio, más de 3 veces el valor mínimo.
  • Media (119.6) y mediana (111.8) → sugieren una distribución levemente sesgada a la derecha (influencia de periodos de altos precios de commodities).
  • Captura la tendencia general del ciclo de materias primas: auge en la década de 2000 y caídas posteriores.
  1. CRB Index
  • Media: 249.4, mediana: 262.0 → bastante cercanas, indicando simetría.
  • Máximo: 462.7 → valores extremos reflejan choques fuertes de precios internacionales.
  • Rango intercuartílico (189–296) → valores bastante compactos, lo que sugiere que la mayoría de observaciones están en torno al promedio.
  1. RICI
  • Es el índice con mayor escala (mínimo 1276 – máximo 5718).
  • Media (2916) vs mediana (2949) → bastante alineadas, sugiriendo distribución estable.
  • La dispersión relativa (de 1276 a 5718) indica sensibilidad fuerte a los superciclos de materias primas.

Con base en lo anterior, se decide tomar solo las variables Brent y Bloomberg_Commodity_Index para los análisis posteriores.

Histograma

ggplot(mensual_ult_dia, aes(x = Brent)) +
  geom_histogram(bins = 30, fill = "darkblue", color = "white") +
  labs(title = "Histograma Brent", x = "USD/barril", y = "Frecuencia") + 
  theme_minimal()

El histograma del Brent muestra que, aunque el precio ha oscilado en un rango amplio (20–140 USD/barril), la mayor parte de las observaciones se concentran en torno a 60–80 USD/barril, lo que representa un nivel habitual de mercado. Los precios extremadamente altos o bajos han sido eventos excepcionales y de corta duración, reflejando la naturaleza volátil y cíclica del mercado petrolero.

Brent y WTI

A continuación, se deja los objetos para modelar, donde ambas variables a analizar de manera posteriores se an analizará la serie mensual para espcger cual es la más acorde para nuestro modelo SARIMA

# Serie 'ts' mensual (frecuencia 12). Elige una columna (Brent, WTI)
start_year <- year(min(mensual_ult_dia$Fecha))
start_month <- month(min(mensual_ult_dia$Fecha))
brent_ts <- ts(mensual_ult_dia$Brent, start = c(start_year, start_month), frequency = 12)
wti_ts   <- ts(mensual_ult_dia$WTI,   start = c(start_year, start_month), frequency = 12)

# Alternativa: serie con índice de fecha (zoo)
brent_zoo <- zoo(mensual_ult_dia$Brent, order.by = mensual_ult_dia$Fecha)
wti_zoo   <- zoo(mensual_ult_dia$WTI,   order.by = mensual_ult_dia$Fecha)

p1 <- ggplot(mensual_ult_dia, aes(x = Fecha, y = Brent)) +
  geom_line(color = "darkblue") +
  labs(title = "Serie mensual Brent", x = "Fecha", y = "USD/barril") 

p2 <- ggplot(mensual_ult_dia, aes(x = Fecha, y = WTI)) +
  geom_line(color = "darkgreen") +
  labs(title = "Serie mensual WTI", x = "Fecha", y = "USD/barril")

grid.arrange(p1, p2, ncol = 1)

Ambas series presentan una tendencia similar

data_long <- mensual_ult_dia %>%
  pivot_longer(cols = c(Brent, WTI), 
               names_to = "Variable", 
               values_to = "Valor")

# Graficar Brent y WTI en la misma figura
ggplot(data_long, aes(x = Fecha, y = Valor, color = Variable)) +
  geom_line(size = 1) +
  geom_point(size = 1.5) +
  labs(title = "Precios Internacionales del Petróleo",
       subtitle = "Brent vs WTI (USD/barril, último día de cada mes)",
       x = "Fecha", y = "USD/barril") +
  scale_color_manual(values = c("Brent" = "blue", "WTI" = "darkgreen")) +
  theme_minimal() +
  theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
        legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

A simple vista, tanto la serie mensual del Brent como la del WTI no cumplen las propiedades de una serie estacionaria. La media no es constante en el tiempo, pues se observan fases prolongadas de precios altos (2010–2014) y periodos de fuertes caídas (2008–2009, 2014–2016 y 2020). Del mismo modo, la varianza no es homogénea: existen momentos de gran volatilidad —picos abruptos en 2008 y 2022— y fases de menor dispersión, lo que sugiere la presencia de heterocedasticidad.

En particular, se identifican tres episodios críticos:

Crisis financiera global (2008–2009): fuerte caída de precios tras un máximo histórico.

Pandemia de COVID-19 (2020): desplome sin precedentes de la demanda, con el WTI llegando incluso a precios negativos en términos diarios.

Conflicto Rusia–Ucrania (2022): incremento abrupto con precios que superan nuevamente los 100 USD/barril.

Respecto a la tendencia, no se observa una dirección clara a largo plazo, sino una sucesión de fases contracíclicas: crecimiento sostenido hasta 2008, desplome posterior, estabilización relativa en la década de 2010, nueva caída en 2020 y repunte transitorio en 2022. En los últimos dos años, ambas referencias muestran una tendencia descendente moderada, posiblemente asociada a ajustes de oferta, transición energética y moderación de la demanda global.

En síntesis, las series de precios Brent y WTI reflejan una marcada no estacionariedad, determinada por choques externos, factores geopolíticos y ciclos económicos globales. La alta volatilidad y los cambios de varianza a lo largo del tiempo confirman la necesidad de aplicar transformaciones (logaritmos y diferenciaciones) antes de proceder a un modelamiento ARIMA/SARIMA. Además, su comportamiento reactivo frente a crisis internacionales refuerza la importancia de tratarlas como variables dependientes de factores exógenos.

Así mismo, dado el comportamiento observado en ambas series, se decide utilizar el Brent como referencia principal para los análisis posteriores. Esta elección obedece a que el Brent es considerado el indicador global más representativo del mercado petrolero, ampliamente utilizado en transacciones internacionales, reportes financieros y estudios académicos. Además, presenta una mayor estabilidad como benchmark frente al WTI, cuyo precio puede verse más afectado por dinámicas internas del mercado estadounidense (logística, almacenamiento y costos de transporte). Por lo tanto, el Brent resulta más adecuado para capturar las tendencias y choques internacionales que impactan el precio del crudo a nivel global.

Procesamiento - Autocorrelación ACF y PACF

par("mar")
## [1] 5.1 4.1 4.1 2.1
par(mar=c(1,1,1,1))
opcion = par(mfrow=c(2,1))
acf(brent_ts,lag.max =30)
pacf(brent_ts,lag.max =30)

Al aplicar la Función de Autocorrelación (ACF) y la Función de Autocorrelación Parcial (PACF) a la serie mensual del precio del Brent, se observa que la ACF presenta un decaimiento lento y prolongado a lo largo de los rezagos, lo que sugiere que la serie no es estacionaria y conserva memoria de largo plazo. En contraste, la PACF muestra un valor significativo en el primer rezago y luego se corta de manera abrupta, patrón característico de procesos autorregresivos de primer orden, o de series que requieren diferenciación para alcanzar estacionariedad.

Este comportamiento es consistente con la naturaleza de los precios del petróleo, los cuales siguen dinámicas persistentes determinadas por factores estructurales y choques exógenos. En consecuencia, se confirma la necesidad de aplicar transformaciones (diferenciación o logaritmos) antes de ajustar un modelo ARIMA o SARIMA, de manera que se eliminen las tendencias y se pueda capturar adecuadamente la estructura temporal de la serie.

ndiffs(brent_ts)#Número de diferencias ordinarias sugeridas para volver estacionaria la serie
## [1] 1
nsdiffs(brent_ts)#Número de diferencias estacionales
## [1] 0

Al aplicar los criterios de selección de diferenciación (funciones ndiffs() y nsdiffs()), se encontró que la serie del Brent requiere una diferenciación ordinaria (d=1) para alcanzar estacionariedad. Por otro lado, el número de diferenciaciones estacionales sugerido es cero (D=0), lo cual indica que, aunque la serie presenta volatilidad y choques abruptos, no se detecta un patrón de estacionalidad sistemático que justifique una diferenciación adicional de carácter estacional.

En consecuencia, el modelo adecuado deberá contemplar al menos una diferencia ordinaria, pero no necesita diferenciaciones estacionales. Esto respalda la elección de modelos del tipo ARIMA o SARIMA con d=1 y D=0.

adf<-adf.test(brent_ts)
adf$p.value
## [1] 0.4128007
adf.test(diff(brent_ts))
## Warning in adf.test(diff(brent_ts)): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(brent_ts)
## Dickey-Fuller = -7.0841, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

Para evaluar la estacionariedad de la serie mensual del Brent, se aplicó la prueba de raíz unitaria de Dickey-Fuller Aumentada (ADF).

En la serie original, el valor p obtenido fue de 0.41, lo cual es mayor al nivel de significancia habitual (0.05). En consecuencia, no se rechaza la hipótesis nula de raíz unitaria, confirmando que la serie original no es estacionaria.

Posteriormente, al aplicar la prueba sobre la serie diferenciada en primer orden, el estadístico Dickey-Fuller fue de -7.08 con un valor p menor a 0.01, lo que permite rechazar la hipótesis nula y concluir que la serie diferenciada sí es estacionaria.

Estos resultados respaldan la necesidad de realizar una diferenciación ordinaria (d=1) en la modelación ARIMA/SARIMA para garantizar la estacionariedad de la serie del Brent.

p1 <- autoplot(acf(brent_ts, plot = FALSE, lag = 60)) +
  labs(title = "ACF Brent (niveles)", x = "Rezagos", y = "Autocorrelación") +
  theme_minimal()

# ACF en primera diferencia
p2 <- autoplot(acf(diff(brent_ts), plot = FALSE, lag = 60)) +
  labs(title = "ACF Brent (1ª diferencia)", x = "Rezagos", y = "Autocorrelación") +
  theme_minimal()

# Mostrar ambas juntas
grid.arrange(p1, p2, ncol = 1)

Al comparar la Función de Autocorrelación (ACF) del precio mensual del Brent en niveles y en su primera diferencia, se evidencia un cambio importante en el comportamiento de la serie. En niveles, la ACF muestra un decaimiento lento y prolongado, lo cual confirma la presencia de no estacionariedad y dependencia temporal de largo plazo.

Tras aplicar una diferenciación ordinaria, la ACF se estabiliza: las autocorrelaciones caen rápidamente y la mayoría se ubican dentro de las bandas de confianza, con excepción de un pico en el primer rezago. Esto sugiere que la serie diferenciada alcanza la estacionariedad, condición indispensable para la aplicación de modelos ARIMA o SARIMA.

En conclusión, el análisis gráfico respalda los resultados estadísticos previos (ADF test y función ndiffs()), confirmando que el precio del Brent requiere una diferencia ordinaria (𝑑=1) y no necesita diferenciaciones estacionales (D=0) para ser modelado adecuadamente.

# Aplicar una diferencia ordinaria
brent_diff1  <- diff(brent_ts, differences = 1)
# 2. Graficar Brent diferenciada
plot(brent_diff1,
     main = "Brent - Serie diferenciada (1ra diferencia)",
     ylab = "Diferencia", xlab = "Tiempo", col = "darkblue")
abline(h = 0, col = "darkred", lty = 2)

Tras aplicar la primera diferenciación a la serie del Brent, se observa que la serie transformada oscila alrededor de una media cercana a cero, eliminando la tendencia presente en la serie original. La varianza es relativamente constante en el tiempo, aunque se aprecian episodios de mayor volatilidad, especialmente durante la crisis financiera de 2008–2009, la pandemia de COVID-19 en 2020 y el repunte asociado al conflicto Rusia–Ucrania en 2022.

Estos resultados confirman que la diferenciación ordinaria fue efectiva para alcanzar la estacionariedad en media y varianza, condición fundamental para la modelación con ARIMA/SARIMA. No obstante, los choques abruptos reflejan la naturaleza volátil e inestable del mercado petrolero, lo que deberá considerarse en la interpretación de los resultados y la selección de modelos.

autoplot(brent_diff1, ts.colour = "darkorange4", ts.linetype = "dashed") +
  theme_minimal()
## Warning in ggplot2::geom_line(na.rm = TRUE, ...): Ignoring unknown parameters:
## `ts.colour` and `ts.linetype`

autoplot(acf(brent_diff1, plot = FALSE,lag=28))

acf(brent_diff1,lag.max =30)

pacf(brent_diff1,lag.max =30)

acf(brent_diff1)$acf[12]

## [1] 0.04144274

Al analizar las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF) de la serie diferenciada del Brent, se observa un comportamiento característico de procesos estacionarios de corto plazo. La ACF muestra un pico significativo en el primer rezago y luego cae rápidamente, mientras que el PACF se corta después del primer rezago. Este patrón sugiere que la dinámica de la serie puede ser explicada adecuadamente por modelos de tipo AR(1) o MA(1).

En conclusión, la serie diferenciada es estacionaria y presenta un patrón compatible con modelos ARIMA(1,1,0) o ARIMA(0,1,1)

Como la autocorrelación al rezago 12 es menor a 0.5. Tratamos con un media móvil en la parte estacional. Por este motivo se hace Q = 1 y P = 0.

De forma que, a partir de los aparametros anteriores se presentan dos modelos como propuesta SARIMA:

Modelo A: \((p,d,q)(P,D,Q) = (1,1,0)(0,0,1)_{12}\)

Modelo B: \((0,1,1)(0,0,1)_{12}\)

Modelado

arima1<- Arima(brent_ts, order=c(1,1,0), seasonal=list(order=c(0,0,1),period=12))
arima2<- Arima(brent_ts, order=c(0,1,1), seasonal=list(order=c(0,0,1),period=12))
arima3<- auto.arima(brent_ts)
# Criterios de información
AIC(arima1,arima2,arima3) # arima1 y arima3
##        df      AIC
## arima1  3 1937.614
## arima2  3 1939.421
## arima3  3 1937.235

De acuerdo con el criterio de información de Akaike (AIC), el modelo con mejor desempeño es arima3, ya que presenta el valor de AIC más bajo (1937.235). Esto indica que logra un equilibrio más adecuado entre ajuste y parsimonia, explicando la dinámica de la serie de precios del Brent con menor pérdida de información.

El mejor modelo según AICc es arima3, pero arima1 también es un candidato válido. Entre esos dos deberías elegir el que tenga residuos más “limpios” (ruido blanco) al revisar con checkresiduals().

Ambos modelos cumplen el criterio fundamental: residuos sin autocorrelación. El AICc más bajo fue para arima3 (0,1,2), aunque la diferencia con arima1 fue mínima (<2).En términos prácticos, ambos modelos son válidos.

checkresiduals(arima1)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,0)(0,0,1)[12]
## Q* = 17.252, df = 22, p-value = 0.7493
## 
## Model df: 2.   Total lags used: 24

Al analizar los residuos del modelo ARIMA(1,1,0)(0,0,1)12ARIMA(1,1,0)(0,0,1)_{12}ARIMA(1,1,0)(0,0,1)_12​, se observa que estos se distribuyen alrededor de cero sin mostrar patrones sistemáticos ni tendencia aparente. La Función de Autocorrelación (ACF) confirma que las correlaciones en diferentes rezagos se encuentran dentro de las bandas de confianza, lo cual indica ausencia de autocorrelación significativa y respalda que los residuos se comportan como ruido blanco.

El histograma revela que la distribución de los residuos es aproximadamente normal y centrada en cero, aunque con ligeras desviaciones en las colas asociadas a choques exógenos como la crisis financiera de 2008–2009 y la pandemia de 2020.

En conclusión, el diagnóstico de residuos confirma que el modelo ajustado es adecuado, ya que cumple con el criterio fundamental de no dejar estructura temporal remanente.

checkresiduals(arima3)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,2)
## Q* = 15.545, df = 22, p-value = 0.8378
## 
## Model df: 2.   Total lags used: 24

Tanto el modelo ARIMA(1,1,0)(0,0,1)12ARIMA(1,1,0)(0,0,1)_{12}ARIMA(1,1,0)(0,0,1)12​ como el ARIMA(0,1,2)ARIMA(0,1,2)ARIMA(0,1,2) producen residuos que cumplen el criterio de ruido blanco, lo que confirma que ambos capturan adecuadamente la dinámica de la serie. Sin embargo, el modelo ARIMA(0,1,2) resulta ligeramente superior, ya que combina un menor valor de AIC con residuos más centrados y simétricos respecto a la distribución normal.

En consecuencia, el modelo ARIMA(0,1,2) se considera la mejor opción para modelar el precio mensual del Brent, al equilibrar parsimonia, bondad de ajuste y calidad de residuos.

BIC(arima1,arima2,arima3) # arima2 y arima3
##        df      BIC
## arima1  3 1948.725
## arima2  3 1950.532
## arima3  3 1948.346

De acuerdo con el criterio BIC, el modelo con mejor desempeño es arima3, ya que presenta el valor más bajo (1948.3). El modelo arima1 también resulta competitivo, con un BIC muy cercano (1948.7), mientras que el modelo arima2 es descartado por tener un valor superior (1950.5).

Estos resultados confirman lo observado con el AIC: tanto arima1 como arima3 son modelos válidos, pero el arima3 ofrece un ligero mejor balance entre ajuste y parsimonia, siendo por tanto la mejor opción para representar la dinámica de la serie del Brent.

# Metricas intramuestra
accuracy(arima1)  
##                     ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 0.1368431 6.041302 4.500568 -0.1044742 7.449466 0.2522133
##                     ACF1
## Training set -0.00341121
accuracy(arima2)  
##                     ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 0.1477637 6.059629 4.515887 -0.1300716 7.460816 0.2530718
##                    ACF1
## Training set 0.02002591
accuracy(arima3)  
##                    ME    RMSE      MAE         MPE     MAPE      MASE
## Training set 0.129074 6.03762 4.492164 -0.09994534 7.440053 0.2517424
##                      ACF1
## Training set -0.001971888

Al evaluar las métricas intramuestrales (ME, RMSE, MAE, MAPE, MASE y ACF1), se observa que los tres modelos logran un buen ajuste, con errores promedio bajos y residuos sin autocorrelación significativa. No obstante, el modelo ARIMA(0,1,2) presenta los valores más bajos de RMSE (6.0376), MAE (4.4922) y MAPE (7.440%), lo cual lo convierte en el modelo más preciso dentro de la muestra.

Aunque el modelo ARIMA(1,1,0)(0,0,1)[12] también ofrece un desempeño muy cercano, el criterio cuantitativo confirma que ARIMA(0,1,2) es el mejor modelo para la serie del Brent, al minimizar los errores de predicción intramuestral.

# Residuos del modelo
resid_arima3 <- residuals(arima3)
# Gráfico de residuos
plot(resid_arima3, main = "Residuos del ARIMA 3",
     ylab = "Error", xlab = "Tiempo", col = "darkred")
abline(h = 0, col = "blue", lty = 2)

acf(resid_arima3, main = "ACF de los residuos - ARIMA3")

Box.test(resid_arima3, lag = 24, type = "Ljung-Box", fitdf = length(arima3$coef))
## 
##  Box-Ljung test
## 
## data:  resid_arima3
## X-squared = 15.545, df = 22, p-value = 0.8378

El diagnóstico de residuos del modelo ARIMA(0,1,2)ARIMA(0,1,2)ARIMA(0,1,2) evidencia que estos se distribuyen alrededor de cero sin tendencia aparente, cumpliendo con el supuesto de estacionariedad. La función de autocorrelación (ACF) de los residuos muestra que la mayoría de los coeficientes se encuentran dentro de las bandas de confianza, indicando ausencia de autocorrelaciones significativas. Finalmente, la prueba de Box–Ljung arrojó un valor p=0.8378p=0.8378p=0.8378, por lo cual no se rechaza la hipótesis nula de independencia.

En conjunto, estos resultados confirman que el modelo capta adecuadamente la dinámica del precio del Brent, dejando residuos que se comportan como ruido blanco. Por lo tanto, el ARIMA(0,1,2)ARIMA(0,1,2)ARIMA(0,1,2) es estadísticamente válido y se considera una opción sólida para el pronóstico de la serie.

# Timando el modelo Arima 3
plot(brent_ts)
lines(fitted(arima3),col=2)

Observamos que el modelo ARIMA(0,1,2) aplicado al precio del Brent presenta un buen poder de ajuste, ya que los valores estimados se superponen de manera cercana con los valores observados de la serie. Esto sugiere que la especificación seleccionada logra capturar adecuadamente la estructura temporal del precio del petróleo Brent, permitiendo que los residuos se comporten como ruido blanco y habilitando su uso confiable para la realización de pronósticos futuros.

acf(arima3$residuals)

pacf(arima3$residuals)

El análisis de las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF) de los residuos del modelo ARIMA(0,1,2) muestra que las correlaciones se encuentran dentro de las bandas de confianza, sin rezagos significativos. Este comportamiento indica que los residuos no presentan autocorrelación y pueden considerarse como ruido blanco.

En consecuencia, se confirma que el modelo capta adecuadamente la estructura temporal del precio del Brent y que los supuestos estadísticos de independencia de los residuos se cumplen, lo que valida su uso para pronósticos confiables

Mejor modelo

# Pronosticos futuros con nuestro modelo propuesto
p11 <- forecast(arima3, level = 95, h = 39)
plot(p11); lines(fitted(arima2), col = "red", lty = 2)

La línea negra (observada) y la línea roja (ajustada) muestran que el modelo ARIMA(0,1,2)[12]. El pronóstico obtenido con el modelo ARIMA(0,1,2) para el precio del Brent muestra una evolución estable en el corto plazo, con valores que se mantienen cercanos al nivel promedio observado al final de la muestra. El intervalo de confianza se amplía progresivamente, lo que refleja la creciente incertidumbre de las proyecciones en horizontes largos.

En términos prácticos, el modelo captura la dinámica temporal de los precios y permite realizar pronósticos confiables en el corto plazo, aunque debe considerarse que eventos exógenos (crisis financieras, shocks de oferta o conflictos geopolíticos) podrían generar desviaciones significativas respecto al escenario base proyectado.

La ecuación del mejor modelo es:

\[ SARIMA(0,1,2)(0,0,0)_{12} \] \[ (1 - B) X_t = \mu + \theta_1 B X_t + \theta_2 B^2 X_t + a_t \]

Variable Exógena

# Incluyendo la regresora exógena

bloomberg_ts <- ts(mensual_ult_dia$Bloomberg_Commodity_Index, start = c(start_year, start_month), frequency = 12)
arima3x<- Arima(brent_ts, order=c(0,1,2), xreg=bloomberg_ts, seasonal=list(order=c(0,0,0),period=12))

accuracy(arima3) 
##                    ME    RMSE      MAE         MPE     MAPE      MASE
## Training set 0.129074 6.03762 4.492164 -0.09994534 7.440053 0.2517424
##                      ACF1
## Training set -0.001971888
t<-data.frame(Arima3=as.vector(accuracy(arima3)), 
              Arima3x=as.vector(accuracy(arima3x)))
row.names(t)<-c("ME","RMSE","MAE","MPE","MAPE","MASE","ACF1")
t
##            Arima3      Arima3x
## ME    0.129074012  0.146212593
## RMSE  6.037620415  4.322514840
## MAE   4.492163996  3.224562553
## MPE  -0.099945343 -0.240276001
## MAPE  7.440052936  5.524787561
## MASE  0.251742369  0.180705561
## ACF1 -0.001971888  0.007458439

Al comparar el desempeño de los modelos ARIMA(0,1,2) y ARIMAX(0,1,2) con el índice Bloomberg como variable exógena, se observa que el modelo ARIMAX presenta una mejora significativa en las métricas de ajuste. El RMSE disminuye de 6.03 a 4.32, el MAE de 4.49 a 3.22, y el MAPE de 7.44% a 5.52%.

Además, ambos modelos generan residuos que se comportan como ruido blanco, lo cual valida su especificación. Sin embargo, la reducción de los errores intramuestrales demuestra que la inclusión del índice Bloomberg aporta información valiosa para explicar la dinámica del precio del Brent.

En conclusión, el modelo ARIMAX(0,1,2) constituye la mejor alternativa para el análisis y pronóstico del precio del Brent, al combinar parsimonia, validez estadística y mayor precisión predictiva.

# Pronosticos futuros con el modelo sarimax
#fcast_temp <- c(70.5, 66, 60.5, 45.5, 36, 28)
#fcast_cons_temp <- forecast(fit_cons_temp, xreg = fcast_temp, h = 6)
bloomberg <- ts(mensual_ult_dia$Bloomberg_Commodity_Index, start = c(2000, 1), frequency=12)
Pronosticox <- forecast(arima3x, h=38, xreg=bloomberg)
plot(Pronosticox, main = "Pronóstico ARIMAX con Bloomberg exógeno", ylab = "Precio Brent (USD/barril)", xlab = "Tiempo")
lines(fitted(arima3x), col = "red", lwd = 2)  # Ajuste del modelo en la muestra

La proyección del modelo ARIMAX(0,1,2), que incorpora al Bloomberg Commodity Index como variable exógena, muestra que el precio del Brent tendería a mantenerse en un rango relativamente estable en el largo plazo, aunque con oscilaciones moderadas. Los intervalos de confianza evidencian un aumento significativo de la incertidumbre conforme se amplía el horizonte de pronóstico, lo que limita la capacidad predictiva del modelo en plazos lejanos.

En conclusión, el modelo es útil para generar escenarios de corto y mediano plazo, pero para horizontes largos se recomienda complementarlo con otros enfoques que incorporen factores macroeconómicos y geopolíticos adicionales.

Partición de la muestra

# Dividir la muestra en 80% entrenamiento y 20% prueba de Brent
train_size <- floor(0.8 * length(brent_ts))  # 80% de los datos
train_brent <- window(brent_ts, end = c(2000, train_size))  # Datos de entrenamiento 
test_brent  <- window(brent_ts, start = c(2000, train_size + 1))  # Datos de prueba 

#Index Bloomberg
train_bloomberg  <- window(bloomberg_ts, end = c(2000, train_size))  # Datos de entrenamiento
test_bloomberg  <- window(bloomberg_ts, start = c(2000, train_size + 1))  # Datos de prueba 
# Ajuste del modelo ARIMA (sin exógena)
arima3 <- Arima(train_brent, order = c(0,1,2), seasonal = list(order = c(0,0,0), period = 12))
# Ajuste del modelo SARIMAX (con Bloomberg como exógena)
arima3x <- Arima(train_brent, order = c(0,1,2), seasonal = list(order = c(0,0,0), period = 12), xreg = train_bloomberg)
# Ver el resumen de los modelos ajustados
summary(arima3)
## Series: train_brent 
## ARIMA(0,1,2) 
## 
## Coefficients:
##          ma1     ma2
##       0.2796  0.0982
## s.e.  0.0651  0.0606
## 
## sigma^2 = 32.77:  log likelihood = -755.16
## AIC=1516.32   AICc=1516.42   BIC=1526.75
## 
## Training set error measures:
##                     ME     RMSE     MAE        MPE     MAPE     MASE
## Training set 0.1233455 5.688536 4.22335 0.02721618 6.982675 0.251472
##                      ACF1
## Training set -0.002044888
summary(arima3x)
## Series: train_brent 
## Regression with ARIMA(0,1,2) errors 
## 
## Coefficients:
##          ma1     ma2    xreg
##       0.2259  0.0144  0.6383
## s.e.  0.0709  0.0756  0.0394
## 
## sigma^2 = 14.97:  log likelihood = -661
## AIC=1330   AICc=1330.17   BIC=1343.91
## 
## Training set error measures:
##                     ME     RMSE      MAE         MPE     MAPE      MASE
## Training set 0.1675835 3.836489 2.919249 -0.05165704 5.046022 0.1738215
##                      ACF1
## Training set -0.002683198
Métrica ARIMA(0,1,2) ARIMAX(0,1,2) Mejor
RMSE 5.6886 3.8365 ARIMAX
MAE 4.2233 2.9192 ARIMAX
MAPE 6.98% 5.04% ARIMAX
MASE 0.2517 0.1738 ARIMAX
ACF1 -0.0020 -0.0027 Ambos ≈ 0
# Métricas dentro de la muestra (intra-muestra)
Metricas_Intramuestra <- data.frame(
  ARIMA = as.vector(accuracy(arima3)),
  SARIMAX = as.vector(accuracy(arima3x))
)
row.names(Metricas_Intramuestra) <- c("ME", "RMSE", "MAE", "MPE", "MAPE", "MASE", "ACF1")
Metricas_Intramuestra
##             ARIMA      SARIMAX
## ME    0.123345509  0.167583499
## RMSE  5.688536360  3.836488739
## MAE   4.223350369  2.919249007
## MPE   0.027216184 -0.051657041
## MAPE  6.982675011  5.046021726
## MASE  0.251471967  0.173821546
## ACF1 -0.002044888 -0.002683198

La comparación entre los modelos muestra que el ARIMAX(0,1,2) con el Bloomberg Commodity Index como variable exógena supera ampliamente al ARIMA(0,1,2). El modelo con exógeno logra un log likelihood mucho mayor (-661 vs -755), reduce de manera significativa los criterios AIC y BIC, y disminuye los errores de pronóstico intramuestral (RMSE pasa de 5.68 a 3.83; MAPE de 6.98% a 5.04%).

Además, el coeficiente de la variable Bloomberg es altamente significativo, confirmando que este índice explica gran parte de la variabilidad en los precios del Brent.

En conclusión, el ARIMAX(0,1,2) es el modelo más adecuado, ya que combina parsimonia, validez estadística y una clara mejora en la capacidad predictiva frente al modelo sin exógeno.

# Pronósticos fuera de la muestra (test set) para ambos modelos
forecast_arima3 <- forecast(arima3, h = length(test_brent))
forecast_arima3x <- forecast(arima3x, h = length(test_brent), xreg = test_bloomberg)
metricas_test <- data.frame(
  mape_arima3 = MAPE(test_brent, forecast_arima3$mean),
  mape_arima3x = MAPE(test_brent, forecast_arima3x$mean)
)
metricas_test
##   mape_arima3 mape_arima3x
## 1    0.282493    0.1148307

Al evaluar los pronósticos fuera de la muestra, se observa que el modelo ARIMA(0,1,2) obtiene un MAPE de 28.2%, mientras que el modelo ARIMAX(0,1,2) con el Bloomberg Commodity Index como variable exógena reduce este error a 11.5%.

Esta reducción en el error porcentual confirma que el índice Bloomberg aporta información valiosa y mejora sustancialmente la capacidad predictiva del modelo. En consecuencia, el ARIMAX no solo ajusta mejor la serie en el periodo de entrenamiento, sino que también ofrece pronósticos más confiables en el set de prueba, lo que lo convierte en la opción más adecuada para la modelación del precio del Brent.

# Cálculo de AIC y BIC para los modelos
AIC_arima3 <- AIC(arima3)
BIC_arima3 <- BIC(arima3)

AIC_arima3x <- AIC(arima3x)
BIC_arima3x <- BIC(arima3x)

# Crear un dataframe con los resultados
criterios_informacion <- data.frame(
  Modelo = c("ARIMA3", "SARIMAX"),
  AIC = c(AIC_arima3, AIC_arima3x),
  BIC = c(BIC_arima3, BIC_arima3x)
)

# Mostrar los criterios
criterios_informacion
##    Modelo      AIC      BIC
## 1  ARIMA3 1516.317 1526.747
## 2 SARIMAX 1330.000 1343.906

Al comparar los criterios de información, se observa que el modelo ARIMA(0,1,2) obtiene un AIC de 1516.3 y un BIC de 1526.7, mientras que el modelo ARIMAX(0,1,2) con el índice Bloomberg presenta valores considerablemente menores: AIC de 1330.0 y BIC de 1343.9.

La diferencia de más de 180 puntos en ambos indicadores evidencia que el ARIMAX es claramente superior, ya que logra un mejor equilibrio entre ajuste y parsimonia. En consecuencia, tanto por criterios de información como por desempeño predictivo, el ARIMAX se posiciona como el modelo más adecuado para la serie del precio del Brent.

# Función para validación cruzada 
cv_errors_noexo <- function(y, order, sorder, h = 1, initial = 120) {
  n <- length(y); e <- rep(NA, n)
  for (t in seq(from = initial, to = n - h)) {
    fit <- Arima(window(y, end = time(y)[t]), order = order, seasonal = list(order = sorder, period = 12))
    fc <- forecast(fit, h = h)
    e[t + h] <- y[t + h] - fc$mean[h]
  }
  e
}

cv_errors_exo <- function(y, x, order, sorder, h = 1, initial = 120) {
  n <- length(y); e <- rep(NA, n)
  for (t in seq(from = initial, to = n - h)) {
    fit <- Arima(window(y, end = time(y)[t]), order = order, seasonal = list(order = sorder, period = 12), xreg = as.numeric(window(x, end = time(x)[t])))
    x_future <- as.numeric(window(x, start = time(x)[t + 1], end = time(x)[t + h]))
    fc <- forecast(fit, h = h, xreg = x_future)
    e[t + h] <- y[t + h] - fc$mean[h]
  }
  e
}

# Validación cruzada (errores) para ambos modelos
e_arima_cv <- cv_errors_noexo(train_brent, c(1,1,1), c(0,0,1), h = 1, initial = 120)
e_sarimax_cv <- cv_errors_exo(train_brent, train_bloomberg, c(1,1,1), c(0,0,1), h = 1, initial = 120)

# Resumen de errores de validación cruzada
cv_summary <- data.frame(
  Modelo = c("ARIMA", "SARIMAX"),
  RMSE_CV = c(sqrt(mean(e_arima_cv^2, na.rm = TRUE)), sqrt(mean(e_sarimax_cv^2, na.rm = TRUE))),
  MAE_CV = c(mean(abs(e_arima_cv), na.rm = TRUE), mean(abs(e_sarimax_cv), na.rm = TRUE))
)
cv_summary
##    Modelo  RMSE_CV   MAE_CV
## 1   ARIMA 6.127182 4.719932
## 2 SARIMAX 4.276546 3.373598

Los resultados de la validación cruzada confirman la superioridad del modelo ARIMAX(0,1,2) frente al ARIMA(0,1,2). El error cuadrático medio (RMSE) disminuyó de 6.13 a 4.28, mientras que el error absoluto medio (MAE) pasó de 4.72 a 3.37.

Esto implica una reducción en los errores de predicción, lo que demuestra que la inclusión del índice Bloomberg como variable exógena aporta información valiosa y mejora la capacidad del modelo para generalizar en diferentes particiones de los datos. En consecuencia, el ARIMAX se consolida como la mejor alternativa para la modelación y el pronóstico del precio del Brent.

# Graficar los resultados para ARIMA3
plot(brent_ts, xlab = "Tiempo", ylab = "Precio Brent (USD/barril)", main = "Pronóstico ARIMA3 (in-sample y out-of-sample)") #revisar el valor del eje y
lines(fitted(arima3), col = "#FF2A00", lty = 2)  # Ajuste in-sample (rojo)
lines(forecast_arima3$mean, col = "darkblue")  # Pronóstico ARIMA2 (azul)
lines(forecast_arima3$lower[,1], col = "darkblue", lty = 3)  # IC 95% inferior
lines(forecast_arima3$upper[,1], col = "darkblue", lty = 3)  # IC 95% superior
legend("topright", legend = c("Observado", "Ajuste", "Pronóstico", "IC 95%"),
       col = c("black", "#FF2A00", "darkblue", "darkblue"), lty = c(1, 2, 1, 3))

El modelo ARIMA(0,1,2) presenta un buen ajuste in-sample, logrando reproducir de manera cercana la dinámica del precio del Brent. Sin embargo, al extrapolar fuera de la muestra, el modelo proyecta valores relativamente constantes y con intervalos de confianza que se expanden rápidamente, reflejando la incertidumbre creciente en horizontes largos.

Aunque el ARIMA constituye un punto de referencia sólido, se observa que tiende a subestimar la variabilidad real del mercado petrolero en el período de prueba, lo que limita su capacidad de capturar choques exógenos o volatilidad extrema.

# Graficar los resultados para SARIMAX
plot(brent_ts, xlab = "Tiempo", ylab = "Precio Brent (USD/barril)", main = "Pronóstico SARIMAX (in-sample y out-of-sample)")
lines(fitted(arima3x), col = "red", lty = 2)  
lines(forecast_arima3x$mean, col = "#00BB00")  
lines(forecast_arima3x$lower[,1], col = "#00BB00", lty = 3)  
lines(forecast_arima3x$upper[,1], col = "#00BB00", lty = 3)  
legend("topright", legend = c("Observado", "Ajuste", "Pronóstico", "IC 95%"),
       col = c("black", "red", "#00BB00", "#00BB00"), lty = c(1, 2, 1, 3))

El modelo SARIMAX(0,1,2), que incluye al Bloomberg Commodity Index como variable exógena, mejora de manera significativa el desempeño respecto al ARIMA base. Mientras que el ARIMA proyectaba un valor casi constante, el SARIMAX logra pronósticos más dinámicos, coherentes con la evolución real de los precios del Brent.

Además, los intervalos de confianza son relativamente más estrechos, lo que refleja una mayor precisión en los pronósticos. En el período de prueba (2020–2025), el SARIMAX logra capturar de mejor forma la variabilidad del mercado, reduciendo de manera sustancial los errores de predicción.

En conclusión, la inclusión de una variable exógena relevante como el Bloomberg Commodity Index permite obtener pronósticos más realistas y confiables del precio del Brent, confirmando la superioridad del SARIMAX frente al ARIMA tradicional.

A continuación, se detalla las gráficas de SARIMA y SARIMAX fuera de la muestra, para ver con más detalle:

# Pronóstico fuera de muestra para ARIMA3
plot(test_brent, xlab = "Tiempo", ylab = "Precio Brent (USD/barril)", main = "Pronóstico ARIMA3 (out-of-sample)")
lines(forecast_arima3$mean, col = "darkblue")  
lines(forecast_arima3$lower[,1], col = "darkblue", lty = 3) 
lines(forecast_arima3$upper[,1], col = "darkblue", lty = 3)  
legend("topright", legend = c("Observado", "Pronóstico", "IC 95%"),
       col = c("black", "darkblue", "darkblue"), lty = c(1, 1, 3))

# Pronóstico fuera de muestra para SARIMAX
plot(test_brent, xlab = "Tiempo", ylab = "Precio Brent (USD/barril)", main = "Pronóstico SARIMAX (out-of-sample)")
lines(forecast_arima3x$mean, col = "#00BB00") 
lines(forecast_arima3x$lower[,1], col = "#00BB00", lty = 3)  
lines(forecast_arima3x$upper[,1], col = "#00BB00", lty = 3)  
legend("topright", legend = c("Observado", "Pronóstico", "IC 95%"),
       col = c("black", "#00BB00", "#00BB00"), lty = c(1, 1, 3))

El análisis de la serie mensual del precio del Brent entre 2000 y 2025 confirma la naturaleza no estacionaria y altamente volátil de los precios internacionales del crudo, caracterizados por fuertes choques exógenos (crisis financiera de 2008, pandemia de COVID-19 en 2020 y conflicto Rusia–Ucrania en 2022). A través de la metodología Box–Jenkins se estableció que una diferenciación ordinaria (d=1) es suficiente para alcanzar estacionariedad, lo que permitió ajustar y comparar modelos ARIMA y SARIMAX.

Los resultados muestran que el modelo ARIMA(0,1,2) ofrece un ajuste estadísticamente válido, con residuos que se comportan como ruido blanco y métricas intramuestrales satisfactorias. Sin embargo, al incluir el Bloomberg Commodity Index como variable exógena en un modelo ARIMAX(0,1,2), el desempeño mejora significativamente: los criterios de información (AIC y BIC) disminuyen de forma notable, los errores intramuestrales y de validación cruzada se reducen, y el error fuera de muestra (MAPE) baja de 28.2% a 11.5%.

Esto evidencia que la inclusión de información exógena relevante permite capturar de mejor manera la dinámica del precio del Brent, generando pronósticos más realistas y robustos. Mientras que el ARIMA proyecta trayectorias relativamente planas y con amplios intervalos de confianza, el SARIMAX logra representar de forma más dinámica la evolución de los precios, con mayor precisión y menor incertidumbre.

En síntesis, el SARIMAX(0,1,2) con el Bloomberg Commodity Index como variable exógena constituye la mejor alternativa para modelar y pronosticar el precio del Brent, al combinar parsimonia, validez estadística y superior capacidad predictiva. No obstante, dado el carácter estructuralmente volátil del mercado petrolero, se recomienda complementar este enfoque con modelos que integren factores macroeconómicos y geopolíticos para escenarios de largo plazo.