library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(forecast)
library(tseries)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.1
library(fGarch)
## NOTE: Packages 'fBasics', 'timeDate', and 'timeSeries' are no longer
## attached to the search() path when 'fGarch' is attached.
##
## If needed attach them yourself in your R script by e.g.,
## require("timeSeries")
##
## Attaching package: 'fGarch'
## The following object is masked from 'package:TTR':
##
## volatility
library(seasonal)
## Warning in system(paste(x13.bin, file.path(tdir, "Testairline")), intern =
## TRUE, : running command
## '/Library/Frameworks/R.framework/Versions/4.5-x86_64/Resources/library/x13binary/bin/x13ashtml
## /var/folders/54/k4gsycpd4m15vtqtxq65t9780000gp/T//Rtmpi3xvx0/x13binary__f3c79e93089__dir/Testairline
## 2>/dev/null' had status 134
## The binaries provided by 'x13binary' do not work on this
## machine. To get more information, run:
## x13binary::checkX13binary()
##
## You can set 'X13_PATH' manually if you intend to use your own
## binaries. See ?seasonal for details.
library(dplyr)
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
##
## first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data("AirPassengers")
ap <- AirPassengers
ap_1950_1960 <- window(ap, start = c(1950, 1), end = c(1960, 12))
La serie de pasajeros aéreos desde 1950 hasta 1960 muestra un patrón claro de crecimiento constante a lo largo del tiempo. Se observa una tendencia creciente pronunciada, donde el número de pasajeros incrementa consistentemente año tras año.
# Gráfico de la serie original
plot(ap_1950_1960, main = "Pasajeros Aéreos (1950-1960)",
ylab = "Miles de Pasajeros", col = "blue", lwd = 2)
##Componentes Identificados
# Descomposición estacional
decompose_ap <- decompose(ap_1950_1960)
plot(decompose_ap)
Tendencia: Creciente y constante, mostrando el aumento sostenido de pasajeros
Estacionalidad: Patrón anual bien definido con picos regulares
Componente Aleatorio: Variaciones no explicadas por tendencia o estacionalidad
##Estadisticas descriptivas
# Resumen estadístico
summary(ap_1950_1960)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 114.0 196.0 275.5 294.3 363.2 622.0
sd(ap_1950_1960)
## [1] 115.4808
##Prueba estacionariedad
# Prueba de estacionariedad
adf.test(ap_1950_1960)
## Warning in adf.test(ap_1950_1960): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ap_1950_1960
## Dickey-Fuller = -7.4186, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
##Resultado:
p-value < 0.05 La serie original no es estacionaria, confirmando la necesidad de transformaciones para el modelado.
##Funciones de Autocorrelación
# Gráficos ACF/PACF
acf(ap_1950_1960, main = "Función de Autocorrelación (ACF)")
pacf(ap_1950_1960, main = "Función de Autocorrelación Parcial (PACF)")
ACF: Decae lentamente, indicando no estacionariedad
PACF: Un pico significativo en el primer lag, luego se corta
Ambos patrones confirman la necesidad de un modelo que maneje tendencia y estacionalidad
# Identificación del modelo
modelo_auto <- auto.arima(ap_1950_1960, seasonal = TRUE,
stepwise = FALSE, approximation = FALSE)
# Modelo optimizado (el que pasó las pruebas)
modelo_final <- auto.arima(ap_1950_1960, seasonal = TRUE,
stepwise = FALSE, approximation = FALSE)
# Mostrar modelo final
modelo_final
## Series: ap_1950_1960
## ARIMA(1,1,3)(1,1,0)[12]
##
## Coefficients:
## ar1 ma1 ma2 ma3 sar1
## 0.7533 -1.1318 0.3163 -0.1734 -0.1194
## s.e. 0.1348 0.1757 0.1292 0.1294 0.1042
##
## sigma^2 = 138.1: log likelihood = -460.64
## AIC=933.27 AICc=934.02 BIC=949.95
Modelo Seleccionado SARIMA(1,1,3)(1,1,0)[12]
La serie presenta una tendencia creciente constante
Se aplica una diferenciación regular (d=1) para eliminar la tendencia
Esto transforma la serie en estacionaria en media
La serie muestra un patrón estacional anual claro
Se aplica una diferenciación estacional (D=1) con periodo m=12
Esto elimina la estacionalidad de la serie
AR(1): Captura la dependencia del valor actual con el valor inmediatamente anterior
MA(3): Modela la dependencia con los errores de los tres periodos anteriores
Esta combinación captura la estructura temporal compleja de la serie
SAR(1): Modela la dependencia estacional con el mismo mes del año anterior
Captura el patrón repetitivo anual observado en la serie
El modelo fue seleccionado automáticamente mediante auto.arima
Presenta el menor criterio de información (AIC = 933.27)
Optimiza el balance entre bondad de ajuste y parsimonia
##Formula del modelo
-\(\phi_1(B) = 1 - 0.7533B\) (AR
regular) - \(\theta_3(B) = 1 - 1.1318B +
0.3163B^2 - 0.1734B^3\) (MA regular)
- \(\Phi_1(B^{12}) = 1 + 0.1194B^{12}\)
(AR estacional) - \(\varepsilon_t \sim WN(0,
138.1)\) (ruido blanco)
Parámetros estimados:
\(\phi_1 = 0.7533\)
\(\theta_1 = -1.1318\), \(\theta_2 = 0.3163\), \(\theta_3 = -0.1734\)
\(\Phi_1 = -0.1194\)
\(\sigma^2 = 138.1\)
El modelo para \(W_t\) es:
\[W_t = 0.7533W_{t-1} - 0.1194W_{t-12} + 0.0900W_{t-13} + \varepsilon_t - 1.1318\varepsilon_{t-1} + 0.3163\varepsilon_{t-2} - 0.1734\varepsilon_{t-3}\]
Ecuación final de la serie original:
\[X_t = 1.7533X_{t-1} - 0.7533X_{t-2} + 0.8806X_{t-12} - 1.7533X_{t-13} + 0.7533X_{t-14} - 0.0900X_{t-24} + 0.7533X_{t-25} - 0.0900X_{t-26} + \varepsilon_t - 1.1318\varepsilon_{t-1} + 0.3163\varepsilon_{t-2} - 0.1734\varepsilon_{t-3}\]
Donde \(0.0900 = 0.7533 \times 0.1194\) (interacción AR regular × AR estacional)
##Análisis de Residuos
# Diagnóstico de residuos
checkresiduals(modelo_final)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,3)(1,1,0)[12]
## Q* = 31.652, df = 19, p-value = 0.03419
##
## Model df: 5. Total lags used: 24
Los residuos fluctúan alrededor de cero sin patrones evidentes
No se observan tendencias ni heterocedasticidad evidente
La varianza parece constante a lo largo del tiempo
Todas las autocorrelaciones caen dentro de los límites de significancia
No hay correlaciones significativas en los residuos
Indica que el modelo capturó adecuadamente la estructura temporal
Los residuos siguen aproximadamente una distribución normal
El QQ-plot muestra una línea relativamente recta
Se cumple el supuesto de normalidad de manera aproximada
##Prueba Formal de Ruido Blanco
# Prueba de Ljung-Box formal
Box.test(residuals(modelo_final), lag = 24, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(modelo_final)
## X-squared = 31.652, df = 24, p-value = 0.1359
# Métricas de precisión
accuracy(modelo_final)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.8026392 10.92117 7.847147 0.04339757 2.621189 0.2312519
## ACF1
## Training set -0.01766538
Resultado:
p-value = 0.136 por lo cual no se rechaza la hipótesis nula de que los residuos son ruido blanco. Los residuos no presentan autocorrelación significativa, validando el modelo.
El modelo muestra excelente capacidad predictiva con un error porcentual medio del 2.62%.
##Grafico del pronostico
# Pronóstico
pronostico <- forecast(modelo_final, h = 5)
# Gráfico del pronóstico
plot(pronostico,
main = "Pronóstico 5 Periodos - AirPassengers",
xlab = "Año",
ylab = "Miles de Pasajeros")
La línea azul representa el pronóstico puntual
Las áreas sombreadas muestran los intervalos de confianza del 80% y 95%
Los intervalos se ensanchan hacia el futuro, reflejando mayor incertidumbre
##Valores del Pronóstico
# Mostrar valores del pronóstico
pronostico
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 1961 443.7151 428.6428 458.7874 420.6640 466.7662
## Feb 1961 419.0000 401.2417 436.7584 391.8410 446.1591
## Mar 1961 452.4196 432.1004 472.7388 421.3441 483.4951
## Apr 1961 489.0546 467.3505 510.7586 455.8611 522.2481
## May 1961 502.2429 479.7418 524.7439 467.8305 536.6553
# Tabla formateada del pronóstico
data.frame(
Periodo = c("Ene 1961", "Feb 1961", "Mar 1961", "Abr 1961", "May 1961"),
Pronostico = round(pronostico$mean, 1),
Limite_Inferior = round(pronostico$lower[,2], 1),
Limite_Superior = round(pronostico$upper[,2], 1)
)
## Periodo Pronostico Limite_Inferior Limite_Superior
## 1 Ene 1961 443.7 420.7 466.8
## 2 Feb 1961 419.0 391.8 446.2
## 3 Mar 1961 452.4 421.3 483.5
## 4 Abr 1961 489.1 455.9 522.2
## 5 May 1961 502.2 467.8 536.7
Estacionalidad Mantenida:
Se observa el patrón estacional típico: valores más bajos en febrero y altos en verano
El modelo captura adecuadamente la estacionalidad anual
Los pronósticos siguen la tendencia histórica de crecimiento
Incertidumbre del Pronóstico:
Los intervalos de confianza son razonables para un horizonte de 5 periodos
La amplitud de los intervalos aumenta con el tiempo, como es esperado
El modelo proporciona estimaciones confiables para planificación a corto plazo
El modelo SARIMA(1,1,3)(1,1,0)[12] demuestra ser adecuado para la serie AirPassengers, capturando efectivamente la tendencia creciente, estacionalidad anual y estructura temporal. La validación mediante pruebas de residuos confirma que el modelo cumple con los supuestos estadísticos necesarios, proporcionando pronósticos confiables para los próximos 5 periodos.
# Descargar datos de Toyota
getSymbols("TM", from = "2014-01-01", to = "2025-10-31")
## [1] "TM"
# Verificar qué datos tenemos
head(TM)
## TM.Open TM.High TM.Low TM.Close TM.Volume TM.Adjusted
## 2014-01-02 121.60 121.60 120.10 120.63 239400 86.97971
## 2014-01-03 121.00 121.29 119.87 120.51 530500 86.89322
## 2014-01-06 120.88 120.98 120.00 120.17 441100 86.64806
## 2014-01-07 120.39 120.59 119.99 120.46 306200 86.85715
## 2014-01-08 120.18 120.18 119.65 119.85 349400 86.41731
## 2014-01-09 120.33 120.50 119.59 120.33 338500 86.76341
tail(TM)
## TM.Open TM.High TM.Low TM.Close TM.Volume TM.Adjusted
## 2025-10-23 202.73 204.12 202.73 204.06 299900 204.06
## 2025-10-24 205.19 205.80 204.89 205.37 230600 205.37
## 2025-10-27 209.76 209.99 208.96 209.22 324600 209.22
## 2025-10-28 209.33 211.24 208.85 211.24 244200 211.24
## 2025-10-29 207.03 208.00 206.37 207.09 412200 207.09
## 2025-10-30 207.28 208.73 207.12 207.21 181900 207.21
# Extraer precio de cierre (usaremos este)
tm_close <- TM$TM.Close
# Gráfico de precios originales
plot(tm_close, main = "Precio de Acción Toyota (TM) 2014-2025",
col = "red", lwd = 1)
La serie de precios de Toyota muestra el comportamiento típico de una
acción financiera, caracterizado por ausencia de tendencia direccional
clara, alta variabilidad y movimientos erráticos, con posibles periodos
de alta y baja volatilidad.
##Analisis de retornos
# Calcular retornos logarítmicos
retornos_tm <- diff(log(tm_close))
retornos_tm <- na.omit(retornos_tm)
# Gráfico de retornos
plot(retornos_tm, main = "Retornos Logarítmicos Toyota", col = "green", lwd = 1)
abline(h = 0, col = "red", lty = 2)
Los retornos logarítmicos presentan fluctuaciones alrededor de cero,
como es esperado en mercados eficientes, con periodos de calma seguidos
de alta volatilidad (clusters) y distribución aproximadamente
simétrica.
adf.test(tm_close)
##
## Augmented Dickey-Fuller Test
##
## data: tm_close
## Dickey-Fuller = -2.8707, Lag order = 14, p-value = 0.2097
## alternative hypothesis: stationary
adf.test(retornos_tm)
## Warning in adf.test(retornos_tm): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: retornos_tm
## Dickey-Fuller = -15.867, Lag order = 14, p-value = 0.01
## alternative hypothesis: stationary
Precios: p-value = 0.2097 > 0.05 → Lo que indica que los precios son no estacionarios
Retornos: p-value = 0.01 < 0.05 → Lo que indica que los retornos son estacionarios
summary(retornos_tm)
## Index TM.Close
## Min. :2014-01-03 Min. :-0.0901926
## 1st Qu.:2016-12-14 1st Qu.:-0.0073072
## Median :2019-11-29 Median : 0.0004019
## Mean :2019-11-30 Mean : 0.0001819
## 3rd Qu.:2022-11-10 3rd Qu.: 0.0077033
## Max. :2025-10-30 Max. : 0.1278827
sd(retornos_tm)
## [1] 0.01428901
# ACF de retornos normales
acf(retornos_tm, main = "ACF - Retornos Toyota")
# ACF de retornos al cuadrado (VOLATILIDAD)
acf(retornos_tm^2, main = "ACF - Retornos² (Volatilidad)")
El ACF de retornos al cuadrado muestra valores significativos (0.141, 0.103, 0.126, 0.091, 0.067) indicando clusters de volatilidad donde periodos de alta y baja volatilidad se agrupan.
# Verificar numéricamente clusters de volatilidad
acf_cuadrados <- acf(retornos_tm^2, plot = FALSE)$acf[2:6]
cat("ACF de retornos^2 (lags 1-5):", round(acf_cuadrados, 3), "\n")
## ACF de retornos^2 (lags 1-5): 0.141 0.103 0.126 0.091 0.067
if(any(abs(acf_cuadrados) > 0.1)) {
cat("✅ HAY CLUSTERS DE VOLATILIDAD - Necesita modelo GARCH\n")
} else {
cat("❌ NO hay clusters significativos - Solo ARIMA\n")
}
## ✅ HAY CLUSTERS DE VOLATILIDAD - Necesita modelo GARCH
Modelo Seleccionado: GARCH(1,1)
##Justificación:
Los retornos no muestran dependencia en media (ARIMA 0,0,0) - comportamiento de ruido blanco
Evidencia de clusters de volatilidad (ACF retornos² > 0.1 en lags iniciales)
Estructura GARCH(1,1) con alta persistencia (α1 + β1 ≈ 0.9966)
Coeficientes: α1 = 0.0408 (impacto de shocks), β1 = 0.9558 (persistencia)
##GARCH para los retornos
modelo_garch_tm <- garchFit(~ garch(1, 1), data = retornos_tm, trace = FALSE)
# Verificar residuos del GARCH
residuos_est <- residuals(modelo_garch_tm, standardize = TRUE)
# Gráficos de diagnóstico
acf(residuos_est, main = "ACF Residuos Estandarizados")
pacf(residuos_est, main = "PACF Residuos Estandarizados")
qqnorm(residuos_est, main = "QQ-Plot Residuos")
qqline(residuos_est)
hist(residuos_est, main = "Histograma Residuos", breaks = 30)
# Prueba Ljung-Box para residuos estandarizados
lb_test <- Box.test(residuos_est, lag = 10, type = "Ljung-Box")
lb_test
##
## Box-Ljung test
##
## data: residuos_est
## X-squared = 6.3005, df = 10, p-value = 0.7894
if(lb_test$p.value > 0.05) {
cat("✅ Residuos son ruido blanco - Modelo adecuado\n")
} else {
cat("❌ Residuos NO son ruido blanco\n")
}
## ✅ Residuos son ruido blanco - Modelo adecuado
# Mostrar resumen del modelo GARCH
print(summary(modelo_garch_tm))
##
## Title:
## GARCH Modelling
##
## Call:
## garchFit(formula = ~garch(1, 1), data = retornos_tm, trace = FALSE)
##
## Mean and Variance Equation:
## data ~ garch(1, 1)
## <environment: 0x7f802f3aafb8>
## [data = retornos_tm]
##
## Conditional Distribution:
## norm
##
## Coefficient(s):
## mu omega alpha1 beta1
## 3.8003e-04 1.0608e-06 4.0813e-02 9.5584e-01
##
## Std. Errors:
## based on Hessian
##
## Error Analysis:
## Estimate Std. Error t value Pr(>|t|)
## mu 3.800e-04 2.238e-04 1.698 0.08947 .
## omega 1.061e-06 3.763e-07 2.819 0.00481 **
## alpha1 4.081e-02 5.215e-03 7.826 5.11e-15 ***
## beta1 9.558e-01 5.463e-03 174.959 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log Likelihood:
## 8612.646 normalized: 2.895007
##
## Description:
## Wed Nov 19 01:29:06 2025 by user:
##
##
## Standardised Residuals Tests:
## Statistic p-Value
## Jarque-Bera Test R Chi^2 2247.7404038 0.0000000
## Shapiro-Wilk Test R W 0.9663153 0.0000000
## Ljung-Box Test R Q(10) 6.3004970 0.7894166
## Ljung-Box Test R Q(15) 8.9062719 0.8823670
## Ljung-Box Test R Q(20) 18.4501155 0.5577831
## Ljung-Box Test R^2 Q(10) 10.6595514 0.3846497
## Ljung-Box Test R^2 Q(15) 14.3474317 0.4993590
## Ljung-Box Test R^2 Q(20) 17.0818219 0.6476544
## LM Arch Test R TR^2 10.5175262 0.5706548
##
## Information Criterion Statistics:
## AIC BIC SIC HQIC
## -5.787325 -5.779261 -5.787329 -5.784423
##
##
## Title:
## GARCH Modelling
##
## Call:
## garchFit(formula = ~garch(1, 1), data = retornos_tm, trace = FALSE)
##
## Mean and Variance Equation:
## data ~ garch(1, 1)
## <environment: 0x7f802f3aafb8>
## [data = retornos_tm]
##
## Conditional Distribution:
## norm
##
## Coefficient(s):
## mu omega alpha1 beta1
## 3.8003e-04 1.0608e-06 4.0813e-02 9.5584e-01
##
## Std. Errors:
## based on Hessian
##
## Error Analysis:
## Estimate Std. Error t value Pr(>|t|)
## mu 3.800e-04 2.238e-04 1.698 0.08947 .
## omega 1.061e-06 3.763e-07 2.819 0.00481 **
## alpha1 4.081e-02 5.215e-03 7.826 5.11e-15 ***
## beta1 9.558e-01 5.463e-03 174.959 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log Likelihood:
## 8612.646 normalized: 2.895007
##
## Description:
## Wed Nov 19 01:29:06 2025 by user:
##
##
## Standardised Residuals Tests:
## Statistic p-Value
## Jarque-Bera Test R Chi^2 2247.7404038 0.0000000
## Shapiro-Wilk Test R W 0.9663153 0.0000000
## Ljung-Box Test R Q(10) 6.3004970 0.7894166
## Ljung-Box Test R Q(15) 8.9062719 0.8823670
## Ljung-Box Test R Q(20) 18.4501155 0.5577831
## Ljung-Box Test R^2 Q(10) 10.6595514 0.3846497
## Ljung-Box Test R^2 Q(15) 14.3474317 0.4993590
## Ljung-Box Test R^2 Q(20) 17.0818219 0.6476544
## LM Arch Test R TR^2 10.5175262 0.5706548
##
## Information Criterion Statistics:
## AIC BIC SIC HQIC
## -5.787325 -5.779261 -5.787329 -5.784423
Residuos estandarizados son ruido blanco (Ljung-Box p-value = 0.789 > 0.05)
ACF/PACF sin patrones significativos
QQ-plot muestra ajuste razonable a la normal
Todos los coeficientes GARCH son estadísticamente significativos
No hay efectos ARCH residuales (LM Arch Test p-value = 0.571)
##Formula del modelo
#ecuacion de media
rₜ = 0.00038 + εₜ
#ecuacion de varianza (volatilidad)
σₜ² = 0.000001061 + 0.04081εₜ₋₁² + 0.9558σₜ₋₁²
# Pronóstico de volatilidad con GARCH
pronostico_vol <- predict(modelo_garch_tm, n.ahead = 5)
print(pronostico_vol)
## meanForecast meanError standardDeviation
## 1 0.0003800339 0.01556835 0.01556835
## 2 0.0003800339 0.01557636 0.01557636
## 3 0.0003800339 0.01558434 0.01558434
## 4 0.0003800339 0.01559230 0.01559230
## 5 0.0003800339 0.01560022 0.01560022
# Gráfico del pronóstico de volatilidad
plot(pronostico_vol, main = "Pronóstico de Volatilidad Toyota - 5 Periodos")
# Pronóstico de precios (usando retornos esperados ≈ 0)
ultimo_precio <- as.numeric(tail(tm_close, 1))
cat("Último precio disponible:", ultimo_precio, "(2025-10-30)\n")
## Último precio disponible: 207.21 (2025-10-30)
# Como los retornos son ruido blanco (media ≈ 0), proyectamos precio constante
# pero con intervalos de volatilidad
pronostico_precios <- rep(ultimo_precio, 5)
cat("\n=== PRONÓSTICO PRECIOS TOYOTA ===\n")
##
## === PRONÓSTICO PRECIOS TOYOTA ===
for(i in 1:5) {
volatilidad <- pronostico_vol$standardDeviation[i]
limite_inf <- ultimo_precio * exp(-1.96 * volatilidad)
limite_sup <- ultimo_precio * exp(1.96 * volatilidad)
cat("Periodo", i, ": $", round(pronostico_precios[i], 2),
" [", round(limite_inf, 2), " - ", round(limite_sup, 2), "]\n", sep = "")
}
## Periodo1: $207.21 [200.98 - 213.63]
## Periodo2: $207.21 [200.98 - 213.63]
## Periodo3: $207.21 [200.98 - 213.64]
## Periodo4: $207.21 [200.97 - 213.64]
## Periodo5: $207.21 [200.97 - 213.64]
# Gráfico final del pronóstico
fechas_futuras <- seq(as.Date("2025-11-01"), by = "day", length.out = 5)
plot(fechas_futuras, pronostico_precios, type = "l", col = "blue", lwd = 2,
main = "Pronóstico de Precios Toyota - 5 Periodos",
xlab = "Fecha", ylab = "Precio", ylim = c(180, 220))
Precio constante refleja expectativa de retorno cero (mercado eficiente) con intervalos que capturan la incertidumbre por volatilidad.
El modelo GARCH resultó apropiado para series financieras donde la volatilidad es el principal componente a modelar. La alta persistencia en volatilidad (α1 + β1 ≈ 0.9966) es característica de mercados financieros y el modelo proporciona herramientas valiosas para la gestión de riesgo y cálculo de Value at Risk (VaR). Los residuos cumplen con los supuestos de ruido blanco,validando la adecuación del modelo seleccionado.