Rolling returns: the range behind a single trailing return

On this page

Key takeaways

  • A trailing return, such as the 10-year return on a fund's fact sheet, is one window ending on one date. Rolling returns compute every window of that length, so the same history yields a whole range of outcomes instead of one number.
  • The usual summary is the worst, median and highest yearly growth rate for each holding period, and the share of windows that ended with a gain.
  • Longer windows narrow the range of yearly growth rates, because good and bad years average out; they do not narrow the range of ending wealth in dollars, which compounds over more years.
  • Consecutive windows share almost all of their months, so a few hundred rolling windows contain only a handful of separate periods; the range describes this history, not the odds of the next period.
  • MarketHeist computes rolling returns from monthly total returns, starting a new window every month, and quotes each window's growth as a yearly rate.

Definition

Rolling returns are the annualized returns of every holding period of a fixed length inside a history, each one starting a month later than the last: every 10-year stretch, not only the 10 years ending today. Their spread from worst to highest, and their median, show how much the result depended on when an investor started.

Also known as: rolling period returns, rolling 10-year returns, rolling CAGR, range of N-year returns, trailing vs rolling returns, holding period returns.

How it works

Take a fund's value at every month-end. For a 10-year rolling return, compare each month-end's value with the value 120 months earlier and turn the growth into an annual rate. Slide forward a month and repeat. The result is one 10-year annualized return for every month from the end of the first full decade to today, a line that rises and falls as the start and end dates sweep through good and bad markets.

A single trailing return hides how much the answer depends on dates. A 10-year return measured from the top of a bubble to the bottom of a crash and one measured from a bottom to a top describe the same fund. Fact sheets show trailing 1-, 3-, 5- and 10-year returns ending on the latest quarter-end, which is a sample of one window per length; next quarter's sheet can tell a different story without anything about the fund having changed.

Rolling returns replace the single number with a distribution. Its worst and highest values show the range investors actually lived through; the median shows the typical outcome; the share of windows above zero shows how often the holding period ended with a gain. Comparing short and long periods shows the main pattern of stock market history: one-year results range widely, and the range of annualized results narrows as the period lengthens.

Measuring a fund by its trailing return is like judging a city's weather from one day's forecast; rolling returns are the climate record, every day of every year.

The narrowing has limits. Annualized returns converge because they are averages, but the ending value in dollars is the annual rate compounded over the whole period, so the gap in wealth between a good and a bad 20-year stretch can be larger than between a good and a bad year. And the windows overlap: two 20-year windows a month apart share 239 of their 240 months. Forty years of history contain only two 20-year periods that do not overlap, however many rolling windows they produce.

Formula

Rolling N-year annualized return
Rt(N)=(VtVt−12N)1/N−1,Vt=∏s=1t(1+rs)
R_t^(N)
annualized return of the N-year window ending at month t
N
holding period in years (1, 3, 5, 10 or 20 in the lab)
Vₜ
growth of 1 at the end of month t, dividends reinvested
rₛ
total return of month s
12N
the window's length in months

For N = 1 the exponent is 1 and the figure is the plain 12-month return.

Summary of one holding period
worst=mintRt(N),highest=maxtRt(N),share with a gain=#{t:Rt(N)≥0}WN
min, max
the lowest and highest values over all windows of that length
#{…}
count of windows whose annualized return was zero or above
W_N
number of N-year windows in the history

The median is the middle value of the sorted windows (the average of the two middle values when their number is even).

How many windows, and how many of them are independent
WN≈T−12N,KN=⌊T12N⌋
T
length of the history in months
W_N
rolling windows of N years (one per month-end after the first full window)
K_N
windows of N years that fit end to end without sharing a month
⌊·⌋
round down to a whole number

With long holding periods, W_N runs into the hundreds while K_N stays at one or two: most of the information in the rolling windows is repeated.

Worked example

The S&P 500 (SPY) and Japanese stocks (EWJ, an MSCI Japan index fund), every rolling window inside Apr 1996 to Sep 2026, about 31 years of monthly total returns.

Over single years, the S&P 500's returns ranged from -43.4% to 56.2%, with a median of 14.1%. Over 20-year windows the range of annualized returns shrank to between 4.7% and 11.3% a year. Every 20-year stretch in this history ended with a gain, against 80.2% of the 354 one-year windows.

Any trailing figure is one draw from these ranges. The S&P 500's 10-year rolling returns ran from -3.4% a year, for a decade that lost money, to 16.5%, with a median of 8.0%; a fact sheet's "10-year return" is whichever of those 246 windows happens to end on its date.

