Modelo Prophet por AFPs

Instalar y cargar las librerías

chooseCRANmirror(ind = 1)
install.packages("tidyr")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'tidyr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'tidyr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\massi\AppData\Local\R\win-library\4.3\00LOCK\tidyr\libs\x64\tidyr.dll
## to C:\Users\massi\AppData\Local\R\win-library\4.3\tidyr\libs\x64\tidyr.dll:
## Permission denied
## Warning: restored 'tidyr'
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("readxl")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'readxl' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'readxl'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\massi\AppData\Local\R\win-library\4.3\00LOCK\readxl\libs\x64\readxl.dll
## to C:\Users\massi\AppData\Local\R\win-library\4.3\readxl\libs\x64\readxl.dll:
## Permission denied
## Warning: restored 'readxl'
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("prophet")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'prophet' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'prophet'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\massi\AppData\Local\R\win-library\4.3\00LOCK\prophet\libs\x64\prophet.dll
## to C:\Users\massi\AppData\Local\R\win-library\4.3\prophet\libs\x64\prophet.dll:
## Permission denied
## Warning: restored 'prophet'
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("dplyr")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'dplyr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'dplyr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\massi\AppData\Local\R\win-library\4.3\00LOCK\dplyr\libs\x64\dplyr.dll
## to C:\Users\massi\AppData\Local\R\win-library\4.3\dplyr\libs\x64\dplyr.dll:
## Permission denied
## Warning: restored 'dplyr'
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("ggplot2")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("Metrics")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'Metrics' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
install.packages("caret")
## Installing package into 'C:/Users/massi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'caret' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'caret'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\massi\AppData\Local\R\win-library\4.3\00LOCK\caret\libs\x64\caret.dll
## to C:\Users\massi\AppData\Local\R\win-library\4.3\caret\libs\x64\caret.dll:
## Permission denied
## Warning: restored 'caret'
## 
## The downloaded binary packages are in
##  C:\Users\massi\AppData\Local\Temp\RtmpiYs6oC\downloaded_packages
library (readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(prophet)
## Warning: package 'prophet' was built under R version 4.3.3
## Loading required package: Rcpp
## Loading required package: rlang
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## 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(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(Metrics)
## Warning: package 'Metrics' was built under R version 4.3.3
## 
## Attaching package: 'Metrics'
## The following object is masked from 'package:rlang':
## 
##     ll
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:Metrics':
## 
##     precision, recall

Carga de datos

setwd("C:/Users/massi/OneDrive/Documents/MASTER BIG DATA E INTELIGENCIA DE NEGOCIOS/TFM")
Data <- read_excel("Base de Datos 18-23 (AFP).xlsx")
print(Data)
## # A tibble: 72 × 8
##    MES                 ATLÁNTICO `SCOTIA CRECER` `JMMB-BDI` POPULAR RESERVAS
##    <dttm>                  <dbl>           <dbl>      <dbl>   <dbl>    <dbl>
##  1 2018-01-01 00:00:00    0.124           0.105      0.0915  0.108    0.110 
##  2 2018-02-01 00:00:00    0.125           0.107      0.0884  0.111    0.114 
##  3 2018-03-01 00:00:00    0.117           0.103      0.0888  0.106    0.110 
##  4 2018-04-01 00:00:00    0.115           0.103      0.0897  0.107    0.110 
##  5 2018-05-01 00:00:00    0.113           0.101      0.0905  0.104    0.108 
##  6 2018-06-01 00:00:00    0.105           0.0981     0.0919  0.1      0.104 
##  7 2018-07-01 00:00:00    0.103           0.0978     0.092   0.0993   0.103 
##  8 2018-08-01 00:00:00    0.0971          0.0944     0.0935  0.0946   0.0995
##  9 2018-09-01 00:00:00    0.0953          0.0929     0.0971  0.0922   0.0965
## 10 2018-10-01 00:00:00    0.0896          0.0884     0.103   0.0882   0.0905
## # ℹ 62 more rows
## # ℹ 2 more variables: ROMANA <dbl>, SIEMBRA <dbl>

Transformación de los datos por AFP y particionar la data.

Data$MES <- as.Date(Data$MES, format = "%m/%d/%Y")
str(Data)
## tibble [72 × 8] (S3: tbl_df/tbl/data.frame)
##  $ MES          : Date[1:72], format: "2018-01-01" "2018-02-01" ...
##  $ ATLÁNTICO    : num [1:72] 0.123 0.125 0.117 0.115 0.113 ...
##  $ SCOTIA CRECER: num [1:72] 0.105 0.107 0.103 0.103 0.101 ...
##  $ JMMB-BDI     : num [1:72] 0.0915 0.0884 0.0888 0.0897 0.0905 ...
##  $ POPULAR      : num [1:72] 0.108 0.111 0.106 0.107 0.104 ...
##  $ RESERVAS     : num [1:72] 0.11 0.114 0.11 0.11 0.108 ...
##  $ ROMANA       : num [1:72] 0.113 0.112 0.108 0.107 0.105 ...
##  $ SIEMBRA      : num [1:72] 0.115 0.12 0.117 0.117 0.114 ...

Modelo AFP Atlántico

AFP_Atlantico <- Data[, c("MES", "ATLÁNTICO")]
AFP_Atlantico <- AFP_Atlantico %>% rename(Rentabilidad = ATLÁNTICO)

datos_prophet_AFP_Atlantico <- data.frame(ds = AFP_Atlantico$MES, y = AFP_Atlantico$Rentabilidad)

train_AFP_Atlantico <- subset(datos_prophet_AFP_Atlantico, ds < as.Date("2023-01-01"))
test_AFP_Atlantico <- subset(datos_prophet_AFP_Atlantico, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Atlantico <- prophet(train_AFP_Atlantico)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Atlantico <- make_future_dataframe(modelo_prophet_Atlantico, periods = nrow(test_AFP_Atlantico))
predicciones_Atlantico <- predict(modelo_prophet_Atlantico, futuro_Atlantico)
y_true <- test_AFP_Atlantico$y
y_pred <- predicciones_Atlantico$yhat

Comprobar el modelo Prohet para AFP Atlantico

rmse_value_Atlantico <- rmse(y_true, y_pred)
mae_value_Atlantico <- mae(y_true, y_pred)
mape_value_Atlantico <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Atlantico, "\n")
## RMSE:  0.02507188
cat("MAE: ", mae_value_Atlantico, "\n")
## MAE:  0.02345524
cat("MAPE: ", mape_value_Atlantico, "%\n")
## MAPE:  32.21294 %

Visualizar modelo

prophet_plot_Atlantico <- plot(modelo_prophet_Atlantico, predicciones_Atlantico)
print(prophet_plot_Atlantico)

test_AFP_Atlantico$ds <- as.POSIXct(test_AFP_Atlantico$ds)
prophet_plot_Atlantico$ds <- as.POSIXct(prophet_plot_Atlantico$ds)
prophet_plot_Atlantico + 
geom_line(data = test_AFP_Atlantico, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Atlántico", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

## Modelo AFP Crecer

AFP_Crecer <- Data[, c("MES", "SCOTIA CRECER")]
AFP_Crecer <- AFP_Crecer %>%rename(Rentabilidad = `SCOTIA CRECER`)
datos_prophet_AFP_Crecer <- data.frame(ds = AFP_Crecer$MES, y = AFP_Crecer$Rentabilidad)


train_AFP_Crecer <- subset(datos_prophet_AFP_Crecer, ds < as.Date("2023-01-01"))
test_AFP_Crecer <- subset(datos_prophet_AFP_Crecer, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Crecer <- prophet(train_AFP_Crecer)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Crecer <- make_future_dataframe(modelo_prophet_Crecer, periods = nrow(test_AFP_Crecer))
predicciones_Crecer <- predict(modelo_prophet_Crecer, futuro_Crecer)
y_true <- test_AFP_Crecer$y
y_pred<- predicciones_Crecer$yhat

Comprobar el modelo Prohet para AFP Crecer

rmse_value_Crecer <- rmse(y_true, y_pred)
mae_value_Crecer <- mae(y_true, y_pred)
mape_value_Crecer<- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Crecer, "\n")
## RMSE:  0.04319033
cat("MAE: ", mae_value_Crecer, "\n")
## MAE:  0.03505047
cat("MAPE: ", mape_value_Crecer, "%\n")
## MAPE:  50.19683 %

Visualizar modelo

prophet_plot_Crecer <- plot(modelo_prophet_Crecer, predicciones_Crecer)
print(prophet_plot_Crecer)

test_AFP_Crecer$ds <- as.POSIXct(test_AFP_Crecer$ds)
prophet_plot_Crecer$ds <- as.POSIXct(prophet_plot_Crecer$ds)
prophet_plot_Crecer + 
geom_line(data = test_AFP_Crecer, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Scotia Crecer", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

Modelo AFP JMMB

AFP_JMMB <- Data[, c("MES", "JMMB-BDI")]
AFP_JMMB <- AFP_JMMB %>% rename(Rentabilidad = `JMMB-BDI`)
datos_prophet_AFP_JMMB <- data.frame(ds = AFP_JMMB$MES, y = AFP_JMMB$Rentabilidad)

train_AFP_JMMB <- subset(datos_prophet_AFP_JMMB, ds < as.Date("2023-01-01"))
test_AFP_JMMB <- subset(datos_prophet_AFP_JMMB, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_JMMB <- prophet(train_AFP_JMMB)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_JMMB <- make_future_dataframe(modelo_prophet_JMMB, periods = nrow(test_AFP_JMMB))
predicciones_JMMB <- predict(modelo_prophet_JMMB, futuro_JMMB)
y_true <- test_AFP_JMMB$y
y_pred <- predicciones_JMMB$yhat

Comprobar el modelo Prohet para AFP JMMB

rmse_value_JMMB <- rmse(y_true, y_pred)
mae_value_JMMB <- mae(y_true, y_pred)
mape_value_JMMB <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_JMMB, "\n")
## RMSE:  0.01593536
cat("MAE: ", mae_value_JMMB, "\n")
## MAE:  0.01286068
cat("MAPE: ", mape_value_JMMB, "%\n")
## MAPE:  14.50026 %

Visualizar modelo

prophet_plot_JMMB <- plot(modelo_prophet_JMMB, predicciones_JMMB)
print(prophet_plot_JMMB)

test_AFP_JMMB$ds <- as.POSIXct(test_AFP_JMMB$ds)
prophet_plot_JMMB$ds <- as.POSIXct(prophet_plot_JMMB$ds)
prophet_plot_JMMB + 
geom_line(data = test_AFP_JMMB, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP JMMB-BDI", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

## Modelo AFP POPULAR

AFP_Popular <- Data[, c("MES", "POPULAR")]
AFP_Popular <- AFP_Popular%>% rename(Rentabilidad = POPULAR)
datos_prophet_AFP_Popular <- data.frame(ds = AFP_Popular$MES, y = AFP_Popular$Rentabilidad)
train_AFP_Popular <- subset(datos_prophet_AFP_Popular, ds < as.Date("2023-01-01"))
test_AFP_Popular <- subset(datos_prophet_AFP_Popular, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Popular <- prophet(train_AFP_Popular)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Popular <- make_future_dataframe(modelo_prophet_Popular, periods = nrow(test_AFP_Popular))
predicciones_Popular <- predict(modelo_prophet_Popular, futuro_Popular)
y_true <- test_AFP_Popular$y
y_pred <- predicciones_Popular$yhat

Comprobar el modelo Prohet

rmse_value_Popular <- rmse(y_true, y_pred)
mae_value_Popular <- mae(y_true, y_pred)
mape_value_Popular <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Popular, "\n")
## RMSE:  0.03436393
cat("MAE: ", mae_value_Popular, "\n")
## MAE:  0.02793296
cat("MAPE: ", mape_value_Popular, "%\n")
## MAPE:  41.88054 %

Visualizar modelo

prophet_plot_Popular <- plot(modelo_prophet_Popular, predicciones_Popular)
print(prophet_plot_Popular)

test_AFP_Popular$ds <- as.POSIXct(test_AFP_Popular$ds)
prophet_plot_Popular$ds <- as.POSIXct(prophet_plot_Popular$ds)
prophet_plot_Popular + 
geom_line(data = test_AFP_Popular, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Popular", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

## Modelo AFP Reservas

AFP_Reservas <- Data[, c("MES", "RESERVAS")]
AFP_Reservas <- AFP_Reservas %>% rename(Rentabilidad = RESERVAS)
datos_prophet_AFP_Reservas <- data.frame(ds = AFP_Reservas$MES, y = AFP_Reservas$Rentabilidad)
train_AFP_Reservas <- subset(datos_prophet_AFP_Reservas, ds < as.Date("2023-01-01"))
test_AFP_Reservas <- subset(datos_prophet_AFP_Reservas, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Reservas <- prophet(train_AFP_Reservas)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Reservas <- make_future_dataframe(modelo_prophet_Reservas, periods = nrow(test_AFP_Reservas))
predicciones_Reservas <- predict(modelo_prophet_Reservas, futuro_Reservas)
y_true <- test_AFP_Reservas$y
y_pred <- predicciones_Reservas$yhat

Comprobar el modelo Prohet

rmse_value_Reservas <- rmse(y_true, y_pred)
mae_value_Reservas <- mae(y_true, y_pred)
mape_value_Reservas <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Reservas, "\n")
## RMSE:  0.02237008
cat("MAE: ", mae_value_Reservas, "\n")
## MAE:  0.01853208
cat("MAPE: ", mape_value_Reservas, "%\n")
## MAPE:  25.30668 %

Visualizar modelo

prophet_plot_Reservas <- plot(modelo_prophet_Reservas, predicciones_Reservas)
print(prophet_plot_Reservas)

test_AFP_Reservas$ds <- as.POSIXct(test_AFP_Reservas$ds)
prophet_plot_Reservas$ds <- as.POSIXct(prophet_plot_Reservas$ds)
prophet_plot_Reservas+ 
geom_line(data = test_AFP_Reservas, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Reservas", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

## Modelo AFP Romana

AFP_Romana <- Data[, c("MES", "ROMANA")]
AFP_Romana <- AFP_Romana %>% rename(Rentabilidad = ROMANA)
datos_prophet_AFP_Romana <- data.frame(ds = AFP_Romana$MES, y = AFP_Romana$Rentabilidad)
train_AFP_Romana <- subset(datos_prophet_AFP_Romana, ds < as.Date("2023-01-01"))
test_AFP_Romana <- subset(datos_prophet_AFP_Romana, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Romana <- prophet(train_AFP_Romana)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Romana <- make_future_dataframe(modelo_prophet_Romana, periods = nrow(test_AFP_Romana))
predicciones_Romana <- predict(modelo_prophet_Romana, futuro_Romana)
y_true <- test_AFP_Romana$y
y_pred <- predicciones_Romana$yhat

Comprobar el modelo Prohet

rmse_value_Reservas <- rmse(y_true, y_pred)
mae_value_Reservas <- mae(y_true, y_pred)
mape_value_Reservas <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Reservas, "\n")
## RMSE:  0.03485193
cat("MAE: ", mae_value_Reservas, "\n")
## MAE:  0.03255067
cat("MAPE: ", mape_value_Reservas, "%\n")
## MAPE:  47.7113 %

Visualizar modelo

prophet_plot_Romana <- plot(modelo_prophet_Romana, predicciones_Romana)
print(prophet_plot_Romana)

test_AFP_Romana$ds <- as.POSIXct(test_AFP_Romana$ds)
prophet_plot_Romana$ds <- as.POSIXct(prophet_plot_Romana$ds)
prophet_plot_Romana+ 
geom_line(data = test_AFP_Romana, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Romana", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

## Modelo AFP Siembra

AFP_Siembra <- Data[, c("MES", "SIEMBRA")]
AFP_Siembra <- AFP_Siembra %>% rename(Rentabilidad = SIEMBRA)
datos_prophet_AFP_Siembra <- data.frame(ds = AFP_Siembra$MES, y = AFP_Siembra$Rentabilidad)
train_AFP_Siembra <- subset(datos_prophet_AFP_Siembra, ds < as.Date("2023-01-01"))
test_AFP_Siembra <- subset(datos_prophet_AFP_Siembra, ds >= as.Date("2023-01-01"))

Probar el modelo Prophet

modelo_prophet_Siembra <- prophet(train_AFP_Siembra)
## Disabling weekly seasonality. Run prophet with weekly.seasonality=TRUE to override this.
## Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.

Hacer predicciones

futuro_Siembra <- make_future_dataframe(modelo_prophet_Siembra, periods = nrow(test_AFP_Siembra))
predicciones_Siembra <- predict(modelo_prophet_Siembra, futuro_Siembra)
y_true <- test_AFP_Siembra$y
y_pred <- predicciones_Siembra$yhat

Comprobar el modelo Prohet

rmse_value_Siembra <- rmse(y_true, y_pred)
mae_value_Siembra <- mae(y_true, y_pred)
mape_value_Siembra <- mape(y_true, y_pred) *100

cat("RMSE: ", rmse_value_Siembra, "\n")
## RMSE:  0.03288557
cat("MAE: ", mae_value_Siembra, "\n")
## MAE:  0.02593149
cat("MAPE: ", mape_value_Siembra, "%\n")
## MAPE:  35.35854 %

Visualizar modelo

prophet_plot_Siembra <- plot(modelo_prophet_Siembra, predicciones_Siembra)
print(prophet_plot_Siembra)

test_AFP_Siembra$ds <- as.POSIXct(test_AFP_Siembra$ds)
prophet_plot_Siembra$ds <- as.POSIXct(prophet_plot_Siembra$ds)
prophet_plot_Siembra+ 
geom_line(data = test_AFP_Siembra, aes(x = ds, y = y), col = "red", lty = 2) +
labs(title = "Modelo AFP Siembra", x = "Tiempo", y = "Rentabilidad") +
theme_minimal()

```