GENTERA (GENTERA.MX)
GENTERA.MXNace como un grupo de empresas que comparten la misma esencia, profundo interés en la persona, conocimiento del mercado que atienden, innovación de productos y oferta de valor a largo plazo a través de las microfinanzas: crédito, ahorro, seguros, medios de pagos y educación financiera, donde Carlos Labarthe es presidente Ejecutivo del grupo. Con la finalidad de tener más flexibilidad en la oferta de sus servicios y productos financieros, Grupo Compartamos se transformó en Gentera, empresa que concentrará sus seis empresas: Compartamos Banco (México).- Líder de la industria de microfinanzas en la región con 2.5 millones de clientes Compartamos Financiera (Perú).-Ofrece productos de microcrédito, microseguros y ahorro con 161,000 clientes Compartamos S.A. (Guatemala).- Atiende con microcréditos a 58,000 clientes Aterna (México-Guatemala).- líder de la industria de microseguros con 3.2 millones de pólizas de vida. Yastás (México).- Administrador de comisionistas con 3,200 puntos transaccionales en Puebla, Veracruz, Estado de México y Oaxaca. Fundación Gentera.- Desarrolla modelos innovadores y disruptivos de salud y educación con alto impacto social. El grupo concentrará a seis empresas de microcréditos y microseguros en México, Perú y Guatemala.[1].
GRÁFICAS DE PRECIOS DE CIERRE A NIVELES Y RENDIMIENTOS
# Gráficas a niveles (precios de cierre)
par(mfrow=c(1,1))
ggplot(GENTERA.MX, aes(x=Index, y=GENTERA.MX)) +
ggtitle("Precio de Cierre GENTERA.MX: enero 2013 - octubre 2019") +
geom_line(color="magenta") +
xlab("Fecha")+
ylab("Precio de cierre")
Podemos observar en la gráfica de los precios de cierre que de enero del 2013 mantiene una tendencia alcista, tiene su mayor auge a finales del 2016,sin embargo a partir de enero del 2017 su tendencia es a la baja teniendo una caída dramática a inicios del 2018 ya que en el 2017 representó uno de los más retadores para la compañía, en el cual la subsidiaria en México de Gentera experimentó una contracción en su cartera de crédito.[2].
#Grafica en rendimientos
ggplot(GENTERA.MX_R, aes(x=Index, y=GENTERA.MX_R)) +
ggtitle("GENTERA.MX en rendimientos: enero 2013 - october 2019") +
geom_line(color="navyblue") +
xlab("Fecha")+
ylab("Rendimiento")
La gráfica de serie en rendimientos presenta una moyor concentración de volatilidad en los primeros meses del 2016, ya que aún se encuentra en vías de expansión donde busca elevar su portafolio de crédito por hasta 17% en 2016.[3].
HISTOGRAMAS Y GRÁFICAS Q-Q A NIVELES Y RENDIMIENTOS
#Gráficos de Histogramas a niveles.
par(mfrow=c(1,1))
hist(GENTERA.MX,
main="Histograma de GENTERA.MX a niveles", col="lightslateblue", xlab="GENTERA.MX puntos base de cierre",
breaks=50, prob = TRUE)
lines(density(GENTERA.MX))
En la gráfica del histograma a niveles observamos que su comportamiento es irregular, tiene intervalos de crecimiento y de decrecimiento y no se ajusta mucho a una distribución normal.
#Gráficos de Histogramas a rendimientos.
hist(GENTERA.MX_R,
main="Histograma de rendimientos GENTERA.MX", col="seagreen4", xlab="GENTERA.MX rendimientos", breaks=50, prob = TRUE)
lines(density(GENTERA.MX))
En la gráfica del histograma de rendimientos se puede ver claramente que su distribucion ya se ajusta a una distribución normal, aunque no es muy cimétrica respecto a la media.
#Gráfico QQ
par(mfrow=c(1,1))
qqnorm(GENTERA.MX_R, xlab="Cuantiles teóricos", ylab= "Muestra de cuantiles",
main= "Gráfico Q-Q GENTERA.MX a niveles")
qqline(GENTERA.MX)
En la gráfica Q-Q (Quantil-Quantil) a niveles nos permite observar cuan cerca está la distribución de un conjunto de datos a alguna distribución ideal. por lo que en nuestro caso vemos que no se ajusta a una distribución ideal y presenta colas más cortas que lo esperable para nuestra distribución.
#Gráfica QQ en rendimientos.
par(mfrow=c(1,1))
qqnorm(GENTERA.MX_R, xlab="Cuantiles teóricos", ylab= "Muestra de cuantiles",
main= "Gráfico Q-Q GENTERA.MX en rendimientos")
qqline(GENTERA.MX_R)
En la gráfica Q-Q (Quantil-Quantil) de rendimientos que su distribución es más normal.
PRUEBAS DE RAICES UNITARIAS: PRUEBA DFA, PP y KPS
### PRUEBAS DE RAICES UNITARIAS
## PRUEBA DFA.
# A niveles (precio de cierre)
adf.test(GENTERA.MX)
##
## Augmented Dickey-Fuller Test
##
## data: GENTERA.MX
## Dickey-Fuller = -1.9122, Lag order = 11, p-value = 0.6155
## alternative hypothesis: stationary
Los datos anteriores es debido a que se realizó prueba de raíces unitarias Dickey Fuller Aumentada (DFA) a niveles, lo cual nos arroja un p-value = 0.6155 por lo que la Ho no se rechaza indicando que la serie es estacionaria.
### PRUEBAS DE RAICES UNITARIAS
## PRUEBA PP.
# A niveles (precio de cierre)
PP.test(GENTERA.MX, lshort = TRUE)
##
## Phillips-Perron Unit Root Test
##
## data: GENTERA.MX
## Dickey-Fuller = -1.9097, Truncation lag parameter = 8, p-value =
## 0.6165
En esta prueba de raíces unitarias de Phillips Perron (PP) a niveles, vemos que el valor arrojado de p-value = 0.6165 por lo cual nos indica estacionalidad con tendencia de la serie.
# En rendimientos
adf.test(GENTERA.MX_R)
##
## Augmented Dickey-Fuller Test
##
## data: GENTERA.MX_R
## Dickey-Fuller = -11.965, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary
El valor arrojado en la prueba de raíces unitarias Dickey Fuller Aumentada (DFA) de rendimientos nos arroja un p-value = 0.01 que indica que la serie en realidad no es estacionaria.
# En rendimientos
PP.test(GENTERA.MX_R, lshort = TRUE)
##
## Phillips-Perron Unit Root Test
##
## data: GENTERA.MX_R
## Dickey-Fuller = -41.311, Truncation lag parameter = 8, p-value =
## 0.01
En esta prueba de raíces unitarias de Phillips Perron (PP) en rendimientos se observa un p-value = 0.01 indicando que tiene estacionalidad con raíz unitaria.
## PRUEBA KPSS
# A niveles (precio de cierre)
kpss.test(GENTERA.MX)
##
## KPSS Test for Level Stationarity
##
## data: GENTERA.MX
## KPSS Level = 6.1354, Truncation lag parameter = 8, p-value = 0.01
** En la prueba KPSS a niveles entrega un valor de p-value = 0.01, por lo tanto la serie no presenta una tendencia estacional.**
# En rendimientos
kpss.test(GENTERA.MX_R)
##
## KPSS Test for Level Stationarity
##
## data: GENTERA.MX_R
## KPSS Level = 0.22836, Truncation lag parameter = 8, p-value = 0.1
En la prueba de KPSS en rendimientos nos da un valor de p-value = 0.1 lo cual rechazamos la Ho y se acepta que la serie tiene estacionalidad.
PRONOSTICOS CON MODELOS ARIMA
### MODELOS ARIMA ###
#Verifica los componentes de autocorrelación ACF y PACF
GENTERA.MX %>% diff() %>% ggtsdisplay(main="Función de Autocorrelación (MA) y Función de Autocorrelación parcial (AR)")
Se puede observar en los gráficos que existe una fuerte variación de nuestra serie, al igual que analizamos en las pruebas anteriores, al aplicar el ARIMA intentamos eliminar la fuerte variación no estacionaria.
#-------------------------autoarima--------------------------#
fit1<-auto.arima(GENTERA.MX, seasonal=FALSE) #NOS DA EL MEJOR MODELO ARIMA SEGÚN R
fit1
## Series: GENTERA.MX
## ARIMA(0,1,2)
##
## Coefficients:
## ma1 ma2
## -0.0562 -0.0645
## s.e. 0.0242 0.0246
##
## sigma^2 estimated as 0.2435: log likelihood=-1208.93
## AIC=2423.85 AICc=2423.86 BIC=2440.16
#Revisa autocorrelación en residuales y aplica prueba de Ljung Box
#H0: Los residuales se distribuyen normalmente
checkresiduals(fit1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,1,2)
## Q* = 10.002, df = 8, p-value = 0.2649
##
## Model df: 2. Total lags used: 10
La prueba de Box-Ljung nos dice que nuestraserie de observaciones en el periódo analizado son aleatorios en en los retardos, arrojando un valor de p-value = 0.2649 haciéndo que se rechace la Ho, los residuales se distribuyen normalmente y se puede corroborar con el histograma.
#Gráfico del pronóstico
fit1 %>% forecast(h=12) %>% autoplot(200)
Se observa un precio de 2423.85 pesos, en un periódo de tiempo del 9 de octubre del 2019.
#Comprobar estabilidad y estacionariedad del modelo con raíces invertidas
autoplot(fit1, title = "Raices invertidas sobre AR y MA")
En el gráfico se puede ver que los puntos no salen del límite de la circunferencia, esto quiere decir que en efecto hay estabilidad en nuestra serie y tiene estacionariedad.
#Muestra criterio de información
fit1[["aic"]]
## [1] 2423.85
Se procede a realizar una estimación de las dos propuestas de ARIMA, donde se buscará una mejor estimación a la propuesta por el AUTOARIMA.
fit_pro1 = arima(GENTERA.MX, order=c(6,1,6))
fit_pro1
##
## Call:
## arima(x = GENTERA.MX, order = c(6, 1, 6))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ar6 ma1 ma2
## -0.208 0.1932 -0.5933 0.5315 0.4087 -0.3299 0.1519 -0.2533
## s.e. NaN NaN NaN NaN NaN NaN NaN NaN
## ma3 ma4 ma5 ma6
## 0.5759 -0.5976 -0.3854 0.3886
## s.e. NaN NaN NaN NaN
##
## sigma^2 estimated as 0.2394: log likelihood = -1196.23, aic = 2418.45
checkresiduals(fit_pro1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(6,1,6)
## Q* = 2.1698, df = 3, p-value = 0.5379
##
## Model df: 12. Total lags used: 15
El El resultado de la prueba Ljung-Box nos da un p-value = 0.5379, entonces no se rechaza la Ho, los residuales se distribuyen normalmente y se puede corroborar con el histograma.
fit_pro1 %>% forecast(h=12) %>% autoplot(200)
forecast(fit_pro1, h=12)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1700 16.84544 16.21838 17.47250 15.88643 17.80445
## 1701 16.83243 15.97011 17.69475 15.51363 18.15123
## 1702 16.91773 15.88870 17.94676 15.34397 18.49150
## 1703 16.92474 15.75788 18.09161 15.14018 18.70931
## 1704 16.88138 15.60140 18.16136 14.92382 18.83894
## 1705 16.83174 15.44140 18.22208 14.70539 18.95808
## 1706 16.88755 15.39319 18.38191 14.60212 19.17298
## 1707 16.93496 15.34002 18.52989 14.49572 19.37420
## 1708 16.91701 15.23347 18.60055 14.34226 19.49177
## 1709 16.85037 15.08094 18.61980 14.14426 19.55648
## 1710 16.85631 15.00291 18.70972 14.02177 19.69085
## 1711 16.91723 14.98000 18.85447 13.95449 19.87998
autoplot(fit_pro1, title = "Raices invertidas sobre AR y MA")
** Podemos ver en el gráfico que los puntos no salen del límite de la circunferencia, pese a que dos están casi al límite, esto quiere decir que en efecto hay estabilidad en nuestra serie y tiene estacionariedad. **
#Muestra criterio de información
fit_pro1[["aic"]]
## [1] 2418.454
En este criterio de información nos arroja un valor de 2418.454, logrando que sea más un valor más bajo que el AUTOARIMA
El precio de cierre para el 09 de octubre del 2019 en este pronóstico es de 2418.45 pesos.
fit_pro2 = arima(GENTERA.MX, order=c(4,1,5))
fit_pro2
##
## Call:
## arima(x = GENTERA.MX, order = c(4, 1, 5))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2 ma3 ma4
## -0.0407 -0.5060 -0.5026 0.3381 -0.0146 0.4528 0.4602 -0.4314
## s.e. 0.6670 0.2913 0.4953 0.4827 0.6681 0.2514 0.4544 0.4516
## ma5
## 0.0054
## s.e. 0.0842
##
## sigma^2 estimated as 0.2395: log likelihood = -1196.67, aic = 2413.35
checkresiduals(fit_pro2)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(4,1,5)
## Q* = 2.3197, df = 3, p-value = 0.5088
##
## Model df: 9. Total lags used: 12
El El resultado de la prueba Ljung-Box nos da un p-value = 0.5088, entonces no se rechaza la Ho, los residuales se distribuyen normalmente y se puede corroborar con el histograma.
fit_pro2 %>% forecast(h=12) %>% autoplot(200)
forecast(fit_pro2, h=12)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1700 16.85251 16.22528 17.47974 15.89324 17.81177
## 1701 16.83777 15.97490 17.70064 15.51812 18.15742
## 1702 16.91956 15.89058 17.94854 15.34588 18.49325
## 1703 16.92545 15.75737 18.09354 15.13902 18.71189
## 1704 16.87518 15.59321 18.15715 14.91457 18.83578
## 1705 16.82815 15.43675 18.21955 14.70019 18.95611
## 1706 16.88020 15.38555 18.37485 14.59433 19.16607
## 1707 16.92914 15.33684 18.52144 14.49392 19.36435
## 1708 16.90745 15.22872 18.58617 14.34006 19.47484
## 1709 16.84151 15.08033 18.60268 14.14802 19.53500
## 1710 16.84817 15.00565 18.69068 14.03028 19.66605
## 1711 16.90871 14.98574 18.83168 13.96778 19.84964
autoplot(fit_pro2, title = "Raices invertidas sobre AR y MA")
Podemos ver nuevamente en el gráfico, que los puntos no salen del límite de la circunferencia, pese a que dos están casi al límite, esto quiere decir que en efecto hay estabilidad en nuestra serie y tiene estacionariedad.
#Muestra criterio de información
fit_pro2[["aic"]]
## [1] 2413.346
En este criterio de información se logró arrojar un valor aún menor al del AUTOARIMA , por lo que se determina que ésta propuesta (4,1,5) es la mejor. El precio de cierre del 09 de octubre de 2019 obtenido por este modelo es de 2413.35 pesos.
COMPARACIÓN DE MODELOS ARIMA
| Fecha | Modelo | Precio Real | Precio estimado | Criterio de información |
|---|---|---|---|---|
| 09-oct-2019 | AUTOARIMA (0,1,2) | $2423.85 | $2423.86 | 2440.16 |
| 09-oct-2019 | ARIMA(6,1,6) | $2418.45 | $2.1698 | 2418.454 |
| 09-oct-2019 | ARIMA(4,1,5) | $2413.35 | $2.3197 | 2413.346 |
El mejor modelo ARIMA fue el (4,1,5), dando los mejores resultados tanto en criterio de información como en diferencial, con un valor de -1196.67.|
MODELOS ARIMA CON COMPONENTE ESTACIONAL (SARIMA)
fit_pro2 = arima(GENTERA.MX, order=c(4,1,5))
fit_pro2
##
## Call:
## arima(x = GENTERA.MX, order = c(4, 1, 5))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2 ma3 ma4
## -0.0407 -0.5060 -0.5026 0.3381 -0.0146 0.4528 0.4602 -0.4314
## s.e. 0.6670 0.2913 0.4953 0.4827 0.6681 0.2514 0.4544 0.4516
## ma5
## 0.0054
## s.e. 0.0842
##
## sigma^2 estimated as 0.2395: log likelihood = -1196.67, aic = 2413.35
**Podemos ver los resultados del mejor modelo estimado.
GENTERA.MX2<-getSymbols('^MXX', from="2013-01-01", to="2019-10-01", auto.assign =F ,src='yahoo',periodicity="monthly") [,4] #Mantiene solo el precio de cierre
kpss.test(GENTERA.MX2)
##
## KPSS Test for Level Stationarity
##
## data: GENTERA.MX2
## KPSS Level = 0.82812, Truncation lag parameter = 3, p-value = 0.01
Esta prueba nos arroja un valor p-value = 0.01, indicando que se rechaza la HO, entonces la serie no es estacionaria, lo podemos comprobar al observar el siguiente gráfico.
autoplot(GENTERA.MX2)
Se observa que la serie no es estable en nuestro periódo de análisis y no es constante en su media.
#Tomo componente estacional anual (12 meses)
diff12 = diff(GENTERA.MX2,12)
Acf(diff12, 48)
Los valores del modelo SARIMA (4,1,5,1,1,1,12)
sarima1 = arima(GENTERA.MX2, order = c(4,1,5), seasonal = list(order = c(1,1,1), period = 12))
sarima1
##
## Call:
## arima(x = GENTERA.MX2, order = c(4, 1, 5), seasonal = list(order = c(1, 1, 1),
## period = 12))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2 ma3 ma4
## -0.1596 0.8077 -0.5043 -0.6804 0.0336 -0.965 0.5012 0.5487
## s.e. NaN NaN NaN NaN NaN NaN NaN NaN
## ma5 sar1 sma1
## 0.0487 0.4984 -0.9978
## s.e. NaN 0.1838 1.0238
##
## sigma^2 estimated as 1949535: log likelihood = -598.58, aic = 1221.16
Esta vez no ha arrojado un criterio de información considerablemente menor al modelo original.
predict(sarima1, n.ahead=20)
## $pred
## Time Series:
## Start = 82
## End = 101
## Frequency = 1
## [1] 40997.83 39637.37 40226.84 41051.16 39373.08 39188.00 39580.85
## [8] 38385.69 39366.11 38998.13 40468.37 40734.57 39001.59 37233.89
## [15] 37211.10 37306.01 35996.23 36460.68 37375.77 36797.35
##
## $se
## Time Series:
## Start = 82
## End = 101
## Frequency = 1
## [1] 1500.409 1965.410 2258.011 2447.428 2553.636 2721.170 2877.678
## [8] 3165.597 3418.232 3718.394 3914.202 4080.702 4468.658 4770.506
## [15] 5022.153 5280.798 5526.442 5836.678 6138.070 6467.260
autoplot(sarima1, title = "Raices invertidas sobre AR y MA")
Se comprueba que existe estacionariedad y es una serie estable, nuestros puntos se encuentran dentro de la circunferencia y algunos al límite de lo permitido.
checkresiduals(sarima1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(4,1,5)(1,1,1)[12]
## Q* = 3.8461, df = 3, p-value = 0.2786
##
## Model df: 11. Total lags used: 14
**Se mantiene el comportamiento de los residuales siguiéndo una disribución normal, en el correlograma se mantiene perfectamente dentro del límite. Al ver la prueba de Ljung-Box nos confirma la normalidad con un valor p-value = 0.2786, aceptando la HO.
sarima1%>% forecast(h=20) %>% autoplot()
sarima1[["aic"]]
## [1] 1221.163
Nos arrojó un criterio de información de 1221.163, siendo éste menor que el mejor modelo ARIMA normal y así superándolo.
validacion<- forecast(sarima1)
val1 <- data.frame(data=as.matrix(fitted(validacion)), date=time(fitted(validacion)))
autoplot(validacion) + geom_line(data = val1,
aes(date,data),
col = "deeppink")
Aquí observamos que el comportamiento de asemeja al estimado y así demostrando que es un buen modelo.
accuracy(validacion)
## ME RMSE MAE MPE MAPE MASE
## Training set 50.3364 1279.453 954.0232 0.08887001 2.127857 0.8029997
## ACF1
## Training set 0.006175745
Se concluye que el mejor modelo es el estimado por el modelo normal ARIMA (4,1,5), teniendo el comparativo del modelo AUTOARIMA (1,1,1), sin embargo la estimación del modelo SARIMA lo supera, logrando obtener mejor su estimación y ajustándose al modelo original.
[1] https://www.forbes.com.mx/grupo-compartamos-se-transforma-en-gentera/ [2] https://www.gentera.com.mx/wcm/connect/600fa807-cb84-4025-a570-0271781674f6/Reporte+Trimestral+4T17+%28ESP%29.pdf?MOD=AJPERES&CONVERT_TO=url&CACHEID=ROOTWORKSPACE-600fa807-cb84-4025-a570-0271781674f6-mE4kp-4 [3] https://www.forbes.com.mx/gentera-busca-elevar-su-portafolio-de-credito-por-hasta-17-en-2016/