Modelo Prophet de Facebook

Pronóstico aplicado al tipo de cambio USD/HNL

Prophet

Presentaremos la implementación de Facebook Prophet, así como sus principales hiperparámetros ajustados para generar el modelo predictivo, dicho modelo lo implementaremos para predecir el tipo de cambio de Honduras versus el dólar EE.UU (USD/HNL), considerando que esto será unicamente para conocer el funcionamiento del modelo, no para justificar que es el mejor modelo para realizar dicha tarea.

Desripción General del Modelo

Facebook Prophet es un modelo y una biblioteca que proporciona características tanto de modelos lineales generalizados (MLG) como se modelos aditivos (MA), principalmente extendiendo el MLG mediante el uso de funciones de suavizado no lineal. Fue especificado por Taylor y Letham en 2017.

Prophet es un software de código abierto lanzado por el equipo Core Data Science de Facebook. Está disponible para su descarga en CRAN y PyPl. En esta ocasión usaremos el lenguaje R para implementar el modelo.

Prophet funciona mejor con series temporales que tienen fuertes efectos estacionales y varias temporadas de datos históricos. Prophet es resistente a los datos faltantes y los cambios en la tendencia, y por lo general maneja bien los valores atípicos. Prophet esta diseñado especificamente para la predicción de series temporales de negocios

Su modeo aditivo que consta de cuatro componentes:

\[y(t) = g(t) + s(t) + h(t) + \epsilon_{t}\] donde,

  • \(g(t)\): Representa la tendencia y el objetivo es capturar la tendencia de la serie. Por ejemplo, es probable que la cantidad de vistas de anuncios de Facebook aumente con el tiempo a medida que más personas se unan a la red. Pero, ¿cuál sería la función exacta del aumento?
  • \(s(t)\): Es el componente de Estacionalidad. El número de anuncios también puede depender de la temporada. Por ejemplo, en el hemisferio norte durante los meses de verano, es probable que las personas pasen más tiempo al aire libre y menos tiempo frente a sus computadoras. Tales fluctuaciones estacionales pueden ser muy diferentes para diferentes series temporales de negocios. El segundo componente es, por lo tanto, una función que modela las tendencias estacionales.
  • \(h(t)\): representa los efectos de las vacaciones. Usamos la información para días festivos que tienen claro impacto en la mayoría de las series temporales comerciales. Tenga en cuenta que las vacaciones varían entre años, países, etc. y, por lo tanto la información debe proporcionarse explícitamente al modelo.
  • \(\epsilon_{t}\): es el término de error.Representa fluctuaciones aleatorias que el modelo no puede explicar. Como de costumbre, se supone que \(\epsilon_{t}\) sigue una distribución normal \(N(0,\sigma^2)\) con media cero y varianza desconocida \(\sigma\) que debe derivarse de los datos.

Hiperparámetros

Hay varios parámetros personalizables en la implementación de Facebook Prophet revisar, siendo los principales:

  • Puntos de cambio: que definen los cambios de tendencia. Estos pueden ser encontrados por el propio algoritmo o también pueden ser definidos y ajustados por el analista.
  • Estacionalidad: que definen las funciones periódicas que pueden afectar a la serie temporal. De forma predeterminada, Prophet considera la estacionalidad anual, semanal y diaria e intenta encontrar tendencias que representen esos efectos periódicos en los datos.
  • Días festivos: los días especiales (días festivos o cualquier otro evento recurrente) también pueden ser modelados por el modelo aditiv

En R, se usa la API de ajuste de modelo normal. Proporcionamos una función prophet que realiza el ajuste y devuelve un objeto modelo. Posteriormente usted puede llamar a la función predict y plot en este objeto modelo.

Datos y preparación

Los datos que utilizaremos los encontramos en Yahoo! Finance. Así como Python tiene una paquete para importar datos directamente de Yahoo Finance, R también cuenta con sus paquetes particulares que nos permitiran realizar una tarea similar. Necesitamos los siguientes dos paquetes:

library(TTR)
library(quantmod)

Si aún no los tienes instalados sugiero los instales usando install.packages(‘TTR’) . Ahora podemos obtener los datos de yahoo usando getSymbols. Tenga en cuenta que auto.assign=False significa que queremos que getSymbols devuelva los datos.

df <- getSymbols('HNL=X',src='yahoo',
                 from= "2010-01-01",
                 to="2022-12-20",
                 auto.assign=FALSE)

from = “2010-01-01” y to = “2022-12-20” me ayudan a indicar desde que fecha quiero empezar a tomar mis datos y hasta que fecha quiero tener esos datos. 

Ahora, conozcamos nuestros datos

