GENTERA (GENTERA.MX)

LOGOTIPO DE 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].

LOGOTIPO DE GENTERA.MX

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.

Estimación del modelo AUTOARIMA.

#-------------------------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.

#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.

Se muestra el gráfico para comprobar estabilidad y estacionariedad del modelo con raíces invertidas.

#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.

Datos que nos arroja el siguiente modelo de criterio de información.

#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.

Primer propueta en el modelo es un ARIMA (6,1,6), arrojando los siguientes resultados

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.

Gráfica del pronóstico.

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.

Segunda propueta en el modelo es un ARIMA (4,1,5), arrojando los siguientes resultados

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.

Gráfica del pronóstico.

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)

ARIMAS ESTACIONALES

Mejor modelo

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.

MODELO ARIMAS ESTACIONALES

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.

Para obtener los valores pronosticados

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.

Gráfico del pronóstico

sarima1%>% forecast(h=20) %>% autoplot()

Muestra criterio de información

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.

Validación del modelo

validacion<- forecast(sarima1)


val1 <- data.frame(data=as.matrix(fitted(validacion)), date=time(fitted(validacion)))

Ajuste del modelo

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/