Japanese stocks over the same months show how much the market matters as well as the period. EWJ's median 10-year return was 3.7% a year, against 8.0% for the S&P 500, and its worst 20-year window earned -0.6% a year: two decades with almost nothing to show. Only 67.3% of its 5-year windows ended with a gain, against 84.0% for the S&P 500.

These windows overlap heavily. The 126 rolling 20-year windows of the S&P 500 come from about 31 years of data, which hold at most one 20-year stretch that does not share months with another: the table is a fine-grained picture of one history, not hundreds of separate experiments.

Data through Sep 2026. Reproduce id f136630f17a57b64 (this guide, its lab setup and the data month).

Interactive lab

Worst, median and highest annualized return for every 1-, 3-, 5-, 10- and 20-year window, and the share of windows with a gain, for both picks over the same months. Switch funds or portfolios to compare their ranges.

Annualized return of every holding period: SPY and EWJLowest, median and highest annualized return over every window of each length, Apr 1996 to Sep 2026. SPY: 1 years -43.4% to 56.2%, median 14.1%, gained in 80% of 354 windows; 3 years -16.3% to 29.3%, median 11.4%, gained in 82% of 330 windows; 5 years -6.7% to 22.9%, median 10.7%, gained in 84% of 306 windows; 10 years -3.4% to 16.5%, median 8.0%, gained in 90% of 246 windows; 20 years 4.7% to 11.3%, median 8.6%, gained in 100% of 126 windows. EWJ: 1 years -40.4% to 75.0%, median 5.7%, gained in 61% of 354 windows; 3 years -24.8% to 32.5%, median 5.0%, gained in 75% of 330 windows; 5 years -9.1% to 16.3%, median 4.2%, gained in 67% of 306 windows; 10 years -3.7% to 10.0%, median 3.7%, gained in 86% of 246 windows; 20 years -0.6% to 5.6%, median 3.7%, gained in 98% of 126 windows.-40%-20%0%20%40%60%1Y80%61%3Y82%75%5Y84%67%10Y90%86%20Y100%98%SPYEWJMedianGained
Lowest to highest annualized return over each holding period; the tick marks the median, and the figure at the right is the share of windows with a gain. Apr 1996 to Sep 2026.
Holding periodPortfolioLowestMedianHighestWindows with a gainWindows
1 yearsSPY-43.4%14.1%56.2%80%354
3 yearsSPY-16.3%11.4%29.3%82%330
5 yearsSPY-6.7%10.7%22.9%84%306
10 yearsSPY-3.4%8.0%16.5%90%246
20 yearsSPY4.7%8.6%11.3%100%126
1 yearsEWJ-40.4%5.7%75.0%61%354
3 yearsEWJ-24.8%5.0%32.5%75%330
5 yearsEWJ-9.1%4.2%16.3%67%306
10 yearsEWJ-3.7%3.7%10.0%86%246
20 yearsEWJ-0.6%3.7%5.6%98%126

Annualized return of every window of the stated length that fits in the common window, each month-end start; overlapping windows share months, so the count is not a count of independent periods. A gain is a window at or above 0. Apr 1996 to Sep 2026.

How MarketHeist computes it

Every choice an implementation has to make, as the code makes it today. The page is checked against the code each time it is built.

ChoiceHow it is computedIn the code
DataMonthly total returns (dividends reinvested). Funds younger than the period shown are extended backward with older funds, spliced on returns, not prices.
WindowThe worked example and the lab use the common window of the two portfolios compared, Apr 1996 to Sep 2026 (366 months), ending at the data month of this page; a holding period is every window of that many years that fits inside it.
Portfolio streamsA fund is its proxy-extended monthly return stream. A built-in portfolio is read as the MarketHeist MCP reads it: its composed stream with its own rebalancing rule and overlay. A custom mix is rebalanced yearly.
Holding periodsFrom the monthly value path rebased to 1: for every month-end that has N years of history before it, the annualized return is (value now over value N years earlier) to the power 1/N, minus 1 (for one year, the plain return). The highest, lowest and median are over those windows; a window with a gain is one at or above 0. Overlapping windows share months, so the count of windows is not a count of independent periods.
Rolling returnFor each month t at least 12N months after the first month-end value, the value at t divided by the value 12N months earlier, raised to 1/N, minus 1. Values are the growth of 1 after each month's total return, dividends reinvested. The 1-year figure is the plain 12-month return.rollingCagrpackages/portfolio/engine/windows.ts
SummaryFor each holding period: the lowest, highest and median window, the share of windows whose annualized return was zero or above (counted as a gain), and the number of windows. The same function feeds the rolling-return table of the portfolio app.rollingStatspackages/portfolio/engine/windows.ts
WindowBoth picks are measured over their common window of monthly returns, ending in the latest data month, so their rolling windows end in the same months. A holding period longer than the window is left out.
No overlap correctionEvery rolling window counts once in the share and the median, although neighbouring windows share most of their months. The figures are descriptive; no confidence band or test is computed from them.
Engine functionsThe functions the portfolio app and the MarketHeist MCP tools run, called here on the same monthly returns.rollingStatspackages/portfolio/engine/windows.tsrollingCagrpackages/portfolio/engine/windows.tsequityCurvepackages/portfolio/engine/metrics.ts

