Series de Tiempo - Tercer Exámen

Juliana Rubio

2025-05-27

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