Why 90% of Profitable Backtests Are Useless
Why 90% of Profitable Backtests Are Useless I’ve reviewed thousands of backtests over the years. Most show beautiful equity curves, impressive Sharpe ratio…

Why 90% of Profitable Backtests Are Useless
I’ve reviewed thousands of backtests over the years. Most show beautiful equity curves, impressive Sharpe ratios, and returns that would make any hedge fund jealous. Almost all of them are worthless.
The problem isn’t the strategy logic or the alpha signal. It’s everything else — the invisible costs and assumptions that separate a backtest from reality. If your P&L doesn’t account for spread, slippage, realistic tick modeling, and broker execution quirks, you’re essentially trading fiction.
Let me show you what actually matters and how to fix it.
The Spread Problem: It’s Worse Than You Think
Most retail traders know about the bid-ask spread in theory. They know there’s a difference between where you can buy and where you can sell. But knowing it exists and properly accounting for it in your backtest are completely different things.
Here’s the issue: many backtesting frameworks use midpoint pricing by default. Your code sees a price of 100.00, assumes you can trade there, and records your fill. In reality, the bid might be 99.98 and the ask 100.02. You’re paying the spread on every single trade — both entry and exit.
For a strategy making 100 trades per year with a 2-tick average spread, you’re giving up 200 ticks annually. In ES futures, that’s $2,500 per contract. In NQ, it’s $5,000. Suddenly that 25% annual return becomes 15%, or worse.
The real killer is when spread varies with volatility. During market opens, news events, or low liquidity periods, spreads widen dramatically. If your strategy trades during these times — and many mean-reversion and volatility strategies do — you’re getting hammered worse than your historical average suggests.
What to do about it:
First, never use midpoint pricing for live-trading simulations. Always assume you’re paying the ask on buys and receiving the bid on sells. Better yet, if you have tick data, model the actual bid-ask at the time of your signal.
Second, add a spread buffer. If the historical average spread is 2 ticks, test with 3 ticks. Markets have a way of being less liquid exactly when you need to trade. This conservative approach filters out strategies that only work in theoretical conditions.
Third, consider spread as a percentage of your expected profit per trade. If your average winner is 5 ticks and you’re paying 2 ticks in spread, you’re giving up 40% of your edge. That strategy needs to be really good to survive real-world conditions.
Slippage: The Silent Killer
Slippage is often conflated with spread, but it’s different and arguably more dangerous. Slippage is when your order fills at a worse price than expected, even accounting for the spread. It happens because markets move between signal generation and execution, or because your order size moves the market.
Let’s talk about why this destroys most backtests.
Latency slippage: Your strategy generates a signal, sends an order, the order routes through your broker’s infrastructure, hits the exchange, and executes. Even if this takes 50 milliseconds (lightning fast by retail standards), the market can move. In volatile instruments or during fast-moving markets, 50ms is an eternity. Your backtest assumes instant fills at the price when the signal fired. Reality gives you fills 2–3 ticks worse.
Volume slippage: Your backtest sees 1000 contracts on the offer at 100.00 and assumes you can buy 50 there. But what if there are other algorithms ahead of you in the queue? What if those 1000 contracts get pulled before your order arrives? You end up chasing the market up to 100.02 or 100.03. This is especially brutal for larger accounts. Trading 1 contract is very different from trading 50.

