Volver al inicio

DiffQuant: Optimización de Sharpe en un simulador diferenciable

DiffQuant implementa la optimización directa del ratio de Sharpe a través de un simulador diferenciable de estrategias de trading en PyTorch. Integra modelo, posiciones, PnL y costos en un solo grafo. En datos de BTC muestra Sharpe +1.73 en test walk-forward después de comisiones.

Optimización directa de Sharpe sin objetivo proxy en DiffQuant
Advertisement 728x90

# DiffQuant: Simulador de Trading Diferenciable para Optimización Directa del Sharpe

En el trading algorítmico basado en ML, los modelos se entrenan tradicionalmente para predecir rentabilidades o dirección de precios usando MSE o entropía cruzada, mientras que el rendimiento se evalúa con el ratio Sharpe, que incluye costes. Esto genera una desconexión: pronósticos precisos de micromovimientos no garantizan rentabilidad fuera de muestra. DiffQuant elimina objetivos proxy al construir un único grafo diferenciable desde características de mercado hasta PnL final y Sharpe. Pruebas walk-forward logran un Sharpe de +1,73 y +8,22% de rentabilidad tras comisiones.

Desafíos con Objetivos Proxy Tradicionales

El flujo estándar separa predicción de trading:

  • El modelo minimiza MSE en rentabilidad_{t+1}.
  • El tamaño de posición se calcula con heurísticas.
  • El backtester aplica comisiones al final.

Esto provoca:

Google AdInline article slot
  • Desajuste en espacios de error: Precisión en fluctuaciones ruidosas causa sobretrading y sangrado por costes.
  • Sin gradiente en tamaño de posición: El modelo no aprende agresividad de entrada.
  • Ignorar costes durante entrenamiento: Deslizamiento y comisiones quedan fuera del grafo de cómputo.

DiffQuant integra dimensionamiento de posiciones, simulación de PnL y métricas en un grafo PyTorch, propagando gradientes de extremo a extremo.

Simulador de Trading Diferenciable

El simulador calcula PnL como operaciones tensoriales sobre horizonte t ∈ [0, H-1]:

$$r_t = \frac{c_t - c_{t-1}}{|c_{t-1}| + \varepsilon}$$

Google AdInline article slot

$$gross_t = p_{t-1} \cdot r_t$$

$$cost_t = smooth\_abs(\Delta p_t) \cdot (commission + slippage)$$

$$pnl_t = gross_t - cost_t$$

Google AdInline article slot

Innovación clave: smooth_abs para diferenciabilidad:

$$smooth\_abs(x) = \sqrt{x^2 + \varepsilon}, \quad \varepsilon = 10^{-6}$$

Esto asegura suavidad C^∞ cerca de cero, donde la política arranca plana, evitando discontinuidades subgradiente.

Los gradientes de -Sharpe fluyen a través de PnL → posiciones → modelo, entrenándolo para considerar costes de extremo a extremo.

Arquitectura de Política con iTransformer

El núcleo es iTransformer (ICLR 2024): un transformer invertido donde los tokens son canales de características, no pasos temporales. Para datos financieros, captura dependencias cruzadas (precio-volumen-volatilidad).

Config: d_model=32, n_layers=4, n_heads=2, d_ff=64 (52k parámetros).

Grafo completo:

  • Normalización Z-score sobre ventana de contexto (B, ctx, F) sin look-ahead.
  • iTransformerEncoder.
  • Concat extras: [prev_pos, prev_delta, t/H, (H-t)/H].
  • PolicyHead: direction_head × gate_head.

Posición: $$p_t = \tanh\left(\frac{d_t}{\tau_{dir}}\right) \times \sigma\left(\frac{g_t}{\tau_{gate}}\right)$$

La señal gate enmascara direcciones inciertas (como action masking). Inicialización gate_bias=-1.0 estabiliza arranques casi planos.

Despliegue rodante:

for t in range(H):
    window = full_seq[:, t : t + ctx, :]
    window_norm = normalize_context(window)
    extras = [prev_pos, prev_delta, t/H, (H-t)/H]
    pos_t = model(window_norm, extras)
    positions_list.append(pos_t)
positions = cat(positions_list)
step_pnl = simulator.simulate(closes, positions)
loss = hybrid_loss(step_pnl, positions)
loss.backward()

Pérdida Híbrida para Evitar Patologías

Sharpe puro lleva a rotación excesiva, colapso plano, sesgo largo, exposición terminal, ceguera a drawdowns. La híbrida los corrige:

$$\mathcal{L} = \lambda_1 \cdot (-Sharpe) + \lambda_2 \cdot turnover + \lambda_3 \cdot drawdown_{log} + \lambda_4 \cdot |p_H| + \lambda_5 \cdot (\hat{f} - f^*)^2 + \lambda_6 \cdot |\bar{p}|$$

  • $\lambda_2$: Penalización por rotación contra churning.
  • $\lambda_3$: Log-drawdown para estabilidad.
  • $\lambda_4$: Exposición cero al final del horizonte.
  • $\lambda_5$: Fracción plana objetivo vía sigmoide.
  • $\lambda_6$: Anti-sesgo, crucial en mercados alcistas.

$$drawdown_{log} = mean(cummax(cumsum(log(1+pnl))) - cumsum(log(1+pnl)))$$

Aumentación Espejo para Simetría

Datos de entrenamiento (2024–2025) son BTC alcista. Sin intervención, el modelo va solo largo. Aumentación espejo invierte precios y características en subconjuntos de batch, creando pares simétricos.

Resultado: short_fraction 17,3% (test), 20,9% (backtest).

Experimentos: Datos y Divisiones

| Parámetro | Valor |

|-----------|-------|

| Instrumento | BTCUSDT Binance Futures |

| Resolución | Barras de 30 min (agregadas de 1 min) |

| Período | 2021–2025 |

Divisiones:

  • Entrenamiento: Ene 2024 – Mar 2025.
  • Test: Jul–Sep 2025.
  • Backtest: Oct–Dic 2025.
  • Walk-forward OOS.

Lecciones Clave

  • Un único grafo diferenciable desde características a Sharpe resuelve problemas proxy, incluyendo costes y dimensionamiento.
  • iTransformer + direction×gate habilita atención cruzada y trading confiado.
  • Pérdida híbrida con anti-sesgo previene patologías como rotación y solo-largos.
  • Aumentación espejo genera política simétrica en datos asimétricos.
  • Sharpe walk-forward +1,73 tras comisiones en BTC OOS.

— Editorial Team

Advertisement 728x90

Leer después