Signal-to-Execution Lag
A backtest that fills a signal at the same bar it was computed from is filling on information that did not exist yet. The gap between "the data says trade" and "the order is live" eats the fastest-decaying part of most edges.
Prerequisites: Look-Ahead Bias, Alpha Decay
A daily close-to-close reversal strategy looks clean on paper: compute the signal from today's close, buy at today's close, done. But today's close is not usable data the instant the bell rings. The exchange has to finalize the print, your data vendor has to deliver it, your batch job has to run the computation, and a human or a router has to send the order. On a slow desk that whole chain can easily take until the next morning. A backtest that fills at "today's close" is filling on a price that, for the strategy as actually run, was never tradeable.
This is not the same problem as slippage or market impact — those are about paying more to trade at a price you could reach. Signal-to-execution lag is about whether the price you're filling at was reachable at all, given how long it took you to decide.
Worked example: the reversal that only exists before you can trade it
A five-day cross-sectional reversal on liquid large caps. Signal computed from the prior five closes, position taken at that same day's close. Backtested edge: 25 bps per round trip, annualising to a Sharpe of 2.1.
Now add the lag that actually exists in production: data finalizes and the batch job completes 45 minutes after the close, so the earliest live fill is the next day's open.
| Assumed fill | Lag | Captured edge | Sharpe |
|---|---|---|---|
| Same-day close (backtest) | 0 min | 25 bps | 2.1 |
| Next open, no delay | ~17 hrs (overnight) | 9 bps | 0.9 |
| Next open, 45-min compute delay | ~17.75 hrs | 7 bps | 0.7 |
Two-thirds of the edge is gone before a single dollar of transaction cost is applied. Reversal signals are disproportionately vulnerable because the mean-reversion itself happens overnight — the market drifts back toward fair value in exactly the window between "signal fires" and "order lands," so the lag doesn't just delay the trade, it consumes the trade's reason for existing.
Measure and encode the actual time between "the bar closes" and "the order can be live," including data delivery, compute, and routing — then fill on the first price genuinely reachable after that clock runs out, not on the price used to generate the signal.
The common shortcut — "just fill at next open instead of same close" — is only correct if next-open is truly your first reachable price. If your pipeline takes 45 minutes past the close and the strategy is intraday, next open may already be too late; you needed the price 45 minutes into the following session, not the print at 9:30.
The fix is to build the lag into the simulation as a first-class parameter, not a filename convention. Log the wall-clock time each stage of the real pipeline takes — data arrival, feature computation, order generation, routing — sum them, and shift every fill forward by that amount before touching a P&L number.
Practice in interviews
Further reading
- Kissell, The Science of Algorithmic Trading and Portfolio Management (ch. 4)