The Moat Index · Backtest

As-of scores, and what happened next.

For each year from 2011 to 2025, we re-scored companies using only the SEC filings that were on file by that December 31 — no later restatements, no hindsight — and then, separately, joined the returns that came afterward. The point isn’t to prove moats win. It’s to show the method honestly: the years it lagged, the windows that haven’t finished, and the caveats that make the comparison imperfect are all left in.

How the scores avoid hindsight

1 · Freeze the information set

A cohort year’s scores use only the 10-Ks on file by that Dec 31. A company with a December fiscal year-end is scored off its prior year’s 10-K, because the current one hadn’t been filed yet. Restatements filed later are ignored.

2 · Score business quality only

No prices touch the score — pricing power, returns on capital, balance sheet, and capital discipline are all filing-derived. So a high score can’t have been reverse-engineered from a stock that later did well.

3 · Join returns after the cutoff

Only then do we attach forward returns. Entry is the first market close on or after Jan 1 of the following year, and each window runs anchor-to-anchor. A window that hasn’t fully elapsed is left null — never annualized from a partial period.

Scored under methodology moat-index@1.2.0. Only rows sharing a methodology version are compared; a tier that changes across a version boundary is a scoring change, not a company event.

Wide-moat median vs. the S&P 500, by cohort year

Each row is a cohort scored as of that Dec 31; the bar is the 5 years forward return that followed. Where the wide-moat median falls short of the index, the bar is shorter — shown, not hidden.

Wide-moat median (total return)S&P 500 (price return)
2011n=85 wide
Wide-moat
87%
S&P 500
77%
2012n=113 wide
Wide-moat
103%
S&P 500
84%
2013n=121 wide
Wide-moat
52%
S&P 500
37%
2014n=114 wide
Wide-moat
62%
S&P 500
58%
2015n=115 wide
Wide-moat
79%
S&P 500
84%
2016n=121 wide
Wide-moat
88%
S&P 500
112%
2017n=110 wide
Wide-moat
35%
S&P 500
42%
2018n=113 wide
Wide-moat
61%
S&P 500
89%
2019n=131 wide
Wide-moat
46%
S&P 500
80%
2020n=115 wide
Wide-moat
20%
S&P 500
85%
2021n=128 wide
Wide-moatwindow not complete yet
S&P 500window not complete yet
2022n=153 wide
Wide-moatwindow not complete yet
S&P 500window not complete yet
2023n=140 wide
Wide-moatwindow not complete yet
S&P 500window not complete yet
2024n=139 wide
Wide-moatwindow not complete yet
S&P 500window not complete yet
2025n=139 wide
Wide-moatwindow not complete yet
S&P 500window not complete yet

Read this carefully. Each cohort scores the full filing universe that cleared the data bar — 380–2,092 companies per year — and each year’s wide-moat “median” is taken over the 85–153 names rated Wide-moat that year (the n on each row). This is an illustration of the method, not a portfolio or a strategy. Company bars are total-return (dividends reinvested); the S&P bar is the price-only ^GSPC index, which understates the index by roughly its dividend yield. The two are not perfectly comparable, and that gap flatters the companies. Past returns do not predict future returns.

Every cohort, every window

The complete table the chart draws from. “Wide median” is the median total return of the names scored Wide-moat that year (n shown). Berkshire is BRK.B on the same total-return basis — the fair, like-for-like comparison. S&P 500 is the price-return index over the same window, which excludes dividends and understates the market — shown for reference, not as a fair bar. Blank means the window hasn’t finished yet, or there were no Wide-moat names to take a median of.

CohortWide nWide 1-yrWide 3-yrWide 5-yrBRK.B 1-yrBRK.B 3-yrBRK.B 5-yrS&P 1-yrS&P 3-yrS&P 5-yr
20251392025 cohort →
2024139−3%10%17%2024 cohort →
20231406%24%24%2023 cohort →
202215321%27%17%60%24%79%2022 cohort →
2021128−25%2%3%50%−20%22%2021 cohort →
202011524%12%20%32%59%117%30%28%85%2020 cohort →
201913121%21%46%0%36%98%14%17%80%2019 cohort →
201811330%84%61%13%48%79%30%91%89%2018 cohort →
2017110−2%43%35%3%16%57%−7%37%42%2017 cohort →
201612129%55%88%20%39%84%19%44%112%2016 cohort →
201511517%38%79%25%55%75%12%25%84%2015 cohort →
2014114−4%35%62%−12%32%53%−2%31%58%2014 cohort →
201312113%30%52%27%39%73%12%23%37%2013 cohort →
201211332%43%103%26%40%112%25%38%84%2012 cohort →
20118517%65%87%20%92%111%15%61%77%2011 cohort →

What this comparison does and doesn’t show

These are the engine’s own caveats, shown word-for-word — not our summary of them:

  • Point-in-time reconstruction: each score uses only SEC filings on file by Dec 31 of the cohort year; restatements filed later are ignored, and filers with December fiscal year-ends are scored off the prior fiscal year (their 10-K arrives the following spring).
  • Survivorship bias: unless delisted companies were ingested explicitly by CIK, the cohort is drawn from companies still filing with the SEC today — names that failed or delisted since are missing, which flatters any forward-looking comparison. Companies whose filings had already gone stale at the cutoff are computed but excluded from the ranking (the stale count). The same caveat extends to returns: a name that stopped trading mid-window reports null with a note, never a guessed return through its delisting. Price histories are keyed by each company's ticker symbol as of today; a symbol that changed hands between issuers during a window can misattribute price history.
  • Scores are business-quality only: no prices feed them, so valuation, margin of safety, and price-dependent verdicts are absent. Forward returns are a separate join of market data made after scoring and never influence any score.
  • Forward returns start strictly after the information cutoff: entry is the first trading close on or after Jan 1 of the year following the cohort year, and each 1y/3y/5y window runs anchor-to-anchor to the first trading close of the corresponding later year. Windows that have not fully elapsed are null — never annualized or extrapolated from a partial period.
  • Return basis honesty: company returns are total returns (split-adjusted closes with dividends reinvested at the ex-date); the S&P 500 benchmark is the ^GSPC price index, which excludes dividends and therefore understates the index by roughly its dividend yield in any comparison. A second benchmark, Berkshire Hathaway (BRK.B), is computed on the SAME total-return basis as the companies — Berkshire pays no dividend, so its dividend-adjusted series equals its price series, and the same code path is used so the comparison is strictly like-for-like. Each record labels its own returnBasis.
  • Educational, not investment advice. Hindsight makes every backtest look wiser than anyone could have been at the time.

Open a cohort year