Historical Stock Market Returns — Averages, Volatility, and Backtests
What “average return” actually means
People search for the S&P 500 average return and land on a single number — often “about 10%.” That is a compounded average over many decades. It is useful for setting a baseline. It is a poor description of any one decade you will actually live through, especially around a crash.
A compound interest calculator that assumes a constant 8% every year draws a smooth curve. Real historical stock market returns are jagged. The tools below apply actual calendar-year returns so you can see the difference, compare indexes, and replay dollar-cost averaging versus a lump sum through crashes.
Loading historical returns…
Long-run compounded averages
Each cell is the compounded annual growth rate (CAGR) for the most recent complete window of that length. Inflation is the geometric average of CPI, not an asset return.
| Horizon | S&P 500 | FTSE 100 | MSCI World | 10y bonds | Inflation |
|---|---|---|---|---|---|
| Loading… | |||||
Why the average misleads: rolling 20-year S&P 500 returns
If every 20-year stretch paid the long-run average, this chart would be a flat line. It is not. 20-year rolling returns for the S&P 500 have ranged from painful (starting in the late 1920s or late 1990s) to exceptional (starting in the early 1980s). Diversification into bonds changes the path; it does not remove the range.
Market crashes (calendar year −20% or worse)
We flag a crash when that index lost 20% or more in a single calendar year. That is a simple screen, not a recession dating committee. Hover the backtest chart after you run it — crash years are in the underlying returns.
DCA vs lump sum through a crash
Same $12,000, two ways: all in on the first month of the crash year, or $1,000 a month for 12 months. Both are then held to the start of the year five years later. In falling markets, spreading purchases often buys more shares — it is not a guarantee, and in steadily rising markets the lump sum usually wins.
Lump sum
Dollar-cost averaging
Backtesting engine
Enter the same kind of inputs the calculator uses. We add a year’s contributions, then apply that year’s actual return — matching the calculator’s year-by-year loop, not a live price feed. The smooth line is a constant 8% path on the same cash flows.
Index comparison
Same dollars and years as the backtest above. Overlaying the S&P 500, FTSE 100, MSCI World, and 10-year Treasuries is the simplest way to see why diversification and geography change outcomes. MSCI World (URTH) only starts in the 2010s — if your start year is earlier, that line will be missing.
| Index | Ending value | CAGR | Max drawdown |
|---|---|---|---|
| Run the backtest to fill this table. | |||
How to read historical stock market returns
Long-tail questions like “what is a realistic 20-year stock return?” or “how often does the S&P 500 lose money in a calendar year?” are better answered with a distribution than with a slogan. The rolling chart above is that distribution for 20-year windows. The backtest is what a lump sum plus monthly contributions would have done on one path.
Three cautions worth repeating:
- Price vs total return. Yahoo index prices (^GSPC, ^FTSE) do not include dividends, so long-run CAGRs sit below a total-return series. ETF proxies such as URTH use adjusted closes.
- Bonds are approximated. The 10-year path is built from FRED year-end yields plus a duration-based price change, not a live bond fund.
- Crashes are calendar years. 2020’s COVID drop was violent inside the year and still finished positive, so it does not meet the −20% annual screen.
If you want a constant-rate projection for planning, use the investment calculator. Then come back here and replay the same deposits through history so the volatility is not a surprise.
Sources
Index prices: Yahoo Finance (^GSPC, ^FTSE, URTH). Inflation: FRED CPIAUCSL. 10-year yields: FRED DGS10. Crash comparisons use monthly closes from the same Yahoo series. We rebuild historical_data.json with fetch_historical_data.py.
Compare a smooth 8% plan to history
Model your deposits on the calculator, then replay them here with real year-by-year returns.
Open the calculator