#pkges <- c("WDI","tidyverse","tseries","forecast")
#install.packages("pkges")
#lapply(pkges,library,character.only=T)
CREDICORP.mo <- pdfetch::pdfetch_YAHOO("BAP",interval = '1d') #DATOS DE CREDICORP
credicorp <- CREDICORP.mo[,4]
ts_credicorp<-ts(credicorp)
plot(ts_credicorp,main="PRECIOS DE CIERRE DE CREDICORP",xlab="Datos Diarios",ylab="Precio de Cierre")
Comenzamos notando la notable volatiliadd de los datos ademas de de una tendencia creciente y que no es estacionaria en su media, por lo que realizaremos un test:
tseries::adf.test(credicorp, alternative="stationary")
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Augmented Dickey-Fuller Test
##
## data: credicorp
## Dickey-Fuller = -1.6891, Lag order = 14, p-value = 0.71
## alternative hypothesis: stationary
Como se puede notar en el test hecho la serie no es estacionaria debido a que se acepta la hipotesis nula de no estacionariedad, por ello le haremos una transformación para trabajar con los rendimientos y esto es la diferencia de los logarimos como se vera a continuación:
R1 <- diff(log(credicorp))
R1 <- na.omit(R1)
plot(R1)
Como hace notar el grafico la serie es estacionaria para ello realizamos el mismo test:
tseries::adf.test(R1, alternative="stationary")
## Warning in tseries::adf.test(R1, alternative = "stationary"): p-value smaller
## than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: R1
## Dickey-Fuller = -14.245, Lag order = 14, p-value = 0.01
## alternative hypothesis: stationary
Ahora veremos las caracteristicas de la serie de retornos
hist(R1, main="", breaks=60, freq=FALSE, col="grey")
timeDate::kurtosis(R1)
## [1] 10.43548
## attr(,"method")
## [1] "excess"
Veamos la distribución de los rendimientos con respecto a la normalidad, para ello usaremos una grafica QQ:
qqnorm(R1)
qqline(R1, col="red")
Ahora procederemos a analizar la autocorrelación de los datos para indicarnos si se puede modelar con modelos ar o arma:
acf(R1)
pacf(R1)
Como se puede observar, hay una correlacion tipo Ar1 que sale a la vista y aun no es del todo claro si tienden a cero despues del primer rezago se realizaran dos modelos uno con el AR1 y otro derivado de la funcion autoarima
modelo.1<-arima(credicorp,order = c(1,0,0))
summary(modelo.1)
## Length Class Mode
## coef 2 -none- numeric
## sigma2 1 -none- numeric
## var.coef 4 -none- numeric
## mask 2 -none- logical
## loglik 1 -none- numeric
## aic 1 -none- numeric
## arma 7 -none- numeric
## residuals 3368 ts numeric
## call 3 -none- call
## series 1 -none- character
## code 1 -none- numeric
## n.cond 1 -none- numeric
## nobs 1 -none- numeric
## model 10 -none- list
forecast::auto.arima(credicorp,ic="aic",trace=T)
##
## Fitting models using approximations to speed things up...
##
## ARIMA(2,1,2) with drift : 15114.61
## ARIMA(0,1,0) with drift : 15112.63
## ARIMA(1,1,0) with drift : 15108.02
## ARIMA(0,1,1) with drift : 15107.21
## ARIMA(0,1,0) : 15111.12
## ARIMA(1,1,1) with drift : 15109.94
## ARIMA(0,1,2) with drift : 15109.09
## ARIMA(1,1,2) with drift : 15111.96
## ARIMA(0,1,1) : 15105.75
## ARIMA(1,1,1) : 15108.58
## ARIMA(0,1,2) : 15107.62
## ARIMA(1,1,0) : 15106.57
## ARIMA(1,1,2) : 15110.51
##
## Now re-fitting the best model(s) without approximations...
##
## ARIMA(0,1,1) : 15107.4
##
## Best model: ARIMA(0,1,1)
## Series: credicorp
## ARIMA(0,1,1)
##
## Coefficients:
## ma1
## -0.0465
## s.e. 0.0171
##
## sigma^2 estimated as 5.197: log likelihood=-7551.7
## AIC=15107.4 AICc=15107.41 BIC=15119.65
modelo.2<-arima(credicorp,order = c(0,1,1))
summary(modelo.2)
##
## Call:
## arima(x = credicorp, order = c(0, 1, 1))
##
## Coefficients:
## ma1
## -0.0465
## s.e. 0.0171
##
## sigma^2 estimated as 5.196: log likelihood = -7551.7, aic = 15107.4
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.02893354 2.279076 1.566282 0.016841 1.346329 0.9992839
## ACF1
## Training set -0.0004656868
Describiendo los residuos:
residuos.1<-modelo.1$residuals
plot(residuos.1)
residuos.2<-modelo.2$residuals
plot(residuos.2)
Aplicamos el test de white a los residuos para detectar heterocedasticidad:
tseries::white.test(residuos.1)
##
## White Neural Network Test
##
## data: residuos.1
## X-squared = 25.973, df = 2, p-value = 2.291e-06
tseries::white.test(residuos.2)
##
## White Neural Network Test
##
## data: residuos.2
## X-squared = 16.913, df = 2, p-value = 0.0002125
Debido a la presencia de heterocedasticidad modelaremos un modelo arch
ts.arch <- tseries::garch(R1,c(0,1))
##
## ***** ESTIMATION WITH ANALYTICAL GRADIENT *****
##
##
## I INITIAL X(I) D(I)
##
## 1 3.701036e-04 1.000e+00
## 2 5.000000e-02 1.000e+00
##
## IT NF F RELDF PRELDF RELDX STPPAR D*STEP NPRELDF
## 0 1 -1.164e+04
## 1 7 -1.165e+04 7.46e-04 1.19e-03 3.3e-04 1.3e+10 3.3e-05 7.78e+06
## 2 8 -1.165e+04 2.80e-05 3.53e-05 3.1e-04 2.0e+00 3.3e-05 8.41e+01
## 3 15 -1.171e+04 4.83e-03 6.96e-03 3.7e-01 2.0e+00 5.8e-02 8.30e+01
## 4 21 -1.171e+04 5.49e-05 1.49e-04 5.7e-05 9.4e+00 1.2e-05 4.22e-03
## 5 22 -1.171e+04 5.64e-06 5.34e-06 5.5e-05 2.0e+00 1.2e-05 2.19e-03
## 6 30 -1.175e+04 3.12e-03 2.18e-03 2.5e-01 0.0e+00 7.4e-02 2.18e-03
## 7 31 -1.177e+04 1.58e-03 1.09e-03 1.7e-01 0.0e+00 7.3e-02 1.09e-03
## 8 32 -1.177e+04 7.46e-04 5.47e-04 1.2e-01 0.0e+00 7.1e-02 5.47e-04
## 9 33 -1.178e+04 2.00e-04 1.56e-04 7.0e-02 0.0e+00 4.9e-02 1.56e-04
## 10 34 -1.178e+04 2.75e-05 2.37e-05 2.9e-02 0.0e+00 2.2e-02 2.37e-05
## 11 35 -1.178e+04 1.07e-06 1.05e-06 6.8e-03 0.0e+00 5.5e-03 1.05e-06
## 12 36 -1.178e+04 1.71e-08 2.29e-08 3.3e-04 0.0e+00 2.7e-04 2.29e-08
## 13 37 -1.178e+04 1.19e-09 1.19e-09 3.5e-05 0.0e+00 2.8e-05 1.19e-09
## 14 38 -1.178e+04 2.01e-15 2.67e-15 1.8e-07 0.0e+00 1.5e-07 2.67e-15
##
## ***** RELATIVE FUNCTION CONVERGENCE *****
##
## FUNCTION -1.177703e+04 RELDX 1.841e-07
## FUNC. EVALS 38 GRAD. EVALS 15
## PRELDF 2.669e-15 NPRELDF 2.669e-15
##
## I FINAL X(I) D(I) G(I)
##
## 1 2.444440e-04 1.000e+00 5.782e-04
## 2 4.033392e-01 1.000e+00 -1.052e-06
Visualizando los errores
residuos.3<-ts.arch$residuals
plot(residuos.3)