Tercer Exámen Series de Tiempo
Parte Práctica
Reglas: Deben responder en este cuaderno en los espacios dispuestos para ello. Deben entregar el archivo .RMD y el HTML compilado (knit)
En la carpeta encontraran la serie de la paridad Libra Esterlina - Dólar Estadounidense. Sobre esta serie deben responder cada una de las preguntas. Solo pueden tener un código de apoyo elaborado por cada uno. Este no debe contener conceptos teóricos en sus comentarios.
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(xts)
## Warning: package 'xts' was built under R version 4.4.3
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.4.3
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## ######################### 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. #
## # #
## ###############################################################################
##
## Adjuntando el paquete: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
library(lubridate)
##
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(forecast)
## Warning: package 'forecast' was built under R version 4.4.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tseries)
## Warning: package 'tseries' was built under R version 4.4.3
library(strucchange)
## Warning: package 'strucchange' was built under R version 4.4.3
## Cargando paquete requerido: sandwich
## Warning: package 'sandwich' was built under R version 4.4.3
Pregunta 1: ¿Qué transformaciones requiere esta serie para que quede en retornos? En caso de necesitar transformaciones debe realizarlas. Graficar la serie original y la serie bajo transformaciones.
Respuesta: (Escriba acá su respuesta)
#Acá vamos a plotear la serie de tiempo sin ninguna transformación
na_count <- sapply(data, function(x) sum(is.na(x)))
print(na_count)
## Date Close
## 0 0
xts_serie <- xts(data$Close, order.by = data$Date)
plot(xts_serie)
#Logaritmos diarios para retornos logarítmicos
log_serie <- log(xts_serie)
# Graficar los retornos logarítmicos
plot(log_serie, main = "Retornos Logarítmicos Diarios", ylab = "Retorno", xlab = "Fecha")
pacf(log_serie, main = "Autocorrelación Parcial de los Retornos Logarítmicos")
acf(log_serie, main = "Autocorrelación de los Retornos Logarítmicos")
#Vamos a diferenciar
# Calcular los retornos logarítmicos diarios
retornos_log <- diff(log(xts_serie))
retornos_log <- retornos_log[-c(1),]
## Escriba su código en este espacio
# Graficar los retornos logarítmicos
plot(retornos_log, main = "Retornos Logarítmicos Diarios", ylab = "Retorno", xlab = "Fecha")
pacf(retornos_log, main = "Autocorrelación Parcial de los Retornos Logarítmicos")
acf(retornos_log, main = "Autocorrelación de los Retornos Logarítmicos")
Ya todo esta más cerca de las bandas de confianza. Vamos a hacer un test
para saber si ya es estacionario
adf.test(retornos_log)
## Warning in adf.test(retornos_log): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: retornos_log
## Dickey-Fuller = -8.9992, Lag order = 9, p-value = 0.01
## alternative hypothesis: stationary
No hay suficiente evidencia para rechazar la hipótesis nula de estacionariedad.
Pregunta 2: ¿Considera necesario estimar un modelo para la media de los retornos? Motive su respuesta con análisis precisos (Evite usar auto.arima solamente) Respuesta: Yo no veo ningun punto de corte en la PACF y tampoco en el ACF en alguno de los lags para justificar algun modelo para la media ni para el AR.Deespués lo confirmamos con el uso del autoarima que manda (0,0,0)
modelo_arma <- auto.arima(retornos_log)
# Resumen del modelo estimado
summary(modelo_arma)
## Series: retornos_log
## ARIMA(0,0,0) with zero mean
##
## sigma^2 = 3.324e-05: log likelihood = 3239.98
## AIC=-6477.96 AICc=-6477.96 BIC=-6473.2
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -1.204968e-05 0.005765049 0.004187308 100 100 0.7128824
## ACF1
## Training set 0.03523488
Pregunta 3: Verificar la estabilidad de la serie en retornos o la estabilidad de parámetros en caso que hayan encontrado un modelo para la media de los retornos (residuales del modelo de la media).
Respuesta: (Escriba acá su respuesta)
set.seed(123)
residuos <- residuals(modelo_arma)
n <- length(residuos)
d <- 0
# Cálculo de residuos centrados y desviación estándar
v_hat <- residuos - mean(residuos)
sigma_hat <- sd(v_hat)
# CUSUM acumulado
cusum <- cumsum(v_hat) / sigma_hat
# Construcción de bandas tipo Harvey
a <- 0.948 # Valor crítico para 5%
t <- (d + 1):n
T_ <- n
harvey_upper <- a * sqrt(T_ - d) + 2 * a * (t - d) / sqrt(T_ - d)
harvey_lower <- -harvey_upper
# Gráfico de CUSUM con bandas tipo Harvey
plot(t, cusum[t], type = "l", col = "blue", ylim = range(c(harvey_upper, harvey_lower, cusum)),
xlab = "Tiempo", ylab = "CUSUM", main = "CUSUM con Bandas tipo Harvey (1989)")
lines(t, harvey_upper, col = "red", lty = 2)
lines(t, harvey_lower, col = "red", lty = 2)
abline(h = 0, col = "black")
legend("topright", legend = c("CUSUM", "Bandas 5%"), col = c("blue", "red"), lty = c(1, 2))
Los parámetros no se salen de las bandas de confianza. Se ven
estables.
Pregunta 4. Probar si esta serie de retornos (residuales) muestra heterocedasticidad en su varianza
library (FinTS)
## Warning: package 'FinTS' was built under R version 4.4.3
##
## Adjuntando el paquete: 'FinTS'
## The following object is masked from 'package:forecast':
##
## Acf
ArchTest(residuos, lags = 10)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: residuos
## Chi-squared = 114.12, df = 10, p-value < 2.2e-16
Si hay efectos de la varianza que no se logran modelar con el modelo. Porque, rechazamos la hipótesis nula. Probemso con los residuos estandarizados al cuadrado-segundo momento
residest <- residuals(modelo_arma, standardize = TRUE)
resid_sq <- residest^2
# Graficar FAC (ACF) de residuos al cuadrado
acf(resid_sq, main = "FAC de los residuos estandarizados al cuadrado")
# Graficar PACF de residuos al cuadrado
pacf(resid_sq, main = "PACF de los residuos estandarizados al cuadrado")
#Prueba heterocedasticidad
Box.test(resid_sq, lag = 10, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: resid_sq
## X-squared = 237.43, df = 10, p-value < 2.2e-16
Las dos pruebas aplicadas concuerdan en que el modelo no calcula bien
la varianza. Además, los gráficos de la ACF del modelo lo
confirma.
Por tanto debemos proceder a buscar un modelo más adecuado que calcule
esta varianza de forma condicional.
Pregunta 5. Encuentre el mejor modelo para la varianza condicional. ¿Presenta este modelo asimetría? ## Probamos GARCH
#Tenemos GARCH
library(rugarch)
## Warning: package 'rugarch' was built under R version 4.4.3
## Cargando paquete requerido: parallel
##
## Adjuntando el paquete: 'rugarch'
## The following object is masked from 'package:stats':
##
## sigma
dist_models <- c("norm", "std", "ged", "snorm", "sstd", "sged")
# Inicializar tabla de resultados
resultados <- data.frame(p = integer(),
q = integer(),
distribucion = character(),
AIC = numeric(),
stringsAsFactors = FALSE)
# Grid search para modelos GARCH(p,q) con distribuciones
for (dist in dist_models) {
for (p in 1:6) {
for (q in 0:6) {
#cat("Probando GARCH(", p, ",", q, ") con dist:", dist, "...\n")
spec <- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(p, q)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = dist
)
tryCatch({
fit <- ugarchfit(spec = spec, data = retornos_log, solver = "hybrid")
aic_val <- infocriteria(fit)[1] # Extrae AIC
resultados <- rbind(resultados,
data.frame(p = p, q = q, distribucion = dist, AIC = aic_val))
cat(" AIC =", aic_val, "\n")
}, error = function(e) {
cat("Error en GARCH(", p, ",", q, "), dist:", dist, ":", conditionMessage(e), "\n")
resultados <- rbind(resultados,
data.frame(p = p, q = q, distribucion = dist, AIC = NA))
})
}
}
}
## AIC = 27.00037
## AIC = -7.643577
## AIC = -7.641916
## AIC = -7.643441
## AIC = -7.640649
## AIC = -7.642308
## AIC = -7.648582
## AIC = -7.605971
## AIC = -7.641008
## AIC = -7.63959
## AIC = -7.64571
## AIC = -7.642723
## AIC = -7.641553
## AIC = -7.657429
## AIC = -7.60626
## AIC = -7.638145
## AIC = -7.636711
## AIC = -7.643428
## AIC = -7.640431
## AIC = -7.639246
## AIC = -7.655122
## AIC = -7.610876
## AIC = -7.635318
## AIC = -7.633892
## AIC = -7.64042
## AIC = -7.638128
## AIC = -7.636939
## AIC = -7.656036
## AIC = -7.608093
## AIC = -7.632744
## AIC = -7.631314
## AIC = -7.637797
## AIC = -7.635494
## AIC = -7.634632
## AIC = -7.653729
## AIC = -7.610038
## AIC = -7.630428
## AIC = -7.628964
## AIC = -7.635224
## AIC = -7.632926
## AIC = -7.631949
## AIC = -7.651423
## AIC = -7.626077
## AIC = -7.680446
## AIC = -7.679151
## AIC = -7.679626
## AIC = -7.676961
## AIC = -7.674875
## AIC = -7.675823
## AIC = -7.644832
## AIC = -7.677933
## AIC = -7.676845
## AIC = -7.677895
## AIC = -7.675314
## AIC = -7.67332
## AIC = -7.67785
## AIC = -7.646571
## AIC = -7.675187
## AIC = -7.674086
## AIC = -7.675589
## AIC = -7.673005
## AIC = -7.671013
## AIC = -7.672668
## AIC = -7.65444
## AIC = -7.672481
## AIC = -7.671392
## AIC = -7.672997
## AIC = -7.6707
## AIC = -7.66892
## AIC = -7.676546
## AIC = -7.651711
## AIC = -7.669952
## AIC = -7.668856
## AIC = -7.670326
## AIC = -7.668034
## AIC = -7.666614
## AIC = -7.674239
## AIC = -7.651696
## AIC = -7.667212
## AIC = -7.66612
## AIC = -7.667708
## AIC = -7.665417
## AIC = -7.664094
## AIC = -7.671933
## AIC = -6.385115
## AIC = -7.676363
## AIC = -7.674836
## AIC = -7.67533
## AIC = -7.67268
## AIC = -7.672136
## AIC = -7.673983
## AIC = -6.387864
## AIC = -7.673877
## AIC = -7.672529
## AIC = -7.673606
## AIC = -7.671007
## AIC = -7.669461
## AIC = -7.677719
## AIC = -7.644764
## AIC = -7.671155
## AIC = -7.6698
## AIC = -7.671624
## AIC = -7.668641
## AIC = -7.667766
## AIC = -7.675412
## AIC = -7.650156
## AIC = -7.66847
## AIC = -7.667126
## AIC = -7.668858
## AIC = -7.666593
## AIC = -7.665481
## AIC = -7.675764
## AIC = -7.647417
## AIC = -7.665948
## AIC = -7.664592
## AIC = -7.666232
## AIC = -7.663683
## AIC = -7.663174
## AIC = -7.673457
## AIC = -7.64775
## AIC = -7.663212
## AIC = -7.661902
## AIC = -7.663791
## AIC = -7.661517
## AIC = -7.659253
## AIC = -7.67115
## AIC = -4.037539
## AIC = -7.651819
## AIC = -7.650117
## AIC = -7.65139
## AIC = -7.648566
## AIC = -7.645977
## AIC = -7.6543
## AIC = -7.607446
## AIC = -7.649266
## AIC = -7.647801
## AIC = -7.652727
## AIC = -7.649768
## AIC = -7.647591
## AIC = -7.661778
## AIC = -7.607792
## AIC = -7.646368
## AIC = -7.644911
## AIC = -7.650595
## AIC = -7.647612
## AIC = -7.645284
## AIC = -7.659472
## AIC = -7.613052
## AIC = -7.643523
## AIC = -7.642059
## AIC = -7.647597
## AIC = -7.645305
## AIC = -7.64262
## AIC = -7.661174
## AIC = -7.610291
## AIC = -7.64094
## AIC = -7.639475
## AIC = -7.644917
## AIC = -7.64262
## AIC = -7.640313
## AIC = -7.658867
## AIC = -7.61264
## AIC = -7.638518
## AIC = -7.636974
## AIC = -7.642326
## AIC = -7.640029
## AIC = -7.637722
## AIC = -7.65656
## AIC = -7.625182
## AIC = -7.681431
## AIC = -7.679984
## AIC = -7.680204
## AIC = -7.67752
## AIC = -7.67531
## AIC = -7.676444
## AIC = -7.644461
## AIC = -7.678924
## AIC = -7.677677
## AIC = -7.678614
## AIC = -7.676019
## AIC = -7.673783
## AIC = -7.675734
## AIC = -7.646132
## AIC = -7.676167
## AIC = -7.674909
## AIC = -7.676307
## AIC = -7.673715
## AIC = -7.671477
## AIC = -7.67344
## AIC = -7.654008
## AIC = -7.673442
## AIC = -7.672194
## AIC = -7.67371
## AIC = -7.671407
## AIC = -7.669531
## AIC = -7.678185
## AIC = -7.651287
## AIC = -7.670912
## AIC = -7.669659
## AIC = -7.671018
## AIC = -7.66872
## AIC = -7.6673
## AIC = -7.675878
## AIC = -7.651457
## AIC = -7.668148
## AIC = -7.666899
## AIC = -7.668396
## AIC = -7.666093
## AIC = -7.664726
## AIC = -7.673571
## AIC = -6.382809
## AIC = -7.679719
## AIC = -7.678061
## AIC = -7.678337
## AIC = -7.675663
## AIC = -7.674938
## AIC = -7.67661
## AIC = -6.385557
## AIC = -7.677228
## AIC = -7.675715
## AIC = -7.67696
## AIC = -7.674327
## AIC = -7.671881
## AIC = -7.680942
## AIC = -7.645987
## AIC = -7.674495
## AIC = -7.672996
## AIC = -7.675016
## AIC = -7.672282
## AIC = -7.669574
## AIC = -7.678635
## AIC = -7.46965
## AIC = -7.671786
## AIC = -7.670299
## AIC = -7.672254
## AIC = -7.669976
## AIC = -7.668513
## AIC = -7.679408
## AIC = -7.649086
## AIC = -7.66927
## AIC = -7.667777
## AIC = -7.669592
## AIC = -7.667304
## AIC = -7.664961
## AIC = -7.677101
## AIC = -7.64985
## AIC = -7.666556
## AIC = -7.665065
## AIC = -7.667138
## AIC = -7.664848
## AIC = -7.66238
## AIC = -7.674794
# Filtrar resultados válidos
resultados_validos <- resultados[!is.na(resultados$AIC), ]
# Mostrar el mejor por distribución
cat("\n Mejor AIC por distribución:\n")
##
## Mejor AIC por distribución:
mejores_por_dist <- aggregate(AIC ~ distribucion, data = resultados_validos, FUN = min)
print(mejores_por_dist)
## distribucion AIC
## 1 ged -7.677719
## 2 norm -7.657429
## 3 sged -7.680942
## 4 snorm -7.661778
## 5 sstd -7.681431
## 6 std -7.680446
# Mostrar el mejor en general
cat("\n Mejor modelo en general:\n")
##
## Mejor modelo en general:
mejor <- resultados_validos[which.min(resultados_validos$AIC), ]
print(mejor)
## p q distribucion AIC
## 170 1 1 sstd -7.681431
El mejor modelo GARCH (1,1) con una sstd
Probamos ARCH
## Escriba su código en este espacio
#Tenemos GARCH
library(rugarch)
dist_models <- c("norm", "std", "ged", "snorm", "sstd", "sged")
# Inicializar tabla de resultados
resultados <- data.frame(p = integer(),
q = integer(),
distribucion = character(),
AIC = numeric(),
stringsAsFactors = FALSE)
# Grid search para modelos GARCH(p,q) con distribuciones
for (dist in dist_models) {
for (p in 1:6) {
for (q in 0:6) { #Esto igual no importa porque ya setee q=0
#cat("Probando ARCH(", p, ",", q, ") con dist:", dist, "...\n")
spec <- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(p, 0)),#arch(P)
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = dist
)
tryCatch({
fit <- ugarchfit(spec = spec, data = retornos_log, solver = "hybrid")
aic_val <- infocriteria(fit)[1] # Extrae AIC
resultados <- rbind(resultados,
data.frame(p = p, q = q, distribucion = dist, AIC = aic_val))
cat(" AIC =", aic_val, "\n")
}, error = function(e) {
cat("Error en GARCH(", p, ",", q, "), dist:", dist, ":", conditionMessage(e), "\n")
resultados <- rbind(resultados,
data.frame(p = p, q = q, distribucion = dist, AIC = NA))
})
}
}
}
## AIC = 27.00037
## AIC = 27.00037
## AIC = 27.00037
## AIC = 27.00037
## AIC = 27.00037
## AIC = 27.00037
## AIC = 27.00037
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.605971
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.60626
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.610876
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.608093
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.610038
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.626077
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.644832
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.646571
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.65444
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651711
## AIC = -7.651696
## AIC = -7.651696
## AIC = -7.651696
## AIC = -7.651696
## AIC = -7.651696
## AIC = -7.651696
## AIC = -7.651696
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.385115
## AIC = -6.387864
## AIC = -6.387864
## AIC = -6.387864
## AIC = -6.387864
## AIC = -6.387864
## AIC = -6.387864
## AIC = -6.387864
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.644764
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.650156
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.647417
## AIC = -7.64775
## AIC = -7.64775
## AIC = -7.64775
## AIC = -7.64775
## AIC = -7.64775
## AIC = -7.64775
## AIC = -7.64775
## AIC = -4.037539
## AIC = -4.037539
## AIC = -4.037539
## AIC = -4.037539
## AIC = -4.037539
## AIC = -4.037539
## AIC = -4.037539
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607446
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.607792
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.613052
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.610291
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.61264
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.625182
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.644461
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.646132
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.654008
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651287
## AIC = -7.651457
## AIC = -7.651457
## AIC = -7.651457
## AIC = -7.651457
## AIC = -7.651457
## AIC = -7.651457
## AIC = -7.651457
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.382809
## AIC = -6.385557
## AIC = -6.385557
## AIC = -6.385557
## AIC = -6.385557
## AIC = -6.385557
## AIC = -6.385557
## AIC = -6.385557
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.645987
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.46965
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.649086
## AIC = -7.64985
## AIC = -7.64985
## AIC = -7.64985
## AIC = -7.64985
## AIC = -7.64985
## AIC = -7.64985
## AIC = -7.64985
# Filtrar resultados válidos
resultados_validos <- resultados[!is.na(resultados$AIC), ]
# Mostrar el mejor por distribución
cat("\n Mejor AIC por distribución:\n")
##
## Mejor AIC por distribución:
mejores_por_dist <- aggregate(AIC ~ distribucion, data = resultados_validos, FUN = min)
print(mejores_por_dist)
## distribucion AIC
## 1 ged -7.650156
## 2 norm -7.610876
## 3 sged -7.649850
## 4 snorm -7.613052
## 5 sstd -7.654008
## 6 std -7.654440
# Mostrar el mejor en general
cat("\n Mejor modelo en general:\n")
##
## Mejor modelo en general:
mejor <- resultados_validos[which.min(resultados_validos$AIC), ]
print(mejor)
## p q distribucion AIC
## 64 4 0 std -7.65444
El mejor modelo arch (4) con una distribución std
eGarch
#Ahora probamos eGarch
library(rugarch)
# Distribuciones condicionales a evaluar
dist_models <- c("norm", "std", "ged", "snorm", "sstd", "sged")
# Inicializar tabla de resultados
resultados_egarch <- data.frame(p = integer(),
q = integer(),
distribucion = character(),
AIC = numeric(),
stringsAsFactors = FALSE)
# Grid search EGARCH(p,q)
for (dist in dist_models) {
for (p in 1:6) {
for (q in 1:6) {
#cat(" Probando EGARCH(", p, ",", q, ") con dist:", dist, "...\n")
spec <- ugarchspec(
variance.model = list(model = "eGARCH", garchOrder = c(p, q)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = dist
)
tryCatch({
fit <- ugarchfit(spec = spec, data = retornos_log, solver = "hybrid")
aic_val <- infocriteria(fit)[1] # AIC
resultados_egarch <- rbind(resultados_egarch,
data.frame(p = p, q = q, distribucion = dist, AIC = aic_val))
cat(" AIC =", aic_val, "\n")
}, error = function(e) {
cat("Error:", conditionMessage(e), "\n")
resultados_egarch <- rbind(resultados_egarch,
data.frame(p = p, q = q, distribucion = dist, AIC = NA))
})
}
}
}
## AIC = -7.647446
## AIC = -7.645018
## AIC = -7.646801
## AIC = -7.641275
## AIC = -7.647899
## AIC = -7.646456
## AIC = -7.657277
## AIC = -7.655202
## AIC = -7.645321
## AIC = -7.648438
## AIC = -7.659113
## AIC = -7.658649
## AIC = -7.673837
## AIC = -7.671842
## AIC = -7.669959
## AIC = -7.664796
## AIC = -7.673035
## AIC = -7.668821
## AIC = -7.659457
## AIC = -7.66195
## AIC = -7.660641
## AIC = -7.657948
## AIC = -7.665065
## AIC = -7.671614
## AIC = -7.657007
## AIC = -7.654719
## AIC = -7.673258
## AIC = -7.670188
## AIC = -7.668246
## AIC = -7.672954
## AIC = -7.657434
## AIC = -7.651656
## AIC = -7.668262
## AIC = -7.665987
## AIC = -7.68006
## AIC = -7.682624
## AIC = -7.675821
## AIC = -7.674254
## AIC = -7.673557
## AIC = -7.671249
## AIC = -7.674155
## AIC = -7.671526
## AIC = -7.679813
## AIC = -7.677702
## AIC = -7.674725
## AIC = -7.672591
## AIC = -7.670406
## AIC = -7.671927
## AIC = -7.685626
## AIC = -7.683707
## AIC = -7.681579
## AIC = -7.677451
## AIC = -7.685289
## AIC = -7.683141
## AIC = -7.678997
## AIC = -7.679839
## AIC = -7.677473
## AIC = -7.676358
## AIC = -7.67761
## AIC = -7.685452
## AIC = -7.676206
## AIC = -7.673907
## AIC = -7.680413
## AIC = -7.683058
## AIC = -7.680751
## AIC = -7.678877
## AIC = -7.671556
## AIC = -7.670577
## AIC = -7.68463
## AIC = -7.678668
## AIC = -7.676518
## AIC = -7.692921
## AIC = -7.673585
## AIC = -7.671697
## AIC = -7.670476
## AIC = -7.66792
## AIC = -7.673033
## AIC = -7.67046
## AIC = -7.678687
## AIC = -7.67656
## AIC = -7.673801
## AIC = -7.67089
## AIC = -7.674923
## AIC = -7.673361
## AIC = -7.68449
## AIC = -7.682693
## AIC = -7.68046
## AIC = -7.676135
## AIC = -7.683501
## AIC = -7.680526
## AIC = -7.677739
## AIC = -7.678796
## AIC = -7.67654
## AIC = -7.679769
## AIC = -7.68145
## AIC = -7.686184
## AIC = -7.674755
## AIC = -7.67246
## AIC = -7.684499
## AIC = -7.682689
## AIC = -7.680454
## AIC = -7.68141
## AIC = -7.670133
## AIC = -7.668479
## AIC = -7.703263
## AIC = -7.67828
## AIC = -7.676315
## AIC = -7.677037
## AIC = -7.652509
## AIC = -7.650272
## AIC = -7.647765
## AIC = -7.649379
## AIC = -7.652696
## AIC = -7.650431
## AIC = -7.661604
## AIC = -7.659542
## AIC = -7.656319
## AIC = -7.652596
## AIC = -7.665731
## AIC = -7.665994
## AIC = -7.669912
## AIC = -7.668122
## AIC = -7.665861
## AIC = -7.672076
## AIC = -7.679606
## AIC = -7.665495
## AIC = -7.661952
## AIC = -7.664828
## AIC = -7.670725
## AIC = -7.660889
## AIC = -7.668495
## AIC = -7.673082
## AIC = -7.659421
## AIC = -7.659589
## AIC = -7.67803
## AIC = -7.674055
## AIC = -7.674153
## AIC = -7.679177
## AIC = -7.658418
## AIC = -7.654302
## AIC = -7.673387
## AIC = -7.669281
## AIC = -7.680515
## AIC = -7.670792
## AIC = -7.676653
## AIC = -7.674969
## AIC = -7.674046
## AIC = -7.671803
## AIC = -7.673956
## AIC = -7.671369
## AIC = -7.680399
## AIC = -7.678297
## AIC = -7.675182
## AIC = -7.673165
## AIC = -7.670844
## AIC = -7.671031
## AIC = -7.685692
## AIC = -7.683808
## AIC = -7.681735
## AIC = -7.680687
## AIC = -7.687129
## AIC = -7.687161
## AIC = -7.679055
## AIC = -7.680459
## AIC = -7.678206
## AIC = -7.677631
## AIC = -7.678244
## AIC = -7.683728
## AIC = -7.676256
## AIC = -7.675223
## AIC = -7.678755
## AIC = -7.683367
## AIC = -7.681079
## AIC = -7.698752
## AIC = -7.671573
## AIC = -7.672487
## AIC = -7.67429
## AIC = -7.686075
## AIC = -7.684855
## AIC = -7.692605
## AIC = -7.676201
## AIC = -7.674248
## AIC = -7.672873
## AIC = -7.670382
## AIC = -7.674383
## AIC = -7.671838
## AIC = -7.680694
## AIC = -7.67858
## AIC = -7.675835
## AIC = -7.672842
## AIC = -7.670039
## AIC = -7.678612
## AIC = -7.68533
## AIC = -7.683618
## AIC = -7.681436
## AIC = -7.681927
## AIC = -7.687762
## AIC = -7.685099
## AIC = -7.678688
## AIC = -7.680297
## AIC = -7.678399
## AIC = -7.676379
## AIC = -7.679212
## AIC = -7.678106
## AIC = -7.675724
## AIC = -7.673431
## AIC = -7.686713
## AIC = -7.684086
## AIC = -7.681318
## AIC = -7.68483
## AIC = -7.670917
## AIC = -7.66953
## AIC = -7.680534
## AIC = -7.692465
## AIC = -7.693589
## AIC = -7.680548
# Filtrar modelos válidos
egarch_validos <- resultados_egarch[!is.na(resultados_egarch$AIC), ]
# Mejor por distribución
cat("\n Mejor AIC por distribución (EGARCH):\n")
##
## Mejor AIC por distribución (EGARCH):
print(aggregate(AIC ~ distribucion, data = egarch_validos, FUN = min))
## distribucion AIC
## 1 ged -7.703263
## 2 norm -7.682624
## 3 sged -7.693589
## 4 snorm -7.680515
## 5 sstd -7.698752
## 6 std -7.692921
# Mejor modelo global
mejor_egarch <- egarch_validos[which.min(egarch_validos$AIC), ]
cat("\n Mejor modelo EGARCH encontrado:\n")
##
## Mejor modelo EGARCH encontrado:
print(mejor_egarch)
## p q distribucion AIC
## 105 6 3 ged -7.703263
El mejor modelo de eGarch es (6,3)
Pregunta 6: Validar el modelo, de tal forma que cumpla los supuestos del modelo seleccionado. Para validar el modelo voy a escoger el AIC y el BICde los mejores modelos de cada tipo
mejor_arch<- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(4, 0)), # GARCH(1,1)
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "std" # distribución t-student
)
fit <- ugarchfit(spec = mejor_arch, data = retornos_log)
aic_val <- infocriteria(fit)[1] # Extrae AIC
bic_val<-infocriteria(fit)[2] # Extrae BIC
aic_val
## [1] -7.65444
bic_val
## [1] -7.615968
mejor_garch<- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1,1)), # GARCH(1,1)
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "sstd" # distribución t-student
)
fit <- ugarchfit(spec = mejor_garch, data = retornos_log)
aic_val <- infocriteria(fit)[1] # Extrae AIC
bic_val<-infocriteria(fit)[2] # Extrae BIC
aic_val
## [1] -7.681431
bic_val
## [1] -7.648455
mejor_egarch<- ugarchspec(
variance.model = list(model = "eGARCH", garchOrder = c(6,3)), # GARCH(1,1)
mean.model = list(armaOrder = c(0,0), include.mean = TRUE),
distribution.model = "ged" # distribución t-student
)
mejor_egarch_fit <- ugarchfit(spec = mejor_egarch, data = retornos_log)
aic_val <- infocriteria(mejor_egarch_fit)[1] # Extrae AIC
bic_val<-infocriteria(mejor_egarch_fit)[2] # Extrae BIC
aic_val
## [1] -7.703263
bic_val
## [1] -7.604335
Voy a probar con el eGarch la prueba de supuestos de los residuos. Dado que es el menor eGarch
# Ver resultados
show(mejor_egarch_fit)
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : eGARCH(6,3)
## Mean Model : ARFIMA(0,0,0)
## Distribution : ged
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000152 0.000000 -908.56 0
## omega -0.460866 0.000084 -5505.34 0
## alpha1 0.031016 0.000014 2284.81 0
## alpha2 0.087740 0.000008 11505.06 0
## alpha3 -0.114475 0.000003 -39092.33 0
## alpha4 -0.045922 0.000011 -4336.19 0
## alpha5 -0.184860 0.000035 -5272.72 0
## alpha6 0.047014 0.000008 5970.95 0
## beta1 0.292642 0.000041 7216.92 0
## beta2 -0.314334 0.000046 -6786.08 0
## beta3 0.977744 0.000222 4396.42 0
## gamma1 0.291573 0.000030 9807.13 0
## gamma2 0.228750 0.000027 8578.21 0
## gamma3 0.001375 0.000001 1206.40 0
## gamma4 -0.136331 0.000013 -10462.01 0
## gamma5 -0.192147 0.000002 -123416.22 0
## gamma6 0.035385 0.000032 1090.98 0
## shape 1.671878 0.001892 883.44 0
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000152 0.000000 -1175.31 0
## omega -0.460866 0.001397 -329.78 0
## alpha1 0.031016 0.000037 845.53 0
## alpha2 0.087740 0.000101 864.48 0
## alpha3 -0.114475 0.000129 -887.85 0
## alpha4 -0.045922 0.000149 -308.34 0
## alpha5 -0.184860 0.000338 -547.63 0
## alpha6 0.047014 0.000122 385.64 0
## beta1 0.292642 0.000093 3158.37 0
## beta2 -0.314334 0.000354 -888.17 0
## beta3 0.977744 0.006662 146.76 0
## gamma1 0.291573 0.000275 1058.57 0
## gamma2 0.228750 0.000583 392.65 0
## gamma3 0.001375 0.000002 776.81 0
## gamma4 -0.136331 0.000180 -758.36 0
## gamma5 -0.192147 0.000022 -8675.83 0
## gamma6 0.035385 0.000223 158.37 0
## shape 1.671878 0.001420 1177.79 0
##
## LogLikelihood : 3357.365
##
## Information Criteria
## ------------------------------------
##
## Akaike -7.7033
## Bayes -7.6043
## Shibata -7.7041
## Hannan-Quinn -7.6654
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.06406 0.8002
## Lag[2*(p+q)+(p+q)-1][2] 1.00983 0.4951
## Lag[4*(p+q)+(p+q)-1][5] 1.88739 0.6453
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.5299 0.4666
## Lag[2*(p+q)+(p+q)-1][26] 10.2405 0.7656
## Lag[4*(p+q)+(p+q)-1][44] 20.6731 0.6021
## d.o.f=9
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[10] 0.01115 0.500 2.000 0.9159
## ARCH Lag[12] 1.20915 1.492 1.843 0.7235
## ARCH Lag[14] 3.18442 2.466 1.738 0.5893
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 9.7166
## Individual Statistics:
## mu 0.045611
## omega 0.022758
## alpha1 0.069494
## alpha2 0.031063
## alpha3 0.040855
## alpha4 0.075379
## alpha5 0.006877
## alpha6 0.062122
## beta1 0.064299
## beta2 0.061474
## beta3 0.021179
## gamma1 0.034293
## gamma2 0.074936
## gamma3 0.006859
## gamma4 0.055598
## gamma5 0.060200
## gamma6 0.032148
## shape 0.024884
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 3.83 4.14 4.73
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.61721 0.5373
## Negative Sign Bias 1.24589 0.2131
## Positive Sign Bias 0.02299 0.9817
## Joint Effect 1.55968 0.6686
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 34.29 0.01697
## 2 30 42.10 0.05500
## 3 40 49.77 0.11576
## 4 50 61.20 0.11334
##
##
## Elapsed time : 3.311396
# Residuos estandarizados
resid <- residuals(mejor_egarch_fit, standardize = TRUE)
resid_sq <- resid^2
supuesto de no autocorrelación de los residuos
# Ljung-Box sobre residuos
cat(" Ljung-Box residuos:\n")
## Ljung-Box residuos:
print(Box.test(resid, lag = 10, type = "Ljung-Box"))# autocorrelación
##
## Box-Ljung test
##
## data: resid
## X-squared = 6.2343, df = 10, p-value = 0.7952
No hay suficiente evidencia de autocorrelación en la prueba de Ljung-Box de los residuos.
supuesto de no heterocedasticidad
# Ljung-Box sobre residuos al cuadrado
cat(" Ljung-Box residuos²:\n")
## Ljung-Box residuos²:
print(Box.test(resid_sq, lag = 10, type = "Ljung-Box"))# heterocedasticidad
##
## Box-Ljung test
##
## data: resid_sq
## X-squared = 5.5261, df = 10, p-value = 0.8534
No hay suficiente evidencia de heterocedasticidad condicional, en la prueba de Ljung-Box de los residuos estándarizados al cuadrado .
# ARCH LM Test
cat(" ARCH LM Test:\n")
## ARCH LM Test:
print(ArchTest(resid, lags = 10))
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: resid
## Chi-squared = 5.1394, df = 10, p-value = 0.8817
La prueba de Arch nos dice que No hay suficiente evidencia de heterocedasticidad condicional. Las dos pruebas nos muestran que se captura el efecto de la varianza.
Prueba de normalidad
# Prueba de normalidad
cat("Jarque-Bera:\n")
## Jarque-Bera:
print(jarque.bera.test(resid))
##
## Jarque Bera Test
##
## data: resid
## X-squared = 14.977, df = 2, p-value = 0.0005594
# Gráficos diagnósticos
acf(resid_sq, main = "ACF de residuos estandarizados al cuadrado")
pacf(resid_sq, main = "PACF de residuos estandarizados al cuadrado")
qqnorm(resid, main = "Q-Q Plot residuos estandarizados")
qqline(resid, col = "red")
p<alpha no se rechaza Ho: No hay suficiente evidencia para rechazar
la distribución normal en los residuos.
Conclusión: Se cumplen todos los supuestos para mi mejor modelo eGarch (6,3) y capturas los efectos de la varianza