Adverse selection: This one is subtle but critical. Market makers aren’t stupid. When they see your order, they’re updating their models in real-time. If you’re consistently buying and the next tick is up, you’re probably not the only one who spotted that signal. Market makers will fade the quote or widen spreads. You end up with worse fills over time as they learn your patterns.
What to do about it:
Model different slippage regimes. I use three scenarios: best case (0.5 ticks), typical (1.5 ticks), and worst case (3 ticks). If the strategy dies in the worst-case scenario, it’s not robust enough.
For volume-based slippage, look at actual order book depth at your signal times. If you’re planning to trade 100 contracts but there’s only 50 on the best level on average, your backtest better account for walking up the book. A simple approach: assume you can only take 25% of displayed liquidity at any price level without moving the market.
Add a latency parameter. Shift your fills forward by your expected round-trip time plus execution time. For most retail setups, that’s 50–200ms depending on your broker and strategy. Test how your results degrade as latency increases.
Tick Modeling: The Devil in the Details
This is where most backtests completely fall apart, even for people who think they’re being careful.
Your backtest says you bought at the low of the bar and sold at the high. Convenient, isn’t it? In reality, this is almost impossible. Let’s say you have a minute bar with a high of 100.10 and a low of 100.00. Your strategy says: “Buy if price hits 100.02, sell at 100.08.” The backtest shows this trade happening. But did price actually hit 100.02 before 100.08? You have no idea with just OHLC data.
This is called the “intra-bar execution problem” and it’s responsible for more fake profits than any other single issue.
The Monte Carlo illusion: Some people try to solve this with Monte Carlo tick generation. They simulate random paths within each bar that respect the OHLC constraints. This is better than nothing, but it’s still guessing. Real market microstructure isn’t random — it has momentum, mean reversion, and other properties that simple random walks miss.
The limit order trap: Limit orders are especially problematic. Your backtest places a limit buy at 100.00, the low of the bar was 100.00, so you got filled, right? Wrong. Maybe the low was just a single print of 100 contracts while you needed 50. Maybe it was a spread trade that didn’t represent true market liquidity. Maybe there were 500 orders ahead of you in the queue.

