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.

Jesús López
es.datons
Published in
4 min readMar 20, 2024

--

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

{alt_text}
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?

{alt_text}
F2. Integración de Machine Learning en estrategia de inversión

Si quieres estar al tanto de los nuevos tutoriales y clases, suscríbete en datons.ai.

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)
{alt_text}
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)
{alt_text}
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.df.X.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.

Help me find out if you’ve learned something new with this tutorial by pressing the applause button.

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.

{alt_text}
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.

{alt_text}
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.

--

--