Product
Keep more of your return after tax
A tax-aware stock strategy against an S&P 500 fund, after tax, over 20 years.
+$1.01M more after tax over 20 years, +0.7 pts a year.
Account value at each month end, after that year’s tax has been paid out of it. Ending values above are .
Five steps, repeated for twenty years
Start. Both accounts buy on the same day. The fund holds the S&P 500. The strategy holds the largest 1,000 stocks with a tilt toward value and growth.
Losses harvested, and tax paid
Harvesting is richest when prices fall and when the account is young. The banked losses are what keep the strategy’s tax bill down.
Where the difference comes from
Every combination, this scenario. “Kept” is after-tax as a share of before-tax: the cleaner measure of tax efficiency, since harvesting also changes what is held.
| Plain, after tax | Plain, kept | With harvesting, after tax | With harvesting, kept | |
|---|---|---|---|---|
| S&P 500 fund | $7.77M | 84% | $8.34M | 81% |
| Tax-aware strategy | $8.12M | 74% | $8.78M | 74% |
Ahead in 14 of 16 scenarios
Right: strategy ahead. Left: S&P 500 fund ahead. Each window starts with a fresh $1M. Click a scenario to load it above.
How to read this
- After tax
- Every December the account pays tax on dividends and realized gains. The lines show what is left.
- As held / if sold
- As held keeps deferring tax on unrealized gains. If sold pays it too.
- Harvesting
- Sell a losing position, bank the loss against gains, reinvest in the same sector. Details in the tax article.
- Scenarios
- The same simulation started on different dates. A strategy that only wins in bull markets is not worth much.
Method
- Strategy: the largest 1,000 US stocks, cap-weighted, 40% tilt to a value-and-growth score. Benchmark: cap-weighted S&P 500. Both rebalanced each March.
- Tax lots, holding periods, the wash-sale rule, and yearly tax payments simulated position by position over 20 years.
- No trading costs or fees deducted for either portfolio.
All assumptions
- Tax rates are the 2025 statutory stacks from tax_efficient_eq/charts/05_rate_stack.csv (federal + NIIT + state), held constant across the whole 2006-2026 history; no attempt to model the actual rates in force in each year.
- All dividends are treated as qualified and taxed at the long-term rate.
- Harvest threshold: a lot is harvested when its price is at least 5% below its cost basis. Positions are checked twice a month (mid-month and month end).
- Wash-sale block: any name sold at a loss cannot be re-bought for 31 calendar days. A blocked name's rebalance target weight is capped at its current value and the freed weight is spread pro rata (by target weight) over the unblocked target names.
- Wash-sale de-minimis on the sell side: a lot is still harvestable if the only purchases of that name in the prior 30 days total less than 10% of the shares currently held. Without this, the monthly pro-rata dividend reinvestment (about 0.02% of each position) would block essentially all harvesting; the real rule only disallows the loss on the number of replacement shares bought, which at that size is negligible.
- Harvest is capped at 20% of NAV per month end (largest percentage losses first), so a broad drawdown such as 2008 is harvested over several months rather than in one.
- Substitutes: the proceeds of a harvested position are put straight into the other holdings in the same sector, in proportion to their target weights, so the portfolio stays close to its design. At the first check after the 31-day wash window the harvested name is bought back to its target weight, funded by trimming same-sector holdings that sit above target (highest-cost lots first). Real programs use a correlated proxy security for this; the sector basket is the stand-in.
- Tax-aware trading (harvesting runs only): a lot held under a year that sits at a gain is never sold to rebalance or to swap back; it waits until the gain is long-term. The no-harvesting runs are the naive baseline and sell highest-cost lots first regardless.
- Delisting: a held name whose price goes NaN is sold at its last available close, booked on the first event date (month end or rebalance) at or after the price disappears.
- Cash held between events earns no interest.
- Trading is frictionless: no commissions, no spread, no market impact, executed at the close.
- Losses carry forward indefinitely keeping their short/long character; the $3,000 ordinary-income offset is ignored.
- Year-end tax is paid from cash first, then by selling pro rata across holdings (HIFO within each name) at the last December close; those sales are realised in the following tax year.
- The pre-tax path is a separate run of the identical trade logic with taxes switched off, so it never sells to pay tax. With harvesting on it still makes the harvest trades, so the pre-tax paths for harvest-on and harvest-off are not identical.
- No trading happens on a scenario's final event date; the terminal values are struck on that day's close.
- Series start at the scenario start date with NAV 1.0, then one point per month end, ending at the scenario end date.
- Turnover is (buys + sells) / 2 divided by average NAV and by the number of years; the opening purchase and the hypothetical final liquidation are excluded, tax-payment and delisting sales are included.
- Prices are split-adjusted closes; dividends per share are derived as (1 + total return) * previous close - close, with tiny negatives clipped to zero.