head(df) 
##            HNL=X.Open HNL=X.High HNL=X.Low HNL=X.Close HNL=X.Volume
## 2010-01-04     18.690     18.691    18.517      18.518            0
## 2010-01-05     18.550     18.550    18.550      18.550            0
## 2010-01-06     18.572     18.645    18.544      18.545            0
## 2010-01-07     18.451     18.550    18.451      18.539            0
## 2010-01-08     18.556     18.556    18.556      18.556            0
## 2010-01-11     18.550     18.550    18.550      18.550            0
##            HNL=X.Adjusted
## 2010-01-04         18.518
## 2010-01-05         18.550
## 2010-01-06         18.545
## 2010-01-07         18.539
## 2010-01-08         18.556
## 2010-01-11         18.550

De estos datos únicamente usaremos el valor de cierre (HNL=X.Close) de manera diaria del Lempira Hondureño contra el dólar, para enfocarnos solo esos datos, primero convertimeremos nuestro conjunto de datos df en un dataframe, dado que inicialmente es un objeto de tipo ‘xts’, para realizar dicha tarea, consideremos la siguiente función:

xts_to_datframe<-function(data_xts){
  df_t<-data.frame(fecha=(index(data_xts)),
                   value=coredata(data_xts))
  colnames(df_t)<-c("ds", "y")
  df_t
}

Tiene que tener cuidado con el nombramiento de sus columnas, dado que prophet reconoce únicamente marcos de datos con columnas ds y y, que contiene la fecha y el valor numérico respectivamente. Dicho esto pasemos a transformar los datos de df que están como objeto ‘xts’ a objeto ‘dataframe’ por medio de la función que creamos anteriormente,

HNL <- xts_to_datframe(df$`HNL=X.Close`) 
class(HNL)
## [1] "data.frame"

Como podemos observar, ahora si ya tenemos nuestro DataFrame, y estamos listos para comenzar a crear nuestro modelo.

Implementación del Modelo

Primero visualicemos nuestros datos

library(tidyverse)
HNL %>% ggplot(aes(x = ds, y = y))+
  geom_line()+
  theme_minimal()+
  labs(title = 'Datos Historicos del Tipo de Cambio del USD/HNL',
       subtitle = '2010 - 2022',
       x = 'Año',
       y = 'HNL',
       caption = 'Elaboración propia con datos de yahoo finance')

library(prophet)
m <- prophet(HNL,daily.seasonality = TRUE)

future <- make_future_dataframe(m,periods = 3,freq = 'day')
tail(future)
##              ds
## 3380 2022-12-16
## 3381 2022-12-19
## 3382 2022-12-20
## 3383 2022-12-21
## 3384 2022-12-22
## 3385 2022-12-23
forecast <- predict(m, future)


dyplot.prophet(m, forecast)

De la figura previa,

  • Los puntos negros representan medidas reales
  • La linea azul el pronóstico de Prophet
  • La banda azul representa el intervalo de incertidumbre

Desglose de un Pronóstico

Si bien el pronóstico arroja muchas cosas, podemos centrarnos en algunas como:

  • ds fecha que se pronostica
  • yhat predicción para el valor ‘y’ (tipo de cambio) ese día
  • yhat_lower valor esperado más bajo para el rango del valor y previsto de ese día
  • yhat_upper valor esperado más alto para el rango de valor y previsto de ese día

Entonces, con tail() podemos ver la salida de los últimos días de pronosticados los cuales son, 21, 22 y 23 de diciembre 2022.

tail(forecast[c('ds', 'yhat', 'yhat_lower', 'yhat_upper')])
##              ds     yhat yhat_lower yhat_upper
## 3380 2022-12-16 24.10920   23.42643   24.84440
## 3381 2022-12-19 24.04468   23.31561   24.76044
## 3382 2022-12-20 24.11068   23.36524   24.84679
## 3383 2022-12-21 24.08748   23.37888   24.85863
## 3384 2022-12-22 24.12625   23.37438   24.84936
## 3385 2022-12-23 24.13427   23.34603   24.87478

Segú los datos, nuestro modelo nos ve obteniendo para el día 21 de diciembre entre 23.34854 (yhat_lower) y 24.90296 (yhat_upper) lempiras por un dólar de EE.UU.

Para entender el pronóstico más detalladamente, podemos graficar sus componentes con;

prophet_plot_components(m,forecast)

Parece que los inicios de abril fue nuestro mejor tipo de cambio, sin embargo, se ve un comportamiento creciente a finales de abril y mayo, luego se ve un comportamiento constante, pero siempre en alza.

Recuerda que el fin de este artículo,no es abogar por el uso indiscriminado de Prophet como el mejor modelo para pronosticar el tipo de cambio hondureño vs el dólar. Espero hayas conocido las generalidades de Prophet, y su utilidad en el ambito predictivo.