Stop orders are even worse: A stop-loss at 100.00 with a low of 100.00 might not have triggered if price approached but didn’t touch it. Or it might have triggered and then you got filled 3 ticks lower due to momentum. Without tick data, you’re guessing.
What to do about it:
If your strategy is high frequency or makes multiple trades per bar, you need tick data. Period. There’s no way around it. The good news is tick data is cheaper than ever, especially for futures.
For lower-frequency strategies, assume worst-case intra-bar execution. If you’re buying on a limit order, assume you only get filled if price trades through your limit by at least 1–2 ticks (meaning you probably got filled near your limit as momentum carried through). If you’re using stops, assume you get filled 1–2 ticks worse than your stop level.
Test your strategy on multiple timeframes. If it works on daily bars but fails on hourly bars with the same logic, your daily results probably relied on impossible intra-bar fills.
Here’s a trick I use: Deliberately degrade your fills. Enter 1 tick worse than your signal, exit 1 tick worse than your target. If the strategy still works, it’s robust. If it fails, you found one that only works in theoretical conditions.
Broker Assumptions That Kill Your Edge
Even if you model spread, slippage, and tick data perfectly, your broker can still ruin you. Most backtests assume a perfect broker that never fails. Real brokers are messy.
Reject rates: Your broker will reject orders. Maybe your risk limits changed. Maybe there’s a connectivity issue. Maybe the exchange is in a trading halt you didn’t know about. In a backtest, every order executes. In reality, I see rejection rates of 0.5–2% depending on the broker and market conditions. If your strategy makes 1000 trades per year, that’s 5–20 missed trades. If those trades were entry signals, you just missed opportunities. If they were stops, you’re now in unprotected positions.
Partial fills: You send an order for 10 contracts, get filled on 4, then the market moves. Your backtest assumed 10. Your risk management assumed 10. Now you’re under-allocated or need to chase the market.
Minimum tick size and lot size restrictions: Your optimal position size is 7.3 contracts. Too bad, you can trade 7 or 8. This rounding creates tracking error that accumulates over hundreds of trades.
Margin and buying power: Your backtest might show you taking positions in 10 different instruments simultaneously. Does your account actually have the margin to do this? During volatile periods, margin requirements increase. Suddenly you can’t deploy your full strategy.
What to do about it:
Add a kill rate to your backtest — randomly reject 1–2% of orders and observe how your strategy degrades. If results fall apart, you’re over-fitting to perfect execution.
Model partial fills. Assume you only get 60–80% of your desired size on larger orders, especially when trading less liquid instruments or during volatile periods.
Round all position sizes to actual tradeable lots in your backtest, not just at the end. This small detail changes results more than you’d expect.
Include margin requirements in your position sizing. Don’t just calculate how many contracts your signal says to trade — calculate how many you can actually afford given your capital and broker’s margin rules.
The Secret: Backtesting in Reverse
Here’s something most people miss: You should be trying to make your backtest results worse, not better.
Most quants spend time optimizing parameters to maximize backtest returns. This is exactly wrong. You should be stress-testing your strategy to minimize returns while staying realistic. Find the worst plausible assumptions about spreads, slippage, tick modeling, and broker execution — and if your strategy still makes money, you might have something real.
I call this “adversarial backtesting.” Assume:
- Spreads 50% wider than average
- Slippage 2x your best estimate
- Fills only at unfavorable intra-bar prices
- 2% order rejection rate
- Partial fills on 30% of orders
- Margin requirements 25% higher than current levels
If you still have positive returns with a reasonable Sharpe ratio (>1.0), your strategy is robust. If not, you found another pretty backtest that dies in production.
The Costs You’re Not Measuring
Beyond spread and slippage, there are hidden costs most backtests ignore:
Data costs: Real-time and historical tick data isn’t free. For a serious operation, you’re paying $500–2000/month minimum. Your backtest shows $50k annual profit, but you’re spending $12k on data.
Technology costs: Servers, co-location if you’re doing HFT, backup systems, monitoring tools. This adds up faster than you think.
Time costs: Your strategy requires monitoring. Maybe it’s just 30 minutes per day, but that’s your time. If you value your time at $200/hour (you should), that’s $100/day or $25k/year. Is the strategy generating enough over a passive index to justify this?
Psychological costs: Drawdowns that look manageable in a backtest feel very different when it’s your money. If your backtest shows a 20% max drawdown but you know you’d panic and shut down the strategy at 15%, the backtest is lying to you about the actual expected returns.
A Real Example
Let me show you a real case study. I tested a simple mean reversion strategy on ES futures:
- Signal: Buy when price is 2 standard deviations below 20-period moving average
- Exit: When price returns to the moving average
- 1-minute bars, no stops
Naive backtest (mid-price, instant fills, no costs):
- Annual return: 34%
- Sharpe ratio: 2.1
- Max drawdown: 12%
- Win rate: 68%
Realistic backtest (1-tick spread, 1-tick slippage, pessimistic tick modeling):
- Annual return: 11%
- Sharpe ratio: 0.9
- Max drawdown: 18%
- Win rate: 61%
Adversarial backtest (2-tick spread, 2-tick slippage, worst-case assumptions):
- Annual return: -3%
- Sharpe ratio: -0.2
- Max drawdown: 24%
- Win rate: 58%
The naive backtest would get funded. The realistic backtest is marginal — might work but needs optimization. The adversarial backtest reveals the truth: this strategy doesn’t have enough edge to overcome real-world frictions.
Final Thoughts
The goal of backtesting isn’t to find strategies that work in simulations. It’s to find strategies that work when everything goes wrong — when spreads are wide, when you get terrible fills, when your broker hiccups, when the market is moving fast and nothing executes cleanly.
Most profitable backtests are useless because they’re testing the wrong thing. They’re measuring whether a signal has predictive power, not whether that predictive power is large enough to overcome the brutal realities of execution.
Start assuming your backtest is lying to you. Add every cost you can think of, then add more. Make execution worse than you think it will be. Only trade strategies that survive this process.
The strategies that work in adversarial backtests are rare. That’s exactly why they’re valuable.
Let’s connect!
Disclaimer:
This article is for educational purposes only and does not constitute financial advice. Trading in financial markets involves significant risk and may result in the loss of your capital. Past performance is not indicative of future results. You are solely responsible for your trading decisions. Always conduct your own research and consult with a qualified financial advisor before making any trading decisions.