Rolling returns compared with its neighbours

Rolling returns and other ways to report past returns
MeasureWindows usedShows the range of outcomesSensitive to the end date
Trailing return (1, 3, 5, 10 years)One per length, ending on the latest dateNoVery
Calendar-year returnsOne per calendar yearYes, for one-year periodsNo, but tied to January starts
CAGR over the whole historyOneNoSomewhat
Rolling returnsEvery window of a length, one per monthYes, for any lengthLittle: the whole history counts
Monte Carlo or bootstrapSimulated paths built from past returnsYes, beyond the paths that happenedDepends on the model

Limitations

  • Overlapping windows are not independent observations. A share of windows with a gain computed from hundreds of overlapping windows rests on far fewer distinct market episodes, and a single long boom or bust shapes many windows at once.
  • The figures describe one market's history. The S&P 500 had one of the strongest stock market records of any country; other markets, Japan among them, show worse long-period outcomes over the same years.
  • Annualized returns narrow as the period lengthens, but the dollar outcome does not: the spread of ending wealth between a good and a bad long period remains large.
  • Returns here are before taxes and inflation. Real (after-inflation) rolling returns are lower, and in high-inflation decades much lower.
  • Long histories are extended backward with older funds or indexes where a fund is younger than the window, so early windows approximate the fund rather than reproduce it.

Frequently asked questions

What is the difference between trailing and rolling returns?
A trailing return is one window ending on the latest date: the last 10 years. Rolling returns compute every window of that length, one ending in each month of the history, and summarize them. The trailing return is one of the rolling returns, the most recent.
Why do longer holding periods show a narrower range of returns?
Because an annualized return over many years is an average of the yearly results, and an average of many years varies less than any single year. The range of the ending dollar value does not narrow the same way, since it compounds the annual rate over more years.
How do you calculate rolling returns in Excel?
Put month-end values (or a growth index with dividends reinvested) in a column. In the row 120 months below the first value, enter =(B121/B1)^(1/10)-1 for a 10-year return and fill down. MIN, MEDIAN and MAX over the column give the summary; COUNTIF(range,">=0")/COUNT(range) gives the share with a gain.
Are rolling returns a good way to compare two funds?
They are more informative than one trailing return, as long as both are measured over the same months. A fund with a higher median and a narrower range had a more reliable record over that history; a newer fund has fewer windows, and its long-period range rests on very few distinct periods.

References

  1. Siegel, J. J. (1994) Stocks for the Long Run. McGraw-Hill. Ranges of holding-period returns for US stocks and bonds since 1802.
  2. Dimson, E., Marsh, P. and Staunton, M. (2002) Triumph of the Optimists: 101 Years of Global Investment Returns. Princeton University Press. Long-run returns across countries, including the poorer records outside the US.
  3. Valkanov, R. (2003) Long-Horizon Regressions: Theoretical Results and Applications. Journal of Financial Economics 68(2). Why statistics from overlapping windows overstate the evidence.

Try it on your own holdings

Open the S&P 500 portfolio and read its rolling returns →

Or ask an assistant connected to the MarketHeist MCP server (https://marketheist.io/mcp), which computes the same figures:

Using MarketHeist.io, what were the worst, median and highest rolling 1-, 5-, 10- and 20-year annualized returns of the S&P 500 (SPY) and of Japanese stocks (EWJ) over the same months?

Ask an AI assistant

The prompt opens in a new tab, already filled in. An assistant without the MarketHeist connector answers from its own knowledge, not from the figures on this page.

Historical simulation, not advice. Computed by the MarketHeist portfolio engine from monthly total returns, data through Sep 2026. Markdown version of this page: rolling-returns.md.