The Problem with Point-to-Point CAGR
CAGR (Compounded Annual Growth Rate) measures the compounded growth between two specific dates. Despite the word "average" in its name, there is no averaging happening. It is purely point-to-point: start NAV on date A, end NAV on date B, and the formula gives you the steady annual rate that would produce the same result.
The problem is that a single number from a single pair of dates is fragile. Shift your start date by a week and the CAGR can look meaningfully different, especially if markets moved sharply around that time. When comparing funds or measuring a fund against a benchmark, you don't want a number that jumps around based on an arbitrary date choice.
What Rolling Returns Answer
Rolling returns shift the question from a single data point to a distribution of outcomes. Instead of asking "what was the CAGR from January 2018 to January 2025?", rolling returns ask: "across the fund's entire history, what did a typical 1-year holding return? How consistent was it? How often did it go negative?"
The way this works: for every single trading day in the fund's history used as an end date, the system looks back exactly 1 year and computes the CAGR for that window. Do this for every possible end date and you get thousands of individual 1-year CAGRs. Then average them, find the median, find the worst and best, and count how many were negative. That is what the rolling returns table shows.
For example, a 1-year rolling return computed over 7 years of history will produce roughly 1,500-1,700 individual 1-year CAGR observations. The average of those is a far more reliable picture of what a 1-year holding typically looks like, unaffected by any single arbitrary date.
Two Periods: Rolling Window and Evaluation Period
Rolling returns involve two distinct time spans that are easy to confuse:
- Rolling Window: the holding period being simulated. If you select "1 Year", each individual observation is a 1-year CAGR. If you select "3 Years", each observation is a 3-year CAGR.
- Evaluation Period: the overall historical span across which those windows are computed. For example, January 2013 to March 2026.
The statistics you see (average, median, % negative) are summaries across all the individual rolling observations within the evaluation period. A longer evaluation period means more observations and more reliable statistics.
Evaluation Period Must Be Longer Than the Rolling Window
The rolling window must fit meaningfully inside the evaluation period, otherwise there are too few observations to draw any conclusion.
If a fund launched in 2022 and you select a 5-year rolling window, there is barely enough history for even a single valid 5-year observation. The result would not be meaningful. As a rule of thumb: a 5-year rolling window needs at least 7 to 8 years of data to produce a useful distribution. A 3-year window needs at least 4 to 5 years. The number of observations in the table tells you how much data went into the calculation. Fewer observations means less reliability.
When evaluation period is shorter than or equal to the rolling window (e.g. 5Y rolling over Last 3Y), the Run button is disabled.
How It Works: Calendar Days, Not Trading Days
Rolling windows are defined in calendar days, not trading days. A "1 Year" window looks back exactly 365 calendar days from each end date, not 250 trading days.
Since markets are closed on weekends and holidays, the target date 365 days ago may not have a NAV. The system uses an ASOF JOIN, a database technique that finds the most recent available NAV on or before the target date. This is equivalent to using the last trading day before the target.
For example: if the end date is February 28, 2026, the system targets February 28, 2025. If that falls on a weekend, it uses the Friday NAV instead (say February 27, 2025). The CAGR is then computed over the actual calendar days between the two matched dates, not an assumed 365.
For sub-1Y windows (3M, 6M): Absolute Return = (End NAV / Start NAV - 1) x 100
Each window also has a minimum-gap threshold: the actual days between start and end NAV must exceed this minimum to be counted. This filters out cases where the ASOF match lands too close to the end date due to extended market closures.
Available Windows
Five rolling windows are available:
| Window | Look-back | Min Gap | Return Type |
|---|---|---|---|
| 3 Months | 91 calendar days | 46 days | Absolute % |
| 6 Months | 183 calendar days | 92 days | Absolute % |
| 1 Year | 365 calendar days | 328 days | CAGR (annualized) |
| 3 Years | 1,096 calendar days | 986 days | CAGR (annualized) |
| 5 Years | 1,826 calendar days | 1,643 days | CAGR (annualized) |
The 3M and 6M windows use absolute (non-annualized) returns since annualizing short periods can be misleading. The 1Y, 3Y, and 5Y windows use CAGR.
What the Table Shows
For the selected window, each fund shows these summary statistics computed across all its rolling observations:
- Avg CAGR: the mean of all rolling returns. Your "expected" return if you had invested on a random day within the evaluation period.
- Median CAGR: the middle value. Less affected by extreme observations than the average.
- Min / Max CAGR: the worst and best rolling return, with the end dates. Min usually corresponds to investing just before a major crash; Max to investing at a market bottom.
- Std Dev: volatility of the rolling returns distribution.
- % Negative: what percentage of all rolling windows produced a negative return. A fund with 10% negative means you had a roughly 1-in-10 chance of losing money over that holding period, had you invested on a random day.
- Beat %: percentage of rolling periods where the fund outperformed the benchmark (Nifty 50). See the dedicated Beat Rate tab for details.
- Observations: how many rolling windows were computed. More observations means more reliable statistics.
A fund with a high average CAGR but also a high % negative is high-return but inconsistent. A fund with a lower average but near-zero % negative is more reliable: you almost never lose money over that holding period regardless of when you invested.
The ASOF JOIN in Detail
The computation runs entirely in DuckDB SQL on the backend. For each trading day in a fund's history (the "end date"), the ASOF JOIN finds the most recent NAV that falls on or before the target start date. Simplified SQL:
SELECT t.fund, t.date AS end_date, p.date AS start_date, -- For 1Y+: annualized CAGR POWER(t.nav / p.nav, 365.25 / days_between) - 1 FROM nav_daily t ASOF JOIN nav_daily p ON t.fund = p.fund AND p.date <= t.date - INTERVAL 365 DAY WHERE days_between >= 328
The ASOF JOIN is what makes this efficient.
Instead of scanning all rows to find the nearest date, it directly matches the closest
available NAV in a single pass.
Related metrics
More Returns methodology from the MFPRO analytics tool: