Implementación de trading multiactional con aprendizaje por refuerzo profundo usando FinRL y Stable Baselines3

Este tutorial muestra cómo construir un sistema automatizado de trading en múltiples acciones utilizando el framework FinRL junto con la biblioteca Stable Baselines3. Se entrenan cinco algoritmos distintos —A2C, DDPG, PPO, TD3 y SAC— sobre las 30 acciones del índice Dow Jones Industrial Average (DJIA), empleando datos históricos obtenidos desde Yahoo Finance.

Confiugración del entorno

Primero, se instalan las dependencias necesarias. Si se ejecuta localmente, se deben omitir las líneas relacionadas con condacolab:

!pip install swig
!pip install wrds pyportfolioopt
# !pip install -q condacolab        # Omitir si es local
# import condacolab                 # Omitir si es local
# condacolab.install()              # Omitir si es local
!apt-get update && apt-get install -y cmake libopenmpi-dev python3-dev zlib1g-dev libgl1-mesa-glx swig
!pip install git+https://github.com/AI4Finance-Foundation/FinRL.git

Obtención y estructura de los datos

Los datos se descargan mediante la clase YahooDownloader, configurando fechas de enicio y fin, además de una lista de tickers. Se recomienda usar proxy si es necesario:

import os
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7890'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'

raw_data = YahooDownloader(
    start_date="2010-01-01",
    end_date="2023-03-01",
    ticker_list=DOW_30_TICKER
).fetch_data()

El DataFrame resultante contiene columnas como date, open, high, low, close, volume, tic y day, donde tic es el símbolo bursátil y day representa el día de la semana (0=lunes, 6=domingo).

Ingeniería de características

Se calculan indicadores técnicos para enriquecer el espacio de estados:

  • MACD: Diferencia entre medias móviles exponenciales.
  • Bollinger Bands: Límites superior e inferior basados en desviación estándar.
  • RSI: Índice de fuerza relativa (30 días).
  • CCI: Índice de canal de mercancía.
  • DX: Índice de movimiento direccional.
  • SMA: Medias móviles simples de 30 y 60 días.
  • VIX: Índice de volatilidad implícita del mercado.
  • Turbulence: Medida de inestabilidad extrema en precios.

Estos indicadores se añaden como nuevas columnas al DataFrame preprocesado.

Construcción del entorno de trading

Se divide el conjunto de datos en entrenamiento (2010–2021) y prueba (2021–2023). Luego, se define el espacio de estado:

n_assets = len(train.tic.unique())  # 29, excluye DOW por falta de datos históricos
state_dim = 1 + 2 * n_assets + len(indicators) * n_assets  # 291 dimensiones

# Componentes:
# 1 → efectivo disponible
# 2*n_assets → cantidad y valor de cada acción en cartera
# indicators*n_assets → valores de indicadores técnicos por activo

Se crea el entorno compatible con Gym y se adapta a Stable Baselines3:

env_train = StockTradingEnv(df=train, **config)
vec_env, _ = env_train.get_sb_env()

Entrenamiento de agentes

Se instancia un agente que gestiona múltiples algoritmos de RL:

trainer = DRLAgent(env=vec_env)

# Entrenar A2C como ejemplo
a2c_model = trainer.get_model("a2c")
trained_a2c = trainer.train_model(
    model=a2c_model,
    tb_log_name="a2c",
    total_timesteps=50000
)

Se repite el proceso para DDPG, PPO, TD3 y SAC. Cada modelo se entrena independientemente sobre el mismo entorno.

Evaluación en entorno de trading

Se configura un entorno de prueba con umbrales de riesgo:

test_env = StockTradingEnv(
    df=trade,
    turbulence_threshold=70,
    risk_indicator_col='vix',
    **config
)

Se generan predicciones y se registran los valores de la cartera y las acciones tomadas:

portfolio_values, trades = DRLAgent.DRL_prediction(
    model=trained_a2c,
    environment=test_env
)

Comparación con benchmarks

Se incluyen dos benchmarks:

  • MVO (Mean-Variance Optimization): estrategia clásica de optimización de portafolio.
  • DJI: rendimiento del índice Dow Jones como referencia pasiva.

Los resultados se normalizan y se grafican juntos para comparar el crecimiento del capital inicial (USD 1M) durante el período de prueba (octubre 2021 – marzo 2023).

Análisis de resultados

En el período de prueba, marcado por alta volatilidad en 2022:

  • A2C y TD3 desatcaron con rendimientos positivos (~10%) y menor drawdown.
  • DDPG y SAC tuvieron rendimientos moderados pero mayor volatilidad.
  • PPO y MVO bajo desempeño, con pérdidas significativas.
  • DJI mostró crecimiento marginal, representando el benchmark pasivo.

Las estrategias basadas en Actor-Critic (A2C, TD3) demostraron mejor adaptación al entorno cambiante, mientras que los métodos tradicionales y algunos gradientes de política (PPO) no lograron superar el mercado.

Etiquetas: FinRL StableBaselines3 ReinforcementLearning StockTrading OpenAIGym

Publicado el 10-9 18:19