How to backtest an asset allocation over history

Five browser tools replay a fixed mix over past returns. What decides the number is the series before each fund existed, dividends, rebalancing and fees.

Type the weights into a browser backtester, then fix five settings before reading anything: dividends reinvested, the rebalancing rule, cash flows off, nominal or real, and fees. testfolio runs daily with full history free; Portfolio Visualizer runs monthly and caps free ticker runs at ten years; Curvo runs UCITS funds on index history; Portfolio Charts runs asset classes annually. What breaks is the series standing in before a fund existed.

The short way

Pick the tool by the question the data can answer, then pin down five settings before trusting any figure it prints.

  1. Which series. Named funds you hold, or asset classes. Funds have short histories; asset-class series reach back to 1970 or 1972, and anything older than a fund is a stand-in.
  2. Dividends reinvested. Turn total return on. A price-only run is a different statistic.
  3. The rebalancing rule. Never, on a calendar, or when a weight drifts past a band.
  4. Cash flows off for the first run. Contributions and withdrawals change what CAGR means in some tools and not in others.
  5. Nominal or real, and fees. Know whether fund costs are already in the data and whether the figure is after inflation.

Then run the same mix twice with one setting changed. A difference you can attribute to a setting is information; a difference between two tools with five settings unmatched is not.

What the options are

Named funds on daily data. testfolio aligns daily return series, gives full history on the free tier, and takes a rebalance frequency, an offset, an "annual drag" figure and optional bands for each portfolio. Its preset SIM tickers extend a fund back before it listed, and an FB modifier on any ticker splices in another ticker's returns before the first one begins. PortfoliosLab also works on daily, dividend-adjusted prices and takes the opposite view of history: a portfolio begins on the day its youngest holding did, and nothing is extended. Its free plan sees five years.

Named funds or asset classes on monthly data. Portfolio Visualizer has two backtests. The asset-class one runs from January 1972 on a free session; the ticker one is cut to the last ten years on the free tier. Its documentation says it uses total-return data and reinvests dividends and capital-gains distributions by default, and it can map a young fund to a proxy, or to the fund's oldest share class, to extend it backwards. Backtest by Curvo is the European version of the same idea, over 1,306 UCITS funds, and its index funds are run on the index behind them with a twelfth of the ongoing charge taken off each month.

Asset classes on annual data. Portfolio Charts never touches a ticker. It runs annual, inflation-adjusted total returns from 1970 for twelve home countries, and every chart is computed for every start year rather than one.

The comparison of Portfolio Visualizer and testfolio works through which free tier answers which question, and what to use instead of Portfolio Visualizer takes its modules one at a time.

The settings that change the number

Total return or price return. A price series leaves out every dividend and coupon; a total-return series reinvests them. Portfolio Visualizer has a Reinvest Dividends choice that defaults to yes. testfolio reinvests only when a portfolio's "Invest dividends" box is ticked, and says its preset tickers already track total return, so the box changes nothing for them. Curvo assumes every fund accumulates, distributing ones included. Portfolio Charts measures each asset's total return as a snapshot every 31 December.

Rebalancing. Each tool offers a different menu, read on 9 October 2026:

  • Portfolio Visualizer: annual, semi-annual, quarterly, monthly or none, or bands set as an absolute and a relative deviation, defaulting to 5% absolute and 25% relative.
  • testfolio: a frequency with an optional offset, applied at the close of the period's last trading day, plus absolute and relative bands that can run alongside the calendar.
  • Curvo: monthly to every three years, or none, or an absolute band of 5%, 10%, 15% or 20%.
  • Portfolio Charts: annual, fixed. Its methodology page says the rule is built into the maths.

The two band types are different rules. Portfolio Visualizer's documentation gives the example: a 60% target rebalances at 65% or 55% under the 5% absolute band, and a 10% target at 12.5% or 7.5% under the 25% relative one. A tool on monthly data can only see drift at month ends, so a band breached and recovered inside a month never fires.

Contributions and withdrawals. Portfolio Visualizer offers a fixed contribution, a fixed withdrawal or a percentage withdrawal, monthly, quarterly or annually, optionally inflation-adjusted with CPI-U, and applies any fee before the cash flow. testfolio takes several cash flow legs, each with its own amount, frequency, offset and end date, as a fixed sum or as a percentage of the portfolio for withdrawals only. Curvo takes a one-off amount or a recurring contribution; its interface has no withdrawal option. Portfolio Charts puts contributions and withdrawals in specific calculators, always at constant purchasing power. PortfoliosLab models neither.

Inflation. Portfolio Visualizer uses US CPI-U. testfolio uses US CPI for dollars and local CPI or HICP for six other reporting currencies, and its inflation switch applies to cash flows too. Curvo uses the Belgian consumer price index, which on its card's check ended seven months before the market data did. Portfolio Charts is always real, deflated by each home country's own CPI.

What CAGR and drawdown mean in each. The CAGR formula takes two balances, and the tools disagree about which two. Portfolio Visualizer computes it from the start and end balance, so contributions are inside it, and shows a time-weighted figure and an IRR beside it. testfolio says its CAGR ignores cash flows and behaves like a time-weighted return, with a money-weighted figure separate. Curvo's interface defines CAGR against the total amount invested over the simulation. The maximum drawdown depends on the sampling: daily on testfolio, month-end on Portfolio Visualizer and Curvo, year-end on Portfolio Charts, whose own FAQ says annual data reports the mildest drawdowns and daily data the deepest.

Where this breaks

The series before the fund existed. Every long backtest of a young fund is a splice, and the splice is the assumption. testfolio's SIM tickers join a modelled segment to the real fund with nothing on the chart to show where; its card records TQQQ from February 2010 at 42.3% CAGR and the simulated TQQQSIM from 1986 at 13.3%, one instrument and two start dates. Curvo assumes perfect tracking of the index, says itself that there is always a tracking error, and 44 of its 504 index series had stopped updating on its card's check without being marked. Portfolio Charts fills its oldest years from a priority list that ends in substitutes, such as ex-US large-cap blend standing in for ex-US small-cap value before about 1975. Portfolio Visualizer's sample output says plainly when the youngest fund constrained the period and which older share class would extend it.

The fund list survived. The funds you can type in are the ones that exist today. A strategy of "the funds I would have picked in 2000" is tested on funds that were not merged, closed or renamed since, which is survivorship bias at the level of the menu. Running on index or asset-class series avoids the closed funds and keeps the hindsight in the choice of index.

Dividends you did not get. Curvo treats a distributing fund as accumulating, so the cash you received and spent is compounded inside the result. Its index series mix net-of-withholding total return (277 of them), gross total return (206) and price only (21), and a portfolio built across the three compares unlike things. Portfolio Visualizer's documentation says mutual fund distributions usually reach its data within two business days of the ex-date. And testfolio with "Invest dividends" unticked runs a real ticker on price alone.

The start date. A mix tested from one year and again from the next can report a different CAGR and a different worst drawdown, and a longer window can only find a deeper drawdown, never a shallower one. Read a rolling-returns chart or Portfolio Charts' Heat Map, which gives a CAGR for every start year at every holding period, before quoting one number.

Fees counted twice, or never. Portfolio Visualizer's data is already net of each fund's expense ratio, so subtracting the expense ratio again double counts it. Portfolio Charts refunds the expense ratio to show returns before fees, so its figures need the cost taken off by you. Curvo has a switch for the TER and fields for a management fee and a per-transaction fee. Portfolio Visualizer's backtest page says its results reflect no trading costs and no taxes; testfolio's turnover and tax estimate treats every dividend as a capital gain for simplicity and calls itself an estimate.

Resolution. Daily, monthly and annual data produce three different drawdowns for one history. Compare drawdowns only between tools on the same sampling.

If you outgrow this

When the rule needs code — bands that depend on volatility, cash flows tied to a schedule no form offers, thousands of variants — bt does allocation and rebalancing over a frame of prices in Python, and the rest of backtesting frameworks handles entry and exit rules rather than static mixes.

When the question is a withdrawal plan, a backtest of the accumulation is the wrong tool. FI Calc and cFIREsim replay withdrawals against every historical cycle, and why two retirement calculators disagree covers the series and conventions behind their success rates. A forward projection is a Monte Carlo simulation, and its generator decides the answer the way the stand-in series decides a backtest's.

The tools that do this

In the order this page recommends trying them. Paid placement does not affect this order.

  1. testfolio

    Daily data, calendar and band rebalancing, cash flow legs, full history on the free tier. SIM tickers extend funds before they existed, unmarked on the chart.

    Backtest an allocation on daily data to 1885, using simulated pre-inception fund series.

    $15/moFree tier

  2. Portfolio Visualizer

    Monthly total-return data net of fund fees, five calendar rules or bands. Free ticker runs stop at ten years; asset-class runs reach back to 1972.

    Backtest an asset mix to 1972, run Monte Carlo, regress it on Fama-French factors.

    $30/moFree tier

  3. Backtest by Curvo

    UCITS funds run on their index less the TER, monthly in euros, back to 1970. Calendar or absolute bands, broker fees, contributions but no withdrawals.

    Backtest a portfolio of European UCITS funds on index data reaching back to 1970.

    FreeFree tier

  4. Portfolio Charts

    Asset classes, not funds, on annual real returns since 1970 in twelve home currencies. Annual rebalancing is fixed; fees and taxes are left out.

    Any asset allocation, charted since 1970 in twelve countries' currencies and inflation.

    $5/moFree tier

  5. PortfoliosLab

    Real fund prices only, daily. A portfolio starts at its youngest holding and nothing is backfilled. Free accounts see five years.

    Backtest an allocation on real fund prices and optimise it seven ways.

    $10/moFree tier

FAQ

Why does the same allocation show a different CAGR in two backtesters?

Usually because the two tools fed it different inputs, not because one is wrong. Check the start date each one actually used, whether dividends were reinvested, whether returns are nominal or after inflation, whether fund fees are in the data, and whether contributions sit inside the CAGR. Portfolio Visualizer's CAGR includes cash flows, testfolio's ignores them, and Curvo's divides by the total amount invested.

Is a backtest that runs before a fund existed a real result?

No. The years before inception come from a stand-in, an index with a fee deducted, an older share class, a similar fund or a modelled series, joined onto the fund's own record. That shows how an exposure behaved, not what any holder of that fund received, and testfolio, for one, does not mark the join on the chart.

Should dividend reinvestment be switched on?

For comparing an allocation with an index, a fund's published return or another backtest, yes, because those are total-return figures. Portfolio Visualizer reinvests by default, testfolio reinvests per portfolio when "Invest dividends" is ticked, and Curvo and Portfolio Charts always reinvest. A price-only run understates every income-paying holding by its yield.

Does the rebalancing frequency change the result?

Yes, and by an amount that is a property of the window tested. Each tool offers a different menu, from Portfolio Charts' fixed annual rule to testfolio's calendar plus absolute and relative bands, and a monthly-data tool can only see drift at month ends. Run the same mix under two rules over the same dates before reading anything into the difference.

Sources

  1. Help, Methodology, and Tool Guides — testfolio, read
  2. Portfolio Backtester guide — testfolio, read
  3. Portfolio Visualizer Documentation (FAQ) — Portfolio Visualizer, read
  4. Backtest Portfolio Asset Allocation — Portfolio Visualizer, read
  5. Backtest FAQ — Curvo, read
  6. Methodology — Portfolio Charts, read
  7. Data Sources — Portfolio Charts, read
  8. FAQ — Portfolio Charts, read

The catalogue next door

This page names a handful of cards. The rest of them are in Retirement & Portfolio Planning Calculators, each filled in against the same schema, with the fields to narrow it yourself.

Last updated . Corrected in place: this is a reference page, not a dated post.

Report an error on this page

Quote the line and say what it should be.

The vendor’s page, filing or documentation that says otherwise.

Only if you want to hear back. Never published.

Read by a person. It fixes a fact and moves nothing else.