Back to Home

DiffQuant: Sharpe optimization in a differentiable simulator

DiffQuant implements direct optimization of the Sharpe ratio through a differentiable trading strategy simulator in PyTorch. Integrates model, positions, PnL and costs into a single graph. On BTC data shows Sharpe +1.73 in walk-forward test after commissions.

Direct Sharpe optimization without proxy target in DiffQuant
Advertisement 728x90

DiffQuant: Differentiable Trading Simulator for Direct Sharpe Optimization

In ML-based algorithmic trading, models are traditionally trained to predict returns or price direction using MSE or cross-entropy, while performance is evaluated via Sharpe ratio accounting for costs. This creates a disconnect: accurate micro-movement forecasts don't guarantee out-of-sample profitability. DiffQuant eliminates proxy objectives by building a single differentiable graph from market features to final PnL and Sharpe. Walk-forward testing delivers a Sharpe of +1.73 and +8.22% return after commissions.

Challenges with Traditional Proxy Objectives

The standard pipeline separates prediction from trading:

  • Model minimizes MSE on return_{t+1}.
  • Position sized via heuristics.
  • Backtester applies commissions after the fact.

This leads to:

Google AdInline article slot
  • Mismatch in error spaces: Accuracy on noisy fluctuations causes overtrading and bleed from costs.
  • No gradient on position size: Model doesn't learn entry aggressiveness.
  • Ignoring costs during training: Slippage and commissions sit outside the computation graph.

DiffQuant integrates position sizing, PnL simulation, and metrics into a PyTorch graph, passing gradients end-to-end.

Differentiable Trading Simulator

The simulator computes PnL as tensor operations over horizon 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

Key innovation—smooth_abs for differentiability:

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

This ensures C^∞ smoothness near zero, where the policy starts flat, avoiding subgradient discontinuities.

Gradients from -Sharpe flow through PnL → positions → model, training it to account for costs end-to-end.

Policy Architecture with iTransformer

Backbone is iTransformer (ICLR 2024): an inverted transformer where tokens are feature channels, not time steps. For financial data, this captures cross-channel dependencies (price-volume-volatility).

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

Full graph:

  • Z-score normalization over context window (B, ctx, F) without look-ahead.
  • iTransformerEncoder.
  • Concat extras: [prev_pos, prev_delta, t/H, (H-t)/H].
  • PolicyHead: direction_head × gate_head.

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

Gate signal masks uncertain directions (like action masking). gate_bias=-1.0 initialization stabilizes near-flat starts.

Rolling rollout:

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()

Hybrid Loss to Prevent Pathologies

Pure Sharpe leads to churning, flat collapse, long bias, terminal exposure, drawdown blindness. Hybrid fixes them:

$$\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$: Turnover penalty against churning.
  • $\lambda_3$: Log-drawdown for stability.
  • $\lambda_4$: Zero exposure at horizon end.
  • $\lambda_5$: Target flat fraction via sigmoid.
  • $\lambda_6$: Anti-bias, crucial on bull markets.

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

Mirror Augmentation for Symmetry

Training data (2024–2025) is bull BTC. Without intervention, model goes long-only. Mirror augmentation flips prices and features on batch subsets, creating symmetric pairs.

Result: short_fraction 17.3% (test), 20.9% (backtest).

Experiments: Data and Splits

| Parameter | Value |

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

| Instrument | BTCUSDT Binance Futures |

| Resolution | 30-min bars (aggregated from 1-min) |

| Period | 2021–2025 |

Splits:

  • Train: Jan 2024 – Mar 2025.
  • Test: Jul–Sep 2025.
  • Backtest: Oct–Dec 2025.
  • Walk-forward OOS.

Key Takeaways

  • Single differentiable graph from features to Sharpe solves proxy issues, including costs and position sizing.
  • iTransformer + direction×gate enables cross-channel attention and confident trading.
  • Hybrid loss with anti-bias prevents pathologies like churning and long-only.
  • Mirror augmentation yields symmetric policy on asymmetric data.
  • Walk-forward Sharpe +1.73 after commissions on BTC OOS.

— Editorial Team

Advertisement 728x90

Read Next