library(readr)
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
library(markdown)
La relacion economica y social que existe entre Mexico y Estados Unidos es demasiada estrecha y dinamica, parte de esta gran conexion depende de los tipos de cambio de ambas monedas pero nosotros nos centraremos en el peso/dolar; el peso/dólar juega un papel fundamental en la dinámica de la relación económica entre Estados Unidos y México, de este tipo de cambio dependen grandes e importantes sectores como es:
Si logramos crear una prediccion la mas apegada a la realidad podremos crear estrategias comerciales, politicas, decisiones financieras y sociales que beneficien a todo el sector involucrado y a la economia.
Para esto buscaremos un modelo ARIMA lo mas ajustado posible mediante una serie de tiempo de los valores de cierre del tipo de cambio peso/dolar.
La predicción del tipo de cambio peso/dólar ha sido un tema de gran interés para investigadores, economistas y tomadores de decisiones en México y Estados Unidos, debido a su impacto significativo en el comercio bilateral, la inversión extranjera, las remesas y la estabilidad financiera. A lo largo de los años, se han desarrollado diversos métodos y modelos para predecir el tipo de cambio, cada uno con sus propias ventajas y desventajas.
Un ejemplo es el articulo “Un modelo de predicción del tipo de cambio spot para la economía mexicana” de María de la Paz Guzman de la Universidad Autónoma Metropolitana Unidad Azcapotzalco publicado en la red de Revistas Científicas de América Latina, el Caribe, España y Portugal. Donde se comparte la idea de predecir el comportamiento del tipo de cambio spot para la economía mexicana el cual se sustenta en la metodología econométrica de Engle y Granger. Para dar validez al modelo de este pronóstico del tipo de cambio, ella utiliza conceptos como integración, cointegración, causalidad de Granger, vectores autorregresivos, exogeneidad fuerte y se destacan los estadísticos Dickey Fuller, Akaike y Schwarz, Johansen y el coeficiente de desigualdad de Theil.
Dentro de los resultados del pronóstico destaca que el pronóstico tiene un buen desempeño tanto dentro de la muestra como fuera de ella; ademas que el valor del peso con respecto al dólar difiere en unos centavos del valor que resulta en el pronóstico del tipo de cambio.
Recabamos una base de datos de los valores de cierre del tipo de cambio peso/dolar, la cual la descargamos de la pagina oficial de Banxico. Nuestra variable es el valor del tipo de cambio semanal. Respecto a la ventana de tiempo,establecimos valores semanales tomando el lapso de la primera semana de 2021 a la semana actual. Las unidades de nuestro estudio estan determinadas en pesos mexicanos.
datos <- read.csv("C:/Users/52477/Desktop/ECONO. 2/Proyecto Final/Tipo_Cambio.csv")
datos.ts=ts(datos,start=1,frequency = 1)
datos1 <- datos.ts
plot(datos1,xlab="Numero de Semanas",ylab="Valor peso/dolar",col="orange",lwd=2)
adf_result <- adf.test(datos1, alternative="stationary")
print(adf_result)
##
## Augmented Dickey-Fuller Test
##
## data: datos1
## Dickey-Fuller = -2.3637, Lag order = 5, p-value = 0.4243
## alternative hypothesis: stationary
Prueba de Dickey-Fuller: El p-value de la prueba de Dickey-Fuller es de 0.4243, lo cual nos indica que se cumple la hipotesis nula lo cual se interpreta que la serie de tiempo es no estacionaria.
Realizamos una integracion con el comando diff()
#PRIMERA INTEGRADA
#diff(datos1)
Variable1<-diff(datos1)
#2da prueba de Dickey-Fuller
adf_result2 <- adf.test(diff(datos1), alternative="stationary")
## Warning in adf.test(diff(datos1), alternative = "stationary"): p-value smaller
## than printed p-value
print(adf_result2)
##
## Augmented Dickey-Fuller Test
##
## data: diff(datos1)
## Dickey-Fuller = -7.2313, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
plot(diff(datos1))
#La serie ya es estacionaria
Con la nueva prueba de Dickey-Fuller nos arroja un p-value de 0.01, lo cual cumple con la hipotesis alternativa y podemos determinar que nuestra serie de tiempo es estacionario y solo implico una integracion.
Integrada de orden 1
#Prueba de ACF y PACF
acf(Variable1)
#Para la prueba acf
pacf(Variable1)
En los estimadores de ACF obtenemos que el P0=1, y los demas
estan muy cerca del 0. Por parte de los estimadores de PACF
obtenemos que el primer valor es -.1, el segundo -.16, el tercero -.11,
etc.Todos los valores oscilan entre -0.15 y 0.15
Realizamos varias pruebas aleatorias de modelos arima
modelo<-arima(Variable1,order=c(3,0,0))
modelo
##
## Call:
## arima(x = Variable1, order = c(3, 0, 0))
##
## Coefficients:
## ar1 ar2 ar3 intercept
## -0.1442 -0.1866 -0.1213 -0.0191
## s.e. 0.0750 0.0745 0.0759 0.0148
##
## sigma^2 estimated as 0.07994: log likelihood = -27.31, aic = 64.62
modelo<-arima(Variable1,order=c(1,0,0))
modelo
##
## Call:
## arima(x = Variable1, order = c(1, 0, 0))
##
## Coefficients:
## ar1 intercept
## -0.1061 -0.0192
## s.e. 0.0751 0.0198
##
## sigma^2 estimated as 0.08358: log likelihood = -31.15, aic = 68.31
Xt <- Variable1
#datos1 -> Nuestra serie estacionaria
#Xt
Calcula los coeficientes AIC y BIC para varios candidatos ARIMA(p; d; q). Utilizaremos el ciclo for. Usaremos un máximo de 3 para p, un máximo de 3 para q y un máximo de 3 para d
P <-3
D <- 3
Q <- 3
m <- (P+1)*(D+1)*(Q+1)
tabla <- data.frame()
for(p in 0:P) for(d in 0:D) for(q in 0:Q){
modelo <- arima(Xt, order=c(p,d,q))
A <- AIC(modelo)
sbic <- AIC(modelo, k=log(length(Xt)))
tabla <- rbind(tabla, c(p,d,q, A, sbic))
}
tabla<-rename(tabla, 'p'=1, 'd'=2, 'q'=3, 'AIC'=4, 'sbic'=5)
tabla<-tabla[order(tabla$AIC),]
tabla<-tabla[order(tabla$sbic),]
tabla1 <- tabla[order(tabla$AIC),]
tabla1
## p d q AIC sbic
## 52 3 0 3 60.81368 86.13197
## 18 1 0 1 62.18642 74.84557
## 3 0 0 2 62.40198 75.06113
## 4 0 0 3 63.03378 78.85771
## 34 2 0 1 63.05142 78.87535
## 19 1 0 2 63.08171 78.90564
## 51 3 0 2 63.54251 85.69601
## 49 3 0 0 64.61617 80.44010
## 20 1 0 3 65.01131 84.00002
## 50 3 0 1 65.05047 84.03918
## 35 2 0 2 65.05128 84.03999
## 33 2 0 0 65.14807 77.80721
## 36 2 0 3 67.06435 89.21785
## 2 0 0 1 67.19794 76.69229
## 1 0 0 0 68.29041 74.61998
## 17 1 0 0 68.30756 77.80192
## 8 0 1 3 69.16100 81.82014
## 56 3 1 3 70.44994 92.60344
## 24 1 1 3 71.00173 86.82566
## 54 3 1 1 71.19536 87.01929
## 38 2 1 1 71.48839 84.14753
## 55 3 1 2 71.95458 90.94330
## 39 2 1 2 72.82442 88.64835
## 40 2 1 3 73.03013 92.01885
## 7 0 1 2 73.36347 82.85783
## 6 0 1 1 74.08496 80.41453
## 22 1 1 1 74.30940 83.80376
## 23 1 1 2 75.19745 87.85659
## 43 2 2 2 86.31557 102.13950
## 59 3 2 2 86.50140 105.49012
## 44 2 2 3 87.22990 106.21861
## 12 0 2 3 87.91114 100.57028
## 60 3 2 3 88.10943 110.26294
## 11 0 2 2 88.14137 97.63573
## 27 1 2 2 88.64482 101.30396
## 28 1 2 3 89.16193 104.98586
## 16 0 3 3 110.58096 123.24010
## 48 2 3 3 111.46499 130.45371
## 64 3 3 3 112.56258 134.71609
## 53 3 1 0 122.00410 134.66325
## 58 3 2 1 131.44501 147.26894
## 32 1 3 3 137.54003 153.36396
## 37 2 1 0 138.02233 147.51669
## 63 3 3 2 146.44478 165.43350
## 42 2 2 1 146.82062 159.47977
## 47 2 3 2 160.93535 176.75928
## 21 1 1 0 162.20771 168.53728
## 26 1 2 1 170.22749 179.72185
## 31 1 3 2 183.26212 195.92127
## 5 0 1 0 204.76832 207.93311
## 10 0 2 1 211.75888 218.08845
## 15 0 3 2 223.40967 232.90403
## 57 3 2 0 224.90495 237.56409
## 62 3 3 1 234.29302 250.11695
## 41 2 2 0 255.73157 265.22593
## 46 2 3 1 264.23254 276.89168
## 25 1 2 0 301.76099 308.09056
## 30 1 3 1 309.16819 318.66255
## 61 3 3 0 353.91233 366.57147
## 9 0 2 0 391.43735 394.60214
## 45 2 3 0 393.66568 403.16003
## 14 0 3 1 397.33530 403.66488
## 29 1 3 0 462.31150 468.64107
## 13 0 3 0 594.77307 597.93786
mAIC <- min(tabla$AIC)
tabla[tabla$AIC==mAIC,]
## p d q AIC sbic
## 52 3 0 3 60.81368 86.13197
Basandonos en los valores del AIC que nos arroja la tabla determinamos que nuestro mejor modelo al momento es el c(3,0,3) Para confirmar la viabilidad del modelo hacemos las pruebas de significancias de los coeficientes.
Modelo1 <- arima(Xt, order=c(3,0,3))
Modelo1
##
## Call:
## arima(x = Xt, order = c(3, 0, 3))
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3 intercept
## -0.2770 -0.4985 0.4976 0.1476 0.3109 -0.7596 -0.0196
## s.e. 0.1605 0.1342 0.1568 0.1261 0.1144 0.1259 0.0114
##
## sigma^2 estimated as 0.07386: log likelihood = -22.41, aic = 60.81
confint(Modelo1)
## 2.5 % 97.5 %
## ar1 -0.59149833 0.037490697
## ar2 -0.76150174 -0.235497303
## ar3 0.19040415 0.804856171
## ma1 -0.09958193 0.394773857
## ma2 0.08677590 0.535049767
## ma3 -1.00640642 -0.512745448
## intercept -0.04191618 0.002702872
Modelo2 <- arima(Xt, order=c(1,0,1))
Modelo2
##
## Call:
## arima(x = Xt, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.5938 -0.7905 -0.0198
## s.e. 0.1450 0.1085 0.0112
##
## sigma^2 estimated as 0.07973: log likelihood = -27.09, aic = 62.19
confint(Modelo2)
## 2.5 % 97.5 %
## ar1 0.30968809 0.877960400
## ma1 -1.00325543 -0.577799126
## intercept -0.04167841 0.002112224
# AR1 Es significativo, ya que 0.30968809 y 0.877960400 NO incluyen el 0
# MA1 Es significativo, -1.00325543 y -0.577799126 NO incluyen el 0
# Intercepto es No significativo, 0.04167841 y 0.002112224 ya que incluyen el 0
confint(Modelo2)
## 2.5 % 97.5 %
## ar1 0.30968809 0.877960400
## ma1 -1.00325543 -0.577799126
## intercept -0.04167841 0.002112224
# Xt <-
ModeloR <- auto.arima(Xt)
print(ModeloR)
## Series: Xt
## ARIMA(3,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3
## -0.1365 -0.1792 -0.1126
## s.e. 0.0751 0.0747 0.0760
##
## sigma^2 = 0.0821: log likelihood = -28.12
## AIC=64.25 AICc=64.48 BIC=76.91
confint(ModeloR)
## 2.5 % 97.5 %
## ar1 -0.2837432 0.01066499
## ar2 -0.3255555 -0.03286237
## ar3 -0.2615039 0.03630455
confint(ModeloR)
## 2.5 % 97.5 %
## ar1 -0.2837432 0.01066499
## ar2 -0.3255555 -0.03286237
## ar3 -0.2615039 0.03630455
Modelo2 <- arima(Xt, order=c(1,0,1))
Modelo2
##
## Call:
## arima(x = Xt, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.5938 -0.7905 -0.0198
## s.e. 0.1450 0.1085 0.0112
##
## sigma^2 estimated as 0.07973: log likelihood = -27.09, aic = 62.19
plot(resid(Modelo2))
acf(resid(Modelo2))
Box.test(resid(Modelo2), lag=20, type='Ljung-Box')
##
## Box-Ljung test
##
## data: resid(Modelo2)
## X-squared = 19.55, df = 20, p-value = 0.4863
Se cumple la hipotesis nula de Ljung-Box, esto nos indica que los residuos son ruido blanco p-value = 0.4863 > 0.05
hist(resid(Modelo2),freq=FALSE)
Podemos ver que nuestro histograma de residuos tiene una forma simétrica
y de campana, esto porque los residuos están distribuidos normalmente;
este en un buen indicador de que nuestro modelo puede ser confiable.
x <- resid(Modelo2)
intervalo <- seq(min(x), max(x), length = 300)
distnormal <- dnorm(intervalo, mean=mean(x),sd=sd(x))
hist(x,freq=FALSE)
lines(intervalo,distnormal, col="red",lwd=3)
Modelo <- datos1
Aqui podemos rectificar lo anterior, vemos como la linea roja que es la distribucion normal, va mas o menos simetrica a la figura de nuestro histograma; esto confirmando la presicion del modelo.
pronostico <- forecast(Modelo, h = 12) #nuestro periodo son semanas
plot(pronostico)
#La grafica signifca que existe un 80% de probabilidad de que los valores futuros del modelo esten dentro del area oscura sombreada y un 95% de probabilidad de que esten en el area clara sombreada.
Usando esta grafica y estableciendo nuestro rango de prediccion de 12 semanas, visualizamos como el valor del dolar dentro de 3 meses oscilara en un rango variacion de .5 a 2 pesos; considerando que el valor del dolar al momento de realizar este proyecto es de 16.8 podemos establecer que en el primer mes hay una probabilidad de 95% que el valor del dolar este entre 16 pesos y 17.2 aproximadamente, mientras que en el segundo mes manteniendo la misma probabilidad el tipo de cambio oscilara entre 15.5 y 17.5, dentro del tercer mes se pronostica que el valor del peso/dolar estara dentro de 15 pesos a 18 pesos aproximadamente.
Estos valores serian muy utiles para los objetivos planteados en el inicio de este trabajo.
#Nuestro modelo
autoplot(Modelo2)
Analizando la grafica del circulo unitario nos podemos percatar los
puntos rojos estan dentro y no muy cerca del circulo antes mencionado,
esto nos determina que nuestro modelo es estable
Encontramos que nuestro modelo se puede ajustar a la realidad, los valores que nos arrojo, aunque no son muy precisos, si dan un amplio panorama del futuro de este tipo de cambio y pueden ser cruciales en las decisiones de distintos ambitos. Ademas que nuestro modelo sigue una tendencia estacionaria. Le veemos varias areas de oportunidad a este trabajo, podria ser una herramienta extremadamente util en todo el sector financiero (principalmente en el mercado de divisas), tambien en el sector comercial (exportaciones e importaciones) y en el de inversion. Por otro lado, algunas sugerencias que proponemos para futuros trabajos como este es la implementacion de mas pruebas, mas conceptos, mas estadisticos; esto para darle una certeza y confiabilidad mayor al resultado del modelo.
ENES UNAM LEON
ENCONOMETRIA 2
PROFESOR: MIGUEL ZEPEDA