Módulo 3 / Semana 11
Como ejecutivo de cuenta dentro de una institución financiera, José ha podido desarrollar algunas habilidades, entre ellas el poder atender y brindar una asesoría completa a cada uno de los clientes que se le asignan en la sucursal.
Actualmente se encuentra un poco ansioso ya que existe una oportunidad de postularse para un puesto mejor. El nuevo puesto requiere tomar decisiones en relación con otorgamientos de crédito y clasificación del nivel de cliente, por lo que requiere conocer más sobre los pronósticos financieros en relación con: tasas de interés, devaluación y riesgo, como aspectos principales.
Sabe que existen herramientas digitales como la inteligencia artificial o el machine learning que pueden apoyar en la generación de esta información. Actualmente ha visto tutoriales que le han apoyado a comprender la parte sencilla de la programación de estos modelos, pero considera que para llevar a cabo un pronóstico más profundo necesitaría conocer más. ¿Qué otros elementos podrían apoyar a José para preparase y postularse en este crecimiento?
Dentro de esta experiencia educativa conocerás sobre los modelos basados en redes neuronales, la aplicación de ellas en el deep-learning (aprendizaje profundo) y la forma en la que se construye una proyección de estas variables a través de un ejemplo práctico.
Conceptos básicos del modelo de redes neuronales
De acuerdo con Williems (2019), las redes neuronales son un tipo de modelos de aprendizaje automático inspirados en la estructura biológica del cerebro. La idea se basa en tomar un modelo simplificado de una neurona y representar computacionalmente las operaciones que realiza en conjunto con otras neuronas. La siguiente figura compara la estructura biológica de una neurona individual con su representación computacional.
Fuente: Mwandau, B., y Nyanchama, M. (2018). Investigating Keystroke Dynamics as a Two-Factor Biometric Security. Recuperado de https://www.researchgate.net/publication/325870973_Investigating_Keystroke_Dynamics_as_a_Two-Factor_Biometric_Security
De esta misma figura, se pueden identificar los componentes a considerar para crear un modelo computacional de una neurona:
El concepto de una sola neurona individual se conoce como un perceptrón. La idea de un perceptrón no es muy diferente a una regresión lineal. En esencia, se tiene la combinación lineal de las variables de entrada y una función de activación que se aplica sobre el resultado. Si se usa la función identidad f(x) = x como la función de activación, se tiene la definición original de una regresión lineal. De acuerdo con Baheti (2022), la función de activación permite al perceptrón emitir una señal, en esencia, le permite “activarse” al enviar información distinta de 0. Esto representa el equivalente biológico de estimular una neurona dado las condiciones adecuadas.
Por ejemplo, en el cerebro humano, un conjunto de neuronas se encarga de identificar rostros. Esto significa que tal conjunto de neuronas permanece sin activarse (equivalente a emitir 0 en nuestro modelo computacional), hasta que llega la información adecuada (ver un rostro humano) que les permite activarse e identificar el rostro. En este sentido, las funciones de activación que se usan en un modelo computacional deben permitir al perceptrón emitir una señal de activación o permanecer desactivadas. En la práctica, las funciones de activación más comunes son:
Se puede parametrizar el tipo de función de activación que se usará en el modelo y escoger aquella función que genere un mejor poder predictivo dado los datos que se tienen a disposición.
El perceptrón simple que se ha estado desarrollando se compone de nodos de entrada, un núcleo y un nodo de salida. El procesamiento de la información que proveen los nodos de entrada se lleva a cabo en el núcleo, en donde se genera una combinación lineal de los datos y se aplica la función de activación. Para crear una red neuronal, se tienen que conectar los nodos de entrada de una neurona con el nodo de salida de otras neuronas. Un conjunto de perceptrones, organizados por capas, se conoce como un modelo de perceptrón multicapa. La siguiente figura permite visualizar un modelo de perceptrón multicapa. Este tipo de modelos genera tres capas distintas:
Aplicación de redes neuronales en el contexto de deep-learning
Los modelos de perceptrón multicapa tienen una ventaja significativa sobre modelos lineales dado que permiten utilizar varios perceptrones para procesar los datos, lo cual genera un efecto no-lineal que generalmente resulta en mejor capacidad predictiva. Adicionalmente, la función de activación de la capa de salida (output layer) resuelve un problema de regresión o un problema de clasificación. De esta forma se tiene un modelo versátil que permite resolver cualquier problema de aprendizaje supervisado, generalmente con un mejor poder predictivo.
La desventaja de utilizar este tipo de modelos se basa en la interpretabilidad sobre la relación entre los valores de entrada y el resultado del modelo. Dado que cada perceptrón tiene su propio conjunto de parámetros y función de activación, no hay forma directa para interpretar cómo un cambio en los datos de entrada afecta el resultado final. Existen técnicas de interpretabilidad de modelos no-lineales, tales como SHAP (Shapley Additive Explanations) que se pueden utilizar para interpretar la contribución de variables independientes respecto al resultado.
Los modelos de redes neuronales son costosos en términos computacionales. Se requieren dos algoritmos sofisticados para (1) generar las predicciones del modelo y (2) para implementar el proceso de aprendizaje (entrenamiento). Ognjanovski (2019), explica estos algoritmos:
Afortunadamente, los algoritmos de feed-forward y back-propagation ya están completamente automatizados en la mayoría de los paquetes de software de redes neuronales. En Python, se tienen varias implementaciones de código libre, entre las más populares están:
Utilizar un software de alto o bajo nivel depende del tipo de problema que se esté resolviendo. Para la mayoría de los casos, es preferible utilizar un alto nivel dado que la mayoría de los detalles de implementación ya preconfigurados permiten tener una red neuronal funcional en poco tiempo. Sin embargo, si se requiere más flexibilidad en la estructura de la red neuronal utilizada, entonces es recomendable pasar a un software de bajo nivel. Adicional a la flexibilidad, los paquetes de bajo nivel suelen permitir utilizar hardware especializado, tal como utilizar los procesadores gráficos de la computadora en lugar del CPU para el proceso de entrenamiento.
El modelo de perceptrón multicapa es considerado un modelo de deep learning. De acuerdo con Alexander Amini (2022), el deep learning se caracteriza por la utilización de modelos de redes neuronales para resolver problemas de predicción en donde la red neuronal se encarga de procesar y extraer toda la información relevante. En la industria financiera, este tipo de modelos ha resultado de bastante utilidad para reemplazar modelos econométricos. Namini et al. (2018) publicaron un estudio en donde redujeron la función de error en promedio un 84% al cambiar de un modelo econométrico (ARIMA) hacia un modelo de deep learning (LSTM).
Por las mejoras en el rendimiento de los modelos, se observa una tendencia fuerte en la adopción de deep learning en la industria financiera. Huang et al. (2020) en su publicación Deep Learning in Finance and Banking, identifican las áreas en la industria financiera con mayor adopción de los modelos de deep learning y los tipos de modelos que utilizan. Las siguientes figuras ilustran este punto:
Fuente: Huang, J., Chai, J., y Cho, S. (2020). Deep learning in finance and banking: A literature review and classification. Recuperado de https://fbr.springeropen.com/articles/10.1186/s11782-020-00082-6
Fuente: Huang, J., Chai, J., y Cho, S. (2020). Deep learning in finance and banking: A literature review and classification. Recuperado de https://fbr.springeropen.com/articles/10.1186/s11782-020-00082-6
Con esta información se puede observar que la creación de modelos es muy utilizada y cada vez en mayor tamaño. ¿Cómo se programaría un modelo predictivo de deep learning en el ámbito financiero?
Ejemplos de aplicación y práctica con un ejemplo real en el ámbito financiero
Considera que una empresa importadora tiene que hacer una estimación sobre el valor del tipo de cambio para pagar a sus proveedores en el futuro. Este tipo de estimaciones sobre una variable económica/financiera es uno de los casos de uso más comunes en la industria fintech. Tradicionalmente, se implementan modelos econométricos para capturar la tendencia de los valores que adquieren estas variables económicas/financieras a través del tiempo.
Este tipo de modelos econométricos suelen seguir un conjunto de supuestos simples, y por consecuencia su capacidad predictiva es baja. Utilizando como referencia el estudio realizado por Namini et al. (2018), un modelo de redes neuronales de deep learning tiene la capacidad de generar mejores predicciones en los casos de uso.
Para generar los modelos de redes neuronales es necesario definir las dependencias del código y descargando la información del tipo de cambio directamente del Banco de México.
Considera que se tienen las siguientes dependencias:
Enseguida se incluye el texto para fines prácticos:
import logging
import datetime as dt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
usdmxn_banxico_url = "https://www.banxico.org.mx/SieInternet/consultaSerieGrafica.do?s=SF43718,CF102,3"
lags = 60 # Use the previous 60 observations
# Download & clean the USDMXN exchange rate dataset from Banxico
usdmxn_dataset = pd.read_json(usdmxn_banxico_url)\
.apply(lambda row: pd.Series(row["valores"]), axis=1)\
.rename(columns={key: val for key, val in enumerate(["date", "value"])})\
.query("date > '2018-01-01'")\
.assign(date=lambda df: pd.to_datetime(df.date, format="%Y-%m-%d"))\
.set_index("date", drop=True)
usdmxn_dataset
Se usará Tensorflow y Keras, dependencias de bajo nivel, para construir el modelo de deep learning usando una arquitectura conocida como LSTM NN (long-short term memory neural networks). Korstanje (2021) explica que este tipo de modelos de redes neuronales utiliza el concepto de “memoria” dentro de las neuronas para mejorar la capacidad predictiva del modelo. Según este mismo autor, los modelos LSTM son el estado del arte para problemas de predicción de series de tiempo.
Para el caso, se descargará información del tipo de cambio desde el 2018 a la fecha. Al visualizar esta serie de tiempo, se observa que los comportamientos repentinos en el tipo de cambio particularmente se dan a inicios del 2020.
usdmxn_dataset.plot(
y="value",
title="USDMXN Exchange Rate Value",
grid=True,
figsize=(10, 5)
)
Ahora se procederá a la preparación de los datos de entrenamiento, es importante mencionar que se requiere dividir el conjunto de datos en dos subconjuntos:
Para este modelo de predicción, se utilizarán las últimas 60 observaciones del tipo de cambio para pronosticar la siguiente observación. Los modelos que utilizan información de la misma serie de tiempo para pronosticar valores futuros se conocen como autorregresivos. Adicional a esto, se aplica una transformación para acotar los valores del tipo de cambio entre 0 y 1 (usando el mínimo y máximo valor observado). Esto bajo el argumento de estandarizar los valores del conjunto de datos y facilitar el procesamiento por parte de las funciones de activación en la red neuronal.
Enseguida se incluye el texto para fines prácticos:
# Feature scaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_dataset = scaler.fit_transform(usdmxn_dataset.values)
# Use the latest 200 days as our validation dataset
reference_timestamp = (dt.datetime.utcnow() - dt.timedelta(days=200)).strftime("%Y-%m-%d")
train_index = usdmxn_dataset.index < reference_timestamp
train_data = scaler.fit_transform(usdmxn_dataset[train_index].values)
valid_data = scaler.fit_transform(usdmxn_dataset[~train_index].values)
# Build the training dataset
x_train, y_train = [], []
for i in range(lags,len(train_data)):
x_train.append(train_data[i-lags:i,0])
y_train.append(train_data[i,0])
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1],1))
pd.DataFrame({"x": list(x_train), "y": y_train})
Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.
Una vez teniendo el conjunto de datos, se creará y entrenará el modelo. Se pueden notar las siguientes operaciones en el código para definir la arquitectura del modelo:
El número de neuronas y capas ocultas utilizadas en el modelo es un parámetro que puede modificarse. Diferentes combinaciones de estos valores pueden influir significativamente en el poder predictivo del modelo. De acuerdo con Brownlee (2019), agregar capas ocultas con neuronas de tipo LSTM hace que esta implementación se considere como un modelo de deep learning.
Una vez definido el modelo, se indicará la función de costo/error (error cuadrado medio) y se procede al entrenamiento. Como se puede observar en los registros (logs) de ejecución, el valor del error cuadrado medio (loss) fue decreciendo con cada iteración (desde 0.0049 hasta 0.0012), lo cual es un fuerte indicador de aprendizaje.
Enseguida se incluye el texto para fines prácticos:
# Build our deep learning model
model = Sequential ()
model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1],1)))
model.add(LSTM(units=50))
model.add(Dense(1))
# Compile model and execute training
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x_train, y_train, epochs=5, batch_size=1, verbose=2)
model.summary()
Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.
Teniendo este modelo entrenado, se puede trabajar con las predicciones en el conjunto de datos de validación. El siguiente bloque de código muestra el proceso de preparación de los datos y la generación de las predicciones:
validation_input_dataset = usdmxn_dataset[len(usdmxn_dataset) - len(valid_data) - lags:]. values
validation_input_dataset = validation_input_dataset.reshape(-1,1)
validation_input_dataset = scaler.transform(validation_input_dataset)
x_valid = []
for i in range(lags,validation_input_dataset.shape[0]):
x_valid.append(validation_input_dataset[i-lags:i,0])
x_valid = np.array(x_valid)
x_valid = np.reshape(x_valid, (x_valid.shape[0],x_valid.shape[1],1))
usdmxn_rate_predictions = model.predict(x_valid)
usdmxn_rate_predictions = scaler.inverse_transform(usdmxn_rate_predictions)
rms=np.sqrt(np.mean(np.power((scaler.inverse_transform(valid_data)-usdmxn_rate_predictions),2)))
rms
.0339682227814435
Para finalizar, se crean las predicciones del modelo utilizando el conjunto de datos de validación. Podrás observar que este modelo se ajusta de forma correcta a la tendencia y fluctuaciones del tipo de cambio. Lo cual representa una buena capacidad de predicción.
ax = usdmxn_dataset[train_index].rename(columns={"value": "training_data"}).plot(
y="training_data",
figsize=(10, 6),
title="USDMXN Exchange Rate - Forecast",
ylabel="USDMXN"
)
usdmxn_dataset[~train_index].assign(predictions=usdmxn_rate_predictions)\
.rename(columns={"value": "validation_data"})\
.plot(y=["validation_data", "predictions"], ax=ax, grid=True)
Enseguida se incluye el texto para fines prácticos:
plot_config = dict(
y=["validation_data", "predictions"],
grid=True,
figsize=(10, 6),
title="USDMXN Exchange Rate - Predictions for Validation Data"
)
usdmxn_dataset[~train_index].assign(predictions=usdmxn_rate_predictions)\
.rename(columns={"value": "validation_data"})\
.plot(**plot_config)
Con el desarrollo de este modelo, la empresa importadora podrá anticipar las fluctuaciones del tipo de cambio y realizar alguna estrategia de cobertura cuando más le convenga.
Después de revisar la información presentada, José puede comprender la forma en la que las herramientas de deep learning apoyan en la proyección de modelos pudiendo utilizarlos para definir el comportamiento del tipo de cambio en el futuro. Claro que estos modelos toman como base información publicada por los organismos financieros como lo es el Banco de México y de esta manera se genera la proyección, es decir, tomando en cuenta el comportamiento del pasado es posible predecir un comportamiento futuro siempre y cuando el resto de las variables que pudieran afectar la economía permanecen constantes.
A través de programas como Python y conociendo las variables de entrada, se pueden observar los cambios gráficamente y detallar aquellos puntos críticos que pudieran afectar alguna inversión, ya sea en forma líquida, o bien, en especie.
Asegúrate de:
Los siguientes enlaces son externos a la Universidad Tecmilenio, al acceder a ellos considera que debes apegarte a sus términos y condiciones.
"Tecmilenio no guarda relación alguna con las marcas mencionadas como ejemplo. Las marcas son propiedad de sus titulares conforme a la legislación aplicable, estas se utilizan con fines académicos y didácticos, por lo que no existen fines de lucro, relación publicitaria o de patrocinio".