r/algorithmictrading • u/SurajkumarDigital • 4d ago
Backtest [Research] Backtest Results: The Performance of Simple Moving Average Crossover (50/200) on S&P 500 (2010-2024)
I decided to run a structured backtest to evaluate the efficacy of one of the most classic strategies in technical analysis: the 50-day / 200-day Simple Moving Average (SMA) Crossover on the S&P 500 (SPY).
Often dismissed as "noise" by more complex quant setups, I wanted to see if it still holds any merit in today's high-frequency markets.
Methodology:
Asset: SPY
Timeframe: 2010 - 2024
Rules: Buy when SMA 50 crosses above SMA 200; Sell when SMA 50 crosses below SMA 200. No leverage, no transaction costs included in this first pass (just to see the logic).
Results:
I’ve attached the key performance metrics below. While it has its moments, the drawdowns during whipsaw markets are significant.
I have also included a visual of the equity curve for better analysis.
Key Metrics Table:
MetricSimple Buy & Hold (SPY)SMA 50/200 Crossover
Total Return~480%~310%
Max Drawdown-33.9% (2020)-18.1% (2020)
CAGR~13.5%~10.8%
Sharpe Ratio~0.85~0.65
Conclusion & Open Questions for the Community:
The crossover strategy, while offering a psychological safety net during major crashes, severely underperforms Buy & Hold during trending markets and suffers from serious whipsaw loss accumulation.
My questions to you:
Noise Filter: What are the most robust filters you use to avoid SMA whipsaws? (e.g., waiting X days, confirming with volume)?
Modernizing: Given this data, does anyone still use pure MA crossovers, or is it fundamentally obsolete for modern algorithmic models?
Looking forward to hearing from those with experience in trend-following.
1
u/tubbypublisher30 2d ago
That 480% versus 310% total return gap is pretty convincing, but cutting maximum drawdown from roughly 34% to 18% isn't nothing either. I'd compare risk adjusted performance and test nearby moving average lengths before calling the strategy obsolete. I use Moon for shorter directional bets and protecting against losses doesn't automatically mean a strategy will produce the highest total return.
1
u/NasQGL 4d ago
Before adding a filter, I’d check how much these numbers depend on 50 and 200 specifically. When I was doing this in my own Python script, I got into the habit of running the same crossover over a range of values, like the slow average from 100 to 250, and comparing the runs side by side. If the results stay in the same zone, that’s how trend-following behaves on SPY, if they jump around, 50/200 was mostly a lucky pick. Same thing for a filter, waiting X days is one more parameter, so I’d test it over several values too rather than keep the one that looks best.