Backtest looked clean. Paper trading looked clean. Live account bled. Here's what I missed.
Backtest: ~38% CAGR, Sharpe 1.9, max DD 11%. Paper-traded it for two months and the tracking held within a few percent. At this point, i'm fairly confident that things will work out.
Went live, down 6.2% in five weeks. Same code, same broker, same hours.
It took me longer than I want to admit to figure out what was actually different.
What the isses were:
- Slippage on entries: Backtest assumed mid. Real fills landed 20-40% closer to the ask on average. On a strategy targeting ~8bps per trade, that gap was the entire edge.
- Spread widening around the open: I'd modeled a static 1bp spread. In reality, the first 15 minutes ran 3–6bps regularly, and most of my entries clustered right there.
- Partial fills on the exit. Backtest filled the full size at the limit. Live, I'd get 40–60% filled and have to chase, or hold past my exit logic and watch the move fade.
- Queue position. Limit orders that "filled" in the backtest were sitting behind 50k shares of resting liquidity. Half the time, they never filled at all.
The strategy wasn't wrong. The simulation was lying about execution.
The harder part is none of this shows up in paper trading either, because most paper engines model fills the same lazy way backtests do. You don't find out until real money hits the book.
Full disclosure: I've been working on validation infrastructure for this exact problem, so I'm biased on the framing. But for those of you who've made the sim->live jump and held up, what execution assumptions did you have to tighten before the numbers stopped lying?
Specifically interested in how you model spread, partial fills, and queue position on equities or futures.