Backtesting con estrategias de inversión basadas en Machine Learning

Aprender a integrar un modelo de Machine Learning en una estrategia de inversión y evaluar su rendimiento utilizando la librería backtesting.py con Python.

Si creas un modelo de Machine Learning para predecir el precio de una acción:

Representación gráfica de un modelo de árbol de decisión utilizado para predecir el precio de acciones, ilustrando cómo se divide el espacio de características para llegar a predicciones más precisas.
F1. Representación de un modelo de árbol de decisión

¿Cómo puedes evaluar su rendimiento si lo aplicas en tu estrategia de inversión?

Esquema ilustrativo de la aplicación de un modelo de Machine Learning en una estrategia de inversión, mostrando el proceso de toma de decisiones basado en predicciones de precios.
F2. Integración de Machine Learning en estrategia de inversión

Data

Partimos de los datos bursátiles de NVIDIA con su ticker NVDA.

Revisa este tutorial para saber cómo preprocesar el retorno diario de una acción.

import pandas as pd

df = pd.read_csv('data.csv', index_col='Date', parse_dates=True)
Captura de los datos bursátiles de NVIDIA, mostrando un dataset listo para el análisis y la aplicación de modelos de Machine Learning, con enfoque en la preparación y limpieza de los datos.
F3. Datos preparados de NVIDIA para análisis ML

Preguntas

  1. ¿Cómo se implementa un modelo de Machine Learning para predecir el cambio en el precio de cierre?
  2. ¿Cuál es el papel del parámetro min_samples_leaf en el algoritmo DecisionTreeRegressor?
  3. ¿Cómo medimos el error del modelo y qué nos dice sobre su rendimiento?
  4. ¿Cómo introducimos un modelo de Machine Learning en una estrategia de inversión?
  5. ¿Cómo evaluamos el rendimiento de la estrategia de inversión con Machine Learning?

Metodología

Selección de variables

Queremos predecir el porcentaje de cambio en el precio de cierre para mañana. Esta será la variable objetivo, y el resto serán las explicativas.

target = 'Change Tomorrow'
y = df[target]
X = df.drop(columns=target)

Modelo de Machine Learning

Usaremos el algoritmo DecisionTreeRegressor para predecir el cambio en el precio de cierre.

Como mínimo, queremos que haya 10 muestras al final de cada rama del árbol, min_samples_leaf=10.

from sklearn.tree import DecisionTreeRegressor

model = DecisionTreeRegressor(min_samples_leaf=10)
model.fit(X, y)
Representación gráfica de un modelo de árbol de decisión utilizado para predecir el precio de acciones, ilustrando cómo se divide el espacio de características para llegar a predicciones más precisas.
F1. Representación de un modelo de árbol de decisión

Evaluación del modelo

Con las condiciones matemáticas del modelo, calculamos las predicciones del modelo:

y_pred = model.predict(X)

Y las comparamos con los valores reales, obteniendo así el error.

error = y - y_pred

Para tener una mejor métrica de evaluación del modelo, calculamos la raíz del error cuadrático medio (RMSE); suele decirnos cuánto se desvía las predicciones del valor real en un 68% de las veces.

error2 = error ** 2

MSE = error2.mean()
RMSE = MSE ** 0.5

En nuestro caso, la predicción del porcentaje de cambio para mañana que haga el modelo, se desviará en promedio un 2.99% del valor real.

¿Supone un valor aceptable para nuestra estrategia de inversión? ¿Cómo podríamos mejorarlo?

Te leo en comentarios para diseñar el próximo tutorial.

Ahora sigamos con la implementación de la estrategia de inversión utilizando la librería backtesting.py.

Crear estrategia de inversión

Para implementar la estrategia de inversión, creamos una clase que herede de las funcionalidades de backtesting.Strategy.

Para ello, la clase requiere dos métodos: init y next.

  1. init: inicializa la estrategia con el modelo calculado anteriormente.
  2. next: calcula la predicción para mañana y decide si comprar, vender o no hacer nada.
from backtesting import Strategy

class MLStrategy(Strategy):
    def init(self):
        self.model = model
        
    def next(self):
        X_today = self.data.df.iloc[[-1]]
        y_tomorrow = self.model.predict(X_today)
        
        if y_tomorrow > RMSE:
            self.buy()
        elif y_tomorrow < -RMSE:
            self.sell()
        else:
            pass

Backtest con condiciones de trading

Finalmente, simulamos la estrategia de inversión (aka backtest) con las siguientes condiciones para evaluar su rendimiento.

¿Conoces a alguien que podría interesarle este artículo? Compártelo con ellos.

from backtesting import Backtest

bt = Backtest(
  X, MLStrategy, cash=1_000, commission=.002,
  exclusive_orders=True, trade_on_close=True
)

results = bt.run()

En el reporte del backtest, observamos que, tras 1,533 días, obtenemos un Equity Final de $11,019.19.

Resumen de los resultados de un backtest aplicando una estrategia de inversión basada en Machine Learning, destacando el equity final y el retorno total obtenido durante el periodo de prueba.
F4. Resultados de backtesting de la estrategia ML

Aunque hubiera sido más fácil comprar y mantener la acción sin modelo de Machine Learning; obteniendo un Return del 1,372.08% (vs. 1,001.92%).

¿Cómo podríamos mejorar la estrategia de inversión con Machine Learning? Te leo en comentarios.

Visualizar simulación del backtest

Finalmente, visualizamos la simulación del backtest para entender mejor el rendimiento de la estrategia de inversión.

bt.plot()

Además de las métricas de rendimiento, observamos una que es crucial para evaluar la estrategia de inversión: el Drawdown.

Esta métrica nos indica cuánto estaríamos dispuestos a sufrir sin cerrar la posición.

Gráfico interactivo generado por la librería backtesting.py, ofreciendo una visualización detallada del rendimiento de la estrategia de inversión a lo largo del tiempo, incluyendo métricas clave como el drawdown.
F5. Simulación del rendimiento de estrategia con ML

En otras palabras, el Drawdown mide el riesgo de la estrategia de inversión.

Si quieres profundizar en la integración de modelos de Machine Learning en estrategias de inversión, te invito a revisar este curso.

Conclusiones

  1. Modelo de Machine Learning: DecisionTreeRegressor es un algoritmo de árboles que selecciona los patrones históricos más significativos para predecir el cambio en los precios.
  2. Parámetro min_samples_leaf: min_samples_leaf=10 evita el sobreajuste asegurando una cantidad mínima de muestras en las hojas del árbol, mejorando la generalización del modelo.
  3. Medición del Error: RMSE para cuantificar la desviación de las predicciones frente a los valores reales con un 68% de confianza.
  4. Introducción en Estrategia de Inversión: Strategy con init y next integra las predicciones del modelo en las decisiones de trading.
  5. Evaluación de Rendimiento: Backtest nos permite simular la estrategia de inversión con condiciones de trading personalizadas.

Si pudieras programar lo que quisieras, ¿qué sería?

Puede que te eche una mano creando tutoriales que te ayuden. Te leo en los comentarios.

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to datons.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.