Biblioteca de análisis técnico sobre series temporales financieras para machine learning con Python

[Imagen[1] (Imagen por cortesía de: https://unsplash.com)]

Desde Lecrin Technologies, en los últimos meses nos hemos enfrentado a algunos problemas relacionados con la aplicación de Machine Learning a series temporales en un contexto financiero (financial time series). Como puede ser la predicción del precio a futuro de bitcoin, o diferentes retos para científicos de datos propuestos por Numer.ai, Two Sigma Investment o G-Research. Por ello, hemos decidido desarrollar una biblioteca de análisis técnico en Python, usando la biblioteca Pandas como base:

El uso de la biblioteca está orientado principalmente a científicos de datos que trabajan con datasets financieros (con columnas como “Timestamp”, “Open”, “High”, “Low”, “Close”, “Volume”, etc) y que usan herramientas de Machine Learning / Deep Learning del ecosistema python (como son Pandas, Scikit-Learn, XGBoost, LightGBM, Keras, TensorFlow, etc) para predecir el valor de un activo financiero en el futuro.

Actualmente, estas herramientas están ofreciendo muy buenos resultados a la hora de predecir casi cualquier incógnita planteada. Sin embargo, cuando se trata de predecir series temporales financieras normalmente los resultados no son tan buenos. Lo que ocurre es que los datasets financieros cuentan con registros de lo ocurrido en una franja temporal, ya sea de un día o de 6 horas, pero esta información no ayuda demasiado a los modelos actuales.

Precisamente en ofrecer más información a partir del pasado para determinar la dirección de la tendencia en el futuro se centra el análisis técnico. No es ninguna fórmula mágica que nos diga qué va a ocurrir en el futuro, sino que más bien es un conjunto de indicadores que resumen lo ocurrido en el mercado recientemente. Veamos un par de ellos en detalle:

Bandas de Bollinger

Sirven para analizar el nivel de volatilidad del precio de un activo en un periodo definido. Constan de 3 bandas. Siendo la banda de en medio la media móvil simple de los últimos n periodos y la superior y la inferior son igual a la de en medio sumando y restando respectivamente x veces la desviación típica. Siendo normalmente n igual a 20 y x igual a 2:

SMA = SUM (n last close values) / n
UB = SMA + (X * StdDev)
LB = SMA — (X * StdDev)
Donde normalmente:
n = 20
X = 2.
Ejemplo Bandas de Bollinger [Imagen[2] (Imagen propia generada con Matplotlib)]

En la imagen anterior se puede apreciar el valor de cierre en color azul y las 3 bandas de Bollinger anteriormente comentadas, en naranja la superior, en verde la inferior y en rojo la de en medio.

En la biblioteca, este indicador es transformado en 5 características. Porque además de las 3 características resultantes de las 3 bandas ya mencionadas, generamos otros 2 indicadores que informarán del momento en que el valor de cierre tiene un valor mayor que la banda superior de Bollinger o menor que la banda inferior de Bollinger. Por tanto, estas dos características normalmente valdrán 0 excepto cuando el valor de cierre sale de estas de estas bandas, que valdrá 1.

Si nos fijamos en la imagen, cada vez que la línea de cierre de color azul escapa de las bandas superior o inferior suceden cambios bruscos en el precio, y normalmente conviene vender cuando supera la banda por arriba y comprar cuando es menor que la banda inferior.

MACD

MACD son las siglas de Moving Average Convergence Divergence, que traducido al español sería la media móvil de convergencia y divergencia. Es un indicador de tendencia y se centra únicamente en analizar las medias móviles exponenciales del precio de cierre.

Para calcular MACD usaremos:

MACD = PME(n1, precio_cierre) — PME(n2, precio_cierre)
Señal MACD = PME(n3, MACD)
MACD_Difference = MACD — Señal
Donde “PME” es el promedio móvil exponencial y normalmente n1 valdrá 12, n2 corresponderá con 26 y n3 será 9.
Ejemplo MACD [Imagen[3] (Imagen propia generada con Matplotlib)]

En la imagen anterior se puede apreciar el valor de MACD en color azul, el de la señal MACD en naranja, y la diferencia entre las anteriores en verde.

La teoría dice que cuando la curva MACD es menor que la señal, o lo que es igual, cuando la curva verde tiene un valor menor a 0, la tendencia del precio será bajista. Y al contrario, indica una señal de subida de precio.

Actualmente, la biblioteca tiene implementados 32 indicadores, que dan como resultado 58 características. En todos ellos se puede configurar el tamaño de la/s ventana/s a analizar, las constantes a usar o el rellenado automático de un modo inteligente de los valores NaN producidos por los indicadores.

La biblioteca está liberada en GitHub en una primera versión estable, que puede ser instalada mediante “pip”. No la damos por terminada, sino que seguirá en constante desarrollo. Si tienes cualquier comentario o feedback no dudes en ponerte en contacto con nosotros.