Mutual Funds, Minus the Marketing · Part 27 of 30
Survivorship bias in fund performance tables
What survivorship bias is
Survivorship bias is what happens when you study only the things that are still around, and the ones that dropped out would have changed the answer.
For funds, the dropouts are the schemes that were merged into a sibling or wound up. In our view their track records often drop out of the tables you see later, so a ten-year table lists the funds that made it to year ten. The weak ones aren’t in it, and the average looks better than the group that started.
Earlier posts mentioned this in passing: the benchmarks post and the star ratings post both note that the peer group is missing its worst members. This post measures it, on a case where we know the truth. It’s part of Mutual Funds, Minus the Marketing.
How to measure it
Survivorship gap = metric for the funds still alive
− same metric for every fund that started
In real data you can’t do this, because the closed funds’ records are hard to find. In a simulation you can. We build a world where every fund is identical in skill, close some of them, and look at what the survivors’ table says.
A simulated world with no skill
This is a simulation, not market data. It uses a fixed random seed (seed 2026), so the results are the same every time you run it.
- 500 funds start together and run for 10 years (120 months).
- Every fund earns the benchmark’s return, less costs of 0.08% a month, plus random luck with a standard deviation of 1.2% a month. No fund has any skill. Any difference between funds is luck and costs.
- The benchmark compounds at about 12.94% a year in this run.
- At the end of years 3 to 9, the worst 10% of the surviving funds by trailing 3-year return are closed or merged away.
The closing rule is our assumption. Real funds are merged or closed for many reasons, not just recent performance (small size, a change of plan), and we haven’t measured how often. The point here is the direction of the effect, not its size.
| Year-end | Funds closed | Funds remaining |
|---|---|---|
| Year 3 | 50 | 450 |
| Year 4 | 45 | 405 |
| Year 5 | 40 | 365 |
| Year 6 | 36 | 329 |
| Year 7 | 33 | 296 |
| Year 8 | 30 | 266 |
| Year 9 | 27 | 239 |
By year 10, 239 of the 500 funds are left, or 47.8%.
What the ten-year table shows
Here is the same simulated result read two ways. In both, the returns are identical. Only the list of funds differs.
| Ten-year result, annual return minus benchmark | Every fund that started | Survivors only |
|---|---|---|
| Funds counted | 500 | 239 |
| Average excess return (percentage points a year) | −1.17 | −0.34 |
| Median excess return | −1.03 | −0.34 |
| Share of funds ahead of the benchmark | 19.2% | 33.9% |
Every fund in this world has zero skill. The full group trails the benchmark by a little more than its costs (0.96 points a year, plus a small compounding drag), and about 19.2% of them get ahead by luck. A reader of the survivors table sees a smaller shortfall and 33.9% ahead, and could reasonably conclude something about the managers. There’s nothing to conclude. The table is just missing the funds that had a bad stretch of luck.
🧒 Explain it like I'm 10 (optional — skip if this is already clear)
Imagine 100 kids enter a school race, and the slowest ones get sent home after each lap. At the end, the kids still running are fast. If you only look at that group, you’d think “children in this school are fast runners.”
But you only saw the kids who stayed. The ones who were sent home were slow, and they were part of the school too. Fund tables work the same way: they show the runners still on the track.
Doing it in Python
import numpy as np
rng = np.random.default_rng(2026)
n, months = 500, 120
bench = rng.normal(0.009, 0.045, size=months) # one benchmark path
funds = bench + rng.normal(-0.0008, 0.012, size=(n, months)) # no skill: benchmark - costs + luck
growth = np.hstack([np.ones((n, 1)), np.cumprod(1 + funds, axis=1)]) # column m = value after m months
cagr = lambda g, m: g ** (12 / m) - 1
excess = cagr(growth[:, -1], months) - cagr(np.prod(1 + bench), months)
alive = np.ones(n, dtype=bool)
for m in range(36, 109, 12): # annual reviews, years 3 to 9
trailing = growth[:, m] / growth[:, m - 36] # last 36 months
candidates = np.where(alive)[0]
worst = candidates[np.argsort(trailing[candidates])[: round(len(candidates) * 0.10)]]
alive[worst] = False
print(f"all funds: mean excess {excess.mean()*100:.2f} pts, ahead of benchmark {(excess > 0).mean()*100:.1f}%")
print(f"survivors: mean excess {excess[alive].mean()*100:.2f} pts, ahead {(excess[alive] > 0).mean()*100:.1f}% ({alive.sum()} of {n})")
Change the closing rule or the cost, and watch how the gap moves.
Common mistakes
- Reading a category average as if it were the whole category. It’s the average of what’s left. The benchmarks post calls out the same trap.
- Treating a “share of funds beating the index” figure as complete. Ask whether the count includes funds that were closed or merged during the period, and check before you rely on it.
- Using a list of top performers as evidence of skill. A list built from past results has already selected on those results. See the star ratings post for the same problem in rating form.
- Taking the simulation as a measurement. The direction holds in every run: closing laggards lifts the survivors’ average. The size depends on the closing rule, which is assumed here. This post doesn’t quote a real survival rate because we haven’t verified one.
Sources
- SEBI Master Circular for Mutual Funds (20 March 2026): SEBI’s rules on scheme mergers and consolidation, one way funds drop out of tables.
- AMFI, net asset value data: AMFI’s NAV data.
Takeaway: A table of today’s funds leaves out the ones that were closed or merged, which makes the group look better than the one that started. In a world where no fund has any skill, closing the laggards still leaves a survivors’ table that looks respectable.
This post is for educational purposes only and is not investment advice. Wealth Primer explains concepts, not recommendations — nothing here is a suggestion to buy, sell, or hold any specific security or fund. The author is not a SEBI-registered Research Analyst or Investment Adviser. Any prices or figures used as worked examples are historical and shown only to illustrate a calculation. Past performance does not indicate future results. Please do your own research or consult a registered adviser before making investment decisions. See the privacy & disclaimer policy for more.