Asset-Location Backtester

Compare a naive cross-account placement against a tax-optimal placement for your saved household setup and date range.

On this page

Features

  • Runs naive and tax-optimal household tax backtests from the same saved household setup
  • Reports after-tax CAGR delta, terminal after-tax value delta, and attributed tax drag saved
  • Breaks tax-drag differences down by year, asset, and account
  • Separates realized-loss benefits from positive tax-drag cells
  • Saves private analysis inputs with the exact household setup references used for the run. Superseded results are withheld while the inputs remain available for a current-engine rerun

When to use it

Use this tool when the question is where assets should live across taxable, traditional, Roth, and HSA accounts. It handles household-level placement experiments, not choosing an asset allocation from scratch.

Start with Tax Profile & Accounts to define the household, accounts, target allocation, and current holdings. Use Tax-Aware Backtesting for the shared lot, wash-sale, dividend, and annual tax-settlement assumptions behind the simulations.

Step-by-step walkthrough

  1. Open Household, tax, & accounts and confirm filing status, ordinary income, resident state, accounts, and tax settings.
  2. Save the household setup. The backtester resolves the saved holdings version.
  3. Open Asset-Location Backtester and set the date range.
  4. Run the comparison. The backend synthesizes two starting placements and runs both through the same household tax-accounting engine.
  5. Read the summary. Then, inspect the waterfall and attribution rows for the years, assets, and accounts that drove the result.

Comparison policies

PolicyHow It Starts
NaiveEach account holds every target asset in proportion to that account's share of household dollars.
Tax-optimalThe policy places assets by tax-efficiency class and account fit score, filling the best available account capacity first.

Snapshot date and start date

The backtest seeds both variants from your saved holdings, so the start date cannot fall before the snapshot date. Starting earlier would fund the simulation with lots that did not exist yet, which would misstate returns, holding periods, and wash-sale windows.

A snapshot captured today therefore has no past window available. To measure a period that has already happened, import a holdings snapshot dated on or before the start date you want. The importer lets you set that date.

The backtest values starting balances at the first close on or after the start date. It never substitutes an earlier close. Mutual fund prices post after the market closes. The backtest rejects a start date whose prices have not posted yet, and names the affected symbols. Choose an earlier start date, or run it again once those prices post.

How to read results

  • After-tax CAGR delta: tax-optimal CAGR minus naive CAGR.
  • Terminal after-tax value delta: tax-optimal ending value minus naive ending value.
  • Attributed tax drag saved: naive attributed investment-tax drag minus tax-optimal attributed investment-tax drag.
  • Delta rows: positive values mean the tax-optimal placement reduced attributed drag for that year, asset, and account.

Modeling assumptions

  • The backtest uses the saved household setup to infer account dollar capacity at start-date prices, then both comparison policies build fresh synthetic starting lots.
  • Synthesized taxable lots use the start date as acquisition date and start-date close as cost basis. This keeps the two policies symmetric and reproducible.
  • Attribution covers investment-side taxes: short-term gains, long-term gains, NIIT, qualified dividends, ordinary dividends, and investment state tax.
  • Ordinary income tax and RMD state-tax overlays remain in the household backtest tax bills but are not allocated into per-holding drag cells.
  • The results report realized losses as separate loss-benefit rows, and do not net them into positive tax-drag cells.

Suggest placement (Pro)

The suggest placement panel proposes a tax-optimal per-account placement of your saved target allocation for one representative year. It is a Pro-tier compute action. The backtester scores real price history. The optimizer uses a single-year tax-drag model.

  • Current: single-year tax drag of the placement implied by your holdings snapshot, valued at the selected start date.
  • Naive: single-year tax drag if every account held the target allocation in the same proportions (no tax-location awareness).
  • Suggested: single-year tax drag of the optimizer's proposed placement. The result is never worse than your current placement when the current placement already matches the target allocation. The optimizer falls back to your current cells in that case.
  • Per-account placement table: the suggested weight and dollar value of each ticker in each account.
  • What changed: a human-readable diff of the dollars moved between accounts and assets, with a one-line rationale tied to each ticker's tax-efficiency class.

Optimizer modeling assumptions

Drag figures are dollars per year. The optimizer does not compute a multi-year present value. It gets yield and appreciation from five tax-efficiency classes: bonds, broad equity, growth, municipal, and unclassified. It does not use observed dividend history. The backtester uses real dividend data.

  • Federal rates: ordinary, qualified-dividend, and long-term capital gains rates come from the bracket schedule for the selected start date's year. Years outside the supported window fall back to the most recent supported schedule.
  • LTCG stack position: the optimizer reads the LTCG / qualified dividend bracket at the household's ordinary income plus projected qualified investment income. Existing dividends and capital gains therefore push the marginal rate into the next bracket.
  • NIIT (3.8%): phased in continuously. The effective per-dollar rate on investment income is min(NII, max(0, MAGI − threshold)) / NII × 3.8%, matching IRC §1411. A household just above the threshold pays NIIT only on the dollars above it, not on every dividend.
  • State tax: the optimizer adds the resident-state marginal ordinary rate to ordinary income drag in taxable. It also adds the rate to qualified-dividend / LTCG / appreciation drag in taxable (most states tax investment income as ordinary). State LTCG carve-outs and state-NIIT analogues are outside the current model boundary.
  • Tax-deferred drag: ordinary distributions, qualified dividends, LTCG turnover, AND unrealized appreciation inside a Traditional account all eventually withdraw as ordinary income. The optimizer scales each by a 50% deferral factor to approximate the multi-year economics of RMDs and ordinary-rate withdrawals. NIIT does not apply inside tax-advantaged accounts.
  • Tax-free drag: zero by construction. Roth and HSA shelter every income type permanently, which is the structural reason growth-equity placement skews toward Roth.
  • Unrealized appreciation in taxable: only the realized fraction (50% by default) owes long-term capital gains tax within the planning horizon. Step-up at death and long holding periods defer the rest.

Saved analyses

Saved analyses are private-only because the request and result can include household tax context, account names, share counts, and lot basis. Saved analyses reopen with the same immutable household setup references so the result remains reproducible even if the household draft changes later. The optimizer's saved analyses live in the same family as backtester analyses in the load picker. A proposal and a backtest of the same household then sit side by side.