R-Conomics

¿Qué variable se va a predecir?

En esta entrada corta me dedicaré a hacer un ejercicio sencillo en Python. Voy a crear una red neuronal para predecir el precio del petroleo. En realidad trabajar con redes neuronales es algo sencillo, siendo que el verdadero reto está en pensar en qué variable puede explicar el comportamiento de otra. Si bien las redes neuronales nos ahorran una enorme cantidad de trabajo en cuanto a tiempos de programación y algunos otros cálculos, estas no van a hacer todo el trabajo por nosotros. Como desarrollador de un algoritmo de Machine Learning uno también debe pensar en aquello que puede aumentar la eficiencia de nuestro algoritmo, así como en las variables que vamos a utilizar para cada caso. Pensemos en el precio del petroleo, que es con el que vamos a trabajar. ¿Qué puede afectar al precio hoy en día? Ciertamente las expectativas respecto a la actividad económica que veremos en un futuro, sin embargo, es difícil (si no es que imposible) cuantificar las expectativas de las personas. Podemos pensar en algo que suelen hacer los inversionistas cuando tienen ciertas expectativas sobre el futuro: Prevenirse. ¿Cómo suelen hacer esto? Bueno, imaginemos la siguiente situación (no tan hipotética): Supongamos que, de manera totalmente increíble y sin previo aviso un virus emerge de China y obliga a las personas a encerrarse en sus casas. ¿Cómo afectaría a los mercados esta situación? Esto es todo un efecto en cadena:

  1. Las personas se encierran en sus casas.
  2. La actividad económica (sobre todo aquella no esencial, como el turismo) disminuye de manera abrupta.
  3. Los ingresos de una parte de la población caen.
  4. Debido a que las personas no tienen para gastar, el consumo cae.
  5. Al no haber consumo, los insumos como la gasolina dejan de consumirse-valga la redundancia-en la misma magnitud.
  6. Cae el precio del petróleo.
  7. Las empresas petroleras pierden millones de dólares y, por ende, los inversionistas de este sector pierden mucho dinero.
  8. Por otra parte, la incapacidad de llenar las fábricas genera un presiones inflacionarias (un choque de oferta), lo que implica que nos encontramos en una crisis de estanflación.

Este efecto en cadena puede ser fácilmente deducido, lo que implica que los analistas y consultores de mercado sabrían en su momento que esto va a ocurrir, implicando que se van a prevenir ante esta situación (lo que explica en parte los precios negativos del petroleo observados en 2020). Si los inversionistas saben que el petroleo va a caer en cuanto a su cotización, entonces para evitar tener pérdidas tan grandes rápidamente traspasarán su inversión en algún activo de refugio, siendo el más común de estos el oro.

A partir de toda esta idea teórica podemos suponer que el oro, al ser un activo de refugio respecto al petroleo, tiene una influencia directa respecto al precio del petroleo, por lo que podríamos intentar utilizar utilizar una red neuronal para ver la relación existente entre estos dos stocks.

¿Por qué una red neuronal?

¿Por qué trabajar con un modelo de inteligencia artificial? ¿Qué ventaja tiene respecto a un modelo estadístico convencional? La respuesta radica en la forma de predecir en la que se basan estos modelos.

Cuando trabajamos con programación convencional, usualmente definimos una entrada y, para conocer la salida, definimos un algoritmo que ya conocemos previamente. En este caso no sabemos en qué medida el oro tiene influencia sobre el petroleo (o si tan siquiera es el caso), por lo que simplemente tenemos las entradas y salidas. La red neuronal requiere en este caso los datos del precio del petroleo y el precio del oro, para después comenzar a generar predicciones sobre la influencia que existe entre estas variables. La idea es sencilla: Una red neuronal va a probar resultados una cierta cantidad de veces (que nosotros indiquemos), es decir, se va a ir entrenando hasta mejorar el resultado de la predicción. Obviamente al entrenarse por primera vez la red neuronal lo hará bastante mal, pero conforme vaya probando resultados, ésta va a aumentar su eficiencia. Para que te quede más clara la idea imagina lo siguiente: Cuando practicas un deporte por primera vez lo normal es que no seas tan bueno, ya que apenas comienzas a familiarizarte con el, pero conforme te entrenas, después de un cierto tiempo alcanzarás una mejoría notable, la cual llega hasta un cierto límite. Las redes neuronales funcionan de una manera similar, siendo que estas pueden tener desde dos hasta cientos o miles de conexiones. Gráficamente, podríamos mostrarla de la siguiente manera:

Claro que esto solo es un ejemplo ilustrativo. Más adelante veremos como implementar la red mediante Python.

Comenzando a plantear la red neuronal

Primero, cargaremos las librerías necesarias y vamos a comenzar por importar los datos respectivos mediante la paquetería Pandas, importándolos de Yahoo Finance. Utilizaremos datetime para manejar correctamente las fechas, tensorflow para crear la red neuronal y, finalmente, haremos un gráfico sencillo de la función de pérdida mediante matplotlib. En otras circunstancias utilizaría otra paquetería para el gráfico, pero ahora mismo le doy más prioridad al modelo en cuestión.

# Cargamos las paqueterías
import pandas_datareader as pdr
from datetime import datetime
import tensorflow as tf
import matplotlib.pyplot as plt

# Cargamos los datos
Petroleo = pdr.DataReader("CL=F", "yahoo", start='2019-05-10', end='2021-05-10')
Oro = pdr.DataReader("GC=F", "yahoo", start='2019-05-10', end='2021-05-10')

# Visualizamos los datos a usar
print (Petroleo.Close, Oro.Close) 
## Date
## 2019-05-10    61.660000
## 2019-05-13    61.040001
## 2019-05-14    61.779999
## 2019-05-15    62.020000
## 2019-05-16    62.869999
##                 ...    
## 2021-05-05    65.629997
## 2021-05-06    64.709999
## 2021-05-07    64.900002
## 2021-05-10    64.919998
## 2021-05-11    65.279999
## Name: Close, Length: 500, dtype: float64 Date
## 2019-05-10    1285.699951
## 2019-05-13    1300.099976
## 2019-05-14    1294.699951
## 2019-05-15    1296.300049
## 2019-05-16    1285.000000
##                  ...     
## 2021-05-05    1784.099976
## 2021-05-06    1815.500000
## 2021-05-07    1831.099976
## 2021-05-10    1837.500000
## 2021-05-11    1835.900024
## Name: Close, Length: 500, dtype: float64

Damos especificaciones al modelo. Para ello vamos a utilizar keras, siendo que nos ayudará a generar una capa para conectar las neuronas, es decir, los datos de entrada y salida.

# creamos una capa densa para conectar los datos de entrada con los de salida
capa = tf.keras.layers.Dense(units = 1, input_shape=[1])

# Creamos un modelo sequencial para este caso
# Utilizamos una función de pérdida de error cuadrático medio
# Usamos el optimizador de Adamax para que el modelo mejore en lugar de empeorar conforme se entrena
modelo = tf.keras.Sequential([capa])
modelo.compile(
  optimizer=tf.keras.optimizers.Adamax(0.1),
  loss="mean_squared_error"
)

# Entrenamos el modelo. Le decimos a la función fit que lo haga 100 veces con epoch. 
# ¿Esto es mucho o poco? Lo averiguaremos cuando grafiquemos la función de pérdida.
historico = modelo.fit(Petroleo.Close, Oro.Close, epochs=100, verbose=False)

Nótese que la función fit nos pide a la variable independiente \(X\) y la variable dependiente \(Y\), por lo que estaríamos diciendo en este caso que el precio del oro tiene una influencia directa por el precio del petróleo, ¿esto tiene sentido económico? Podríamos decir en este caso que si, ya que, como mencioné al principio, estamos suponiendo que el oro se utiliza como un activo de refugio dadas las expectativas del petroleo, por lo que conforme caiga el precio de éste último, el otro teóricamente incrementará su valor.

Graficamos la función de pérdida para ver qué tanto mejora nuestro modelo respecto a la cantidad de veces que lo probamos:
plt.xlabel("Número de pruebas")
## Text(0.5, 0, 'Número de pruebas')
plt.ylabel("Magnitud de pérdida")
## Text(0, 0.5, 'Magnitud de pérdida')
plt.plot(historico.history["loss"])
## [<matplotlib.lines.Line2D object at 0x7fac33ea1e48>]
plt.show()

El gráfico nos muestra que a partir de 40 entrenamientos el modelo no mejoró demasiado, por lo que con esto bastaba para este caso. Es importante mencionar que el número de entrenamientos del modelo pueden ser ambiguos, por lo que para cada caso particular es necesario ir experimentando, tanto con los optimizadores como con el número de entrenamientos que hagamos.

Generamos una predicción:

print("Si el precio del petroleo es de 50 dólares el barril, entonces el precio del oro tenderá a ser de", modelo.predict([50]), "dolares la onza")
## Si el precio del petroleo es de 50 dólares el barril, entonces el precio del oro tenderá a ser de [[1604.215]] dolares la onza

¿Qué podemos notar del resultado anterior? La precisión de la predicción no solo depende de que tengamos un modelo muy complejo en Python, si no también de que tengamos variables que tengan una clara relación entre ellas. En este caso podemos suponer que, si bien es posible que haya una alta relación entre el precio del petroleo y el precio del oro, es muy probable que existan otros activos que se utilicen de refugio, lo que implicaría que tienen que ser tomados en cuenta también para poder generar un modelo mucho más preciso, por más de que lo entrenemos.

Si llegaste hasta aquí déjame agradecerte por leer toda la entrada. Esto apenas es una introducción muy sencilla respecto a las redes neuronales, pero por algo se empieza. ¡Muchas gracias por leerme!

Referencias

[1] Abadi, M. (2016, September). TensorFlow: learning functions at scale. In Proceedings of the 21st ACM SIGPLAN International Conference on Functional Programming (pp. 1-1).

[2] Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C. & Zheng, X. (2016). Tensorflow: Large-scale machine learning on heterogeneous distributed systems. arXiv preprint arXiv:1603.04467.

[3] Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., … & Duchesnay, E. (2011). Scikit-learn: Machine learning in Python. the Journal of machine Learning research, 12, 2825-2830.

[4] Takeshi, A., & AMEMIYA, T. A. (1985). Advanced econometrics. Harvard university press.

[5] Ringa Tech. (2021). Red neuronal en Python y Tensorflow. 20 de agosto de 2021, de Youtube Sitio web: https://youtu.be/iX_on3VxZzk

[6] Dhrymes, P. J. (2012). Topics in advanced econometrics: Probability foundations. Springer Science & Business Media.

R-Conomics
Todos los derechos reservados