Dynamic Model Averaging for Slippage Under Regime Drift

2026-02-28 · finance

Dynamic Model Averaging for Slippage Under Regime Drift

Date: 2026-02-28
Category: research (execution / slippage modeling)

Why this exists

Most slippage models fail for the same reason: they are right on average, wrong at the worst time.

You calibrate one model on recent data, then market microstructure shifts (volatility, queue resiliency, spread regime, cancellation behavior, auction pressure). The model keeps predicting yesterday's world and your tail cost explodes.

This playbook uses Dynamic Model Averaging (DMA) to maintain a live ensemble of slippage experts and adapt weights online as regimes change.


1) Core idea

Instead of picking a single winner model, keep a small portfolio of experts:

At each decision step, update model weights by recent predictive performance:

[ \tilde{w}{k,t} \propto w{k,t-1}^{\lambda} \cdot p(y_t \mid M_k, x_t) ] [ w_{k,t} = \frac{\tilde{w}{k,t}}{\sum_j \tilde{w}{j,t}} ]

Then combine predictions:

[ \hat{Q}{\alpha,t}^{\text{ens}} = \sum_k w{k,t} \hat{Q}_{\alpha,t}^{(k)} ]

where (\hat{Q}_{\alpha,t}) is quantile forecast (e.g. q50, q90, q95).


2) Data contract (minimum viable)

Unit = child order attempt/fill event.

Required fields

Guardrails


3) Expert model design

Keep experts intentionally different (diversity > perfection).

M1 — robust linear baseline

[ y = \beta_0 + \beta_1\cdot spread + \beta_2\cdot POV + \beta_3\cdot RV + \beta_4\cdot OBI + \epsilon ]

M2 — square-root impact expert

[ \text{impact} = Y\sigma\sqrt{Q/V} ]

M3 — transient-impact expert

[ y_t = \sum_{\tau<t} G(t-\tau) q_\tau + \phi^\top z_t + \epsilon_t ]

M4 — nonlinear quantile ML expert


4) Online weighting mechanics

Predictive likelihood

Use Student-t likelihood for fat tails:

[ p(y_t|M_k,x_t)=t_\nu\big(y_t;\mu_{k,t}, s_{k,t}\big) ]

This prevents a single outlier from instantly zeroing a good model.

Forgetting factor

Weight floor / cap

Entropy monitor

[ H_t=-\sum_k w_{k,t}\log w_{k,t} ]


5) Regime features and drift detection

Use lightweight drift signals to tune DMA responsiveness:

If drift alarm = ON:

  1. reduce (\lambda) (faster forgetting)
  2. increase uncertainty penalty in controller
  3. tighten max POV and larger passive bias
  4. optionally trigger SAFE mode if burn-rate breaches

6) Execution controller coupling

DMA forecast is useful only if tied to action.

Define per-decision score:

[ J(a)=\mathbb{E}[\text{slippage}|a] + \eta,\text{OppCost}(a) + \rho,\text{TailRisk}_{95}(a) ]

Action set (example):

Policy chooses action minimizing (J(a)) under constraints:

State ladder


7) Backtest & promotion protocol

Do not promote with mean bps only.

Offline checks

Shadow mode

Run live shadow for 1-2 weeks:

Canary promotion


8) Practical defaults (starter)


9) Failure modes to avoid

  1. Ensemble of near-clones

    • If experts are too similar, DMA adds little adaptation.
  2. Likelihood without heavy-tail robustness

    • Gaussian likelihood overreacts to shock observations.
  3. No feature-time hygiene

    • Tiny leakage can fake great calibration.
  4. No no-fill accounting

    • Fill-only slippage underestimates true execution cost.
  5. Action-policy mismatch

    • Better forecasts are wasted if controller still uses static heuristics.

10) Minimal implementation skeleton

init models M1..M4
init weights w_k = 1/K
for each decision event t:
  x_t = point_in_time_features(t)

  for each model k:
    pred_k = model_k.predict_quantiles(x_t)   # q50/q90/q95
    ll_k   = student_t_loglik(y_t_prev, pred_k_prev)

  w_k = normalize((w_k ^ lambda_t) * exp(ll_k))
  w_k = apply_floor_and_renorm(w_k, floor=0.05)

  pred_ens = weighted_quantiles(pred_k, w_k)
  regime   = detect_regime_and_drift(metrics)
  action   = controller(pred_ens, regime, constraints)

  execute(action)
  log(decision, pred_k, w_k, pred_ens, regime, action)

  periodically refit/update each model on rolling PIT-clean window

11) What “good” looks like in production

If those are true, DMA is doing its job: adapting without thrashing.


Closing note

Slippage is not one distribution. It is a moving mixture generated by changing microstructure.

Dynamic Model Averaging gives you a practical way to treat that reality directly: multiple hypotheses alive, continuous evidence update, explicit tail-aware control.

In short: stop searching for one forever-model. Build an ensemble that learns the regime before the regime invoices you.