Frequently Asked Questions

All Adjustments & Taxes Data & Methodology Performance & Statistics Practical Use Strategy Concepts Strategy Mechanics General

Adjustments & Taxes

What does the Inflation Adjusted toggle do?

When the Inflation Adjusted toggle is enabled, every monthly return shown is converted from a nominal return to a real return - what you actually gained in purchasing power after consumer prices rose that month.

The conversion uses the standard formula:

real return = (1 + nominal return) / (1 + monthly CPI change) - 1

Inflation data comes from the BLS CPI-U (Consumer Price Index for All Urban Consumers, not seasonally adjusted), measured month over month.

How recent and missing months are handled

The CPI is published with roughly a one-month lag, so the newest month in the data usually has no official print yet. Rather than treating those months as having no inflation at all, DMS carries the last known CPI value forward. This is conservative - month-over-month CPI is small and slow-moving - and it keeps the inflation-adjusted view from visibly diverging from nominal returns at the right edge of every chart. When the official figure is published, it replaces the carried-forward value automatically.

The same carry-forward fills any gap in the historical record, though those are rare. The one case where returns are left nominal is a month that precedes the earliest CPI value on file, since there is nothing to carry forward from.

The current month

Mid-month, there is no CPI figure for a month still in progress, so the month-to-date return is deflated using the most recent CPI available as a stand-in. The day-over-day figure is left nominal - a single trading day is too short a horizon for an inflation adjustment to mean anything.

A few other things to know

  • The toggle is global: equity curves, CAGR, drawdowns, detailed metrics, savings and withdrawal projections - everything recomputes in real terms. A hint appears under the controls ("Showing real (inflation-adjusted) returns") so you always know which mode you're in.
  • The risk-free rate used inside Sharpe, Sortino, and the Ulcer Performance Index is deflated along with everything else, so risk-adjusted figures stay internally consistent rather than mixing a real return against a nominal benchmark.
  • The setting is preserved in the page URL, so a shared link reproduces exactly what you were looking at.

Why use it?

Long backtests can flatter a strategy. A 10% nominal year during 8% inflation only grew your purchasing power about 2%. Real returns are the honest yardstick for long-horizon planning, especially for withdrawal-rate analysis.

Permalink to this answer → Last updated July 30, 2026
How does the Trading Friction toggle work?

Strategy results which ignore trading costs overstate what you would have actually earned. The Trading Friction toggle (on by default) deducts an estimated cost from each month's return based on how much the strategy actually traded that month.

The model is turnover-weighted. Each month, the strategy's new target ETF weights are compared against what it was already holding as the month opened. The sum of the absolute weight changes is the turnover, and each traded slice is charged a one-way cost based on the ETF's leverage:

ETF typeOne-way cost
Non-leveraged (1×)10 bps (0.10%)
2× leveraged15 bps (0.15%)
3× leveraged20 bps (0.20%)

So a month that rotates 50% of the portfolio out of one 1× ETF and into another costs roughly 0.10% (10 bps on the 50% sold + 10 bps on the 50% bought). Leveraged ETFs are charged more because their wider spreads and higher trading impact make them costlier to trade in practice.

Holdings that are left alone still move. This is the subtle part, and it is why the comparison is against what the strategy was holding rather than against last month's published percentages. If you hold 50% stocks and 50% bonds and stocks gain 10% while bonds are flat, you are holding roughly 52.4% / 47.6% a month later without having placed a single trade. Those percentages changed, but nothing was bought or sold and nothing was owed to a broker.

Two consequences follow:

  • A month spent holding costs nothing, even though the published allocation percentages moved. Strategies that deliberately let positions run - buy-and-hold portfolios, and the drift-band strategies that only trade once a position wanders outside its band - are charged only in the months they genuinely trade.
  • Rebalancing back to an unchanged target is not free. Returning that 52.4% / 47.6% portfolio to a 50/50 target means actually selling stocks and buying bonds. The target looks identical to last month's, but real money moved, and friction is charged accordingly.

Other points

  • The toggle is global - it flows through every view, chart, metric, and calculator, including benchmarks.
  • Benchmarks with a known, fixed composition (currently the 60/40) are modeled as annually rebalanced: weights start at the target mix each January (and at inception), then drift with the underlying ETFs' actual returns the rest of the year. Only the January reset generates turnover, so these benchmarks see a small, once-a-year friction cost rather than a monthly one. Single-asset benchmarks like the S&P 500 have no allocation to drift or rebalance, so they see none.
  • Imported strategies supply monthly returns only, never allocations, so there is no honest way to estimate their trading costs. In Strategy View, whenever an imported strategy is the selected strategy or the comparison pick, the toggle is disabled outright, keeping both sides on the same footing. Elsewhere on the site an imported strategy simply carries no friction charge, so treat a side-by-side against fully charged strategies with that in mind.
  • The setting is preserved in the page URL, so shared links reproduce your configuration.

Where the estimate is approximate

  • The cost is a flat basis-point charge on turnover, not a live spread. Real execution costs vary with market conditions, order size, and time of day. Wide-spread or thinly traded months could cost more than the model assumes; a patient trader in calm markets could pay less.
  • If a materially weighted holding is missing a return for the month, the drift calculation can't be completed honestly. Rather than skip the charge, the model falls back to comparing raw published weights, which can charge for drift that was never traded. This is rare and confined to months with data gaps.
  • An ETF with no leverage data on file is charged the 1× rate.

If you want to see the "frictionless" academic version of a backtest, switch the toggle off - just remember nobody earns those returns in a real account.

Permalink to this answer → Last updated July 30, 2026
What does the Taxable Account toggle do?

Monthly rotation strategies generate realized capital gains, and in a taxable account those gains get taxed. The Taxable Account toggle estimates after-tax returns so you can see how a strategy holds up once the IRS takes its share.

When you enable it, a settings dialog collects:

  • Filing status - Single, Married Filing Jointly, or Head of Household
  • Taxable income, after your standard or itemized deduction and including the gains you expect from this strategy. Capital gains stack on top of ordinary income when your brackets are determined, so leaving them out understates your rate.
  • An optional manual override if you would rather enter your own short-term and long-term rates directly (useful for adding state tax)

From your filing status and income the model looks up your marginal ordinary-income rate and your long-term capital-gains rate using the 2026 federal brackets (IRS Revenue Procedure 2025-32), then adds the 3.8% Net Investment Income Tax if your income exceeds the NIIT threshold ($200K single or head of household, $250K married filing jointly). Those NIIT thresholds are fixed by statute and have never been indexed for inflation.

If you use the manual override, the rates you enter are used exactly as typed. No NIIT is added on top of them. If you are over the threshold and entering your own rates to capture state tax, include the 3.8% yourself.

How the tax is applied

The model charges each calendar year the tax it would actually have owed, built from what the strategy realized rather than what it earned on paper.

  1. The FIFO lot simulation (see the Tax Efficiency FAQ) records what was sold each year and at what character.
  2. Short-term realizations are charged your ordinary rate, long-term realizations your capital-gains rate.
  3. Distribution income is charged separately every year.
  4. Capital losses are pooled and carried forward indefinitely, offsetting the highest-rated gains first.
  5. The resulting bill for the year is applied to that year's returns.

Gains you have not sold are not taxed. A position held across a year boundary is not a taxable event, so its gain carries forward untaxed and keeps compounding on the full balance. This is the entire tax argument for low turnover, and it is why a buy-and-hold allocation can show almost no tax drag while a monthly rotator shows a great deal.

The flip side: after-tax figures carry an embedded liability for anything still held. The Tax Profile panel reports that as Deferred (unsold). It is not charged, because you do not owe it until you sell, and under current law a step-up in basis at death may mean it is never owed at all.

Yields and distributions are taxed too

Interest and dividends arrive in cash whether or not you sell anything, and they get no holding-period benefit. Each ticker carries a published income character:

  • Ordinary - Treasury and corporate interest, CLO and bank-loan income, REIT and managed-futures distributions. Taxed at your ordinary rate every year, with no long-term treatment ever.
  • Qualified - ordinary equity dividends, taxed at your long-term rate.
  • None - bullion trusts, box-spread funds, and non-payers, whose entire return arrives as price change.

This matters most for defensive sleeves. A strategy parked in BIL or TLT during Risk Off is earning interest, not capital appreciation, and is taxed accordingly. Rate-sensitive holdings track the prevailing short rate through history rather than a fixed yield, so cash sleeves are correctly shown earning almost nothing in the ZIRP years.

Gold is taxed differently

Physical bullion trusts such as GLD and SGOL are collectibles under IRC 408(m). Their long-term gains are taxed at the lesser of 28% and your ordinary rate, not at the 15% or 20% long-term rates. Short-term gains on them are unaffected.

This is not a flat 28%. At a $150K married-filing-jointly income it works out to 22%; only at higher incomes does the 28% cap actually bind. Where it does bind it is a meaningful penalty: 31.8% including NIIT against 23.8% for ordinary long-term gains.

SHNY is not treated this way. It is an exchange-traded note, so its holder owns an obligation of the issuer rather than an interest in bullion, and it blends at the ordinary long-term rates.

Why one month each year looks unusually bad

The tax for an entire year is applied to that year's last month, not spread across it. December absorbs the full annual bill in one figure.

This is worth knowing before you scan a monthly returns table with the toggle enabled. A December showing a steep loss after a strong year is not a data error, and it is not what that month actually returned. Annual and longer-period figures are unaffected by where the charge lands, so CAGR, drawdown, and every multi-year statistic remain correct.

Comparing against a benchmark

Only benchmarks with a known composition can be taxed. The 60/40 benchmark is modeled as 60% SPY and 40% BND, rebalanced each January, and is taxed accordingly - including ordinary-income tax on BND's interest. Index benchmarks such as the S&P 500 and QQQ have no underlying allocation to derive trades from, so they are left untaxed.

That means a strategy compared against one of those benchmarks with the toggle on is being shown after tax against a benchmark shown before tax. The gap is understated. Use the 60/40 benchmark when you want a like-for-like after-tax comparison.

A few other caveats worth knowing

  • This is an estimate, not tax advice. Real-world results depend on your full tax picture, loss harvesting, and timing.
  • The tax character is computed over the strategy's entire history, not the date range you have selected. Changing the range does not change the rate applied. The Tax Profile panel is window-scoped, so the two can show different figures for the same strategy.
  • Strategies with less than 12 months of history cannot establish a tax character and are left untaxed.
  • Federal only. No state tax is modeled. Use the manual override if you want to fold it in.
  • The $3,000 annual capital-loss offset against ordinary income is not modeled. It is a fixed dollar amount and nothing here is denominated in dollars, so leaving it out is the conservative choice.
  • Wash sales are not modeled, nor are the lot-selection choices a real investor or broker might make. FIFO is assumed throughout.
  • Like the other toggles, it is global across all views and preserved in the page URL.

Use the ⚙ button next to the toggle to revisit your settings at any time.

Permalink to this answer → Last updated August 6, 2026
How is Tax Efficiency calculated (the Tax Profile panel)?

The Tax Profile (Est.) panel in the Strategy View's Return Statistics shows how tax-friendly a strategy's trading actually is - how much of what it earns gets turned into taxable gain, how much of that qualifies for the favorable long-term rate, and how much is simply left to compound untaxed.

Rather than guessing from turnover, we run a realization-based simulation of what a real account would have done, using FIFO tax lots:

  1. Each month's target weight changes are converted into purchases and sales. Every purchase opens a lot carrying its own share count, cost basis, and acquisition date.
  2. Sales consume lots oldest first, so a single sale can produce both a long-term and a short-term piece, exactly as it would on a 1099-B.
  3. Each piece is classified by that lot's own age. Long-term requires holding for more than one year, so a position sold on its twelve-month anniversary is short-term. This matters more than it sounds: strategies built on 12-month momentum signals frequently hold for exactly twelve months.
  4. Distributions are separated out before any of this. Interest and dividends are income, not capital gain, so they never enter the lot accounting (see the Taxable Account FAQ).
  5. At the end of the selected window, any position still held is marked as if liquidated that day and reported separately as deferred. It is not treated as a sale.

What the panel reports

For the date range you have selected:

  • ST lots (≤12 mo) / LT lots (>12 mo) - how many individual tax lots were realized in each bucket
  • ST / LT avg hold - average holding period in months for each bucket
  • ST / LT gains / yr - the average share of portfolio value turned into taxable gain each year, measured against the balance at the time of each sale. A strategy showing 7% ST gains / yr converts about 7% of its value into short-term gain annually.
  • Deferred (unsold) - the embedded gain sitting in positions you still hold. Nothing is owed on it until you sell.
  • Gold at 28% cap - appears only when a strategy holds bullion trusts such as GLD or SGOL. Shown two ways: as a share of long-term gains, which is what the collectibles rate actually applies to, and as a share of all gains, which is usually much smaller.
  • LT Gains % - the share of gross gains that were long-term

A higher LT Gains % means more of the strategy's gains get the favorable long-term rate. Lower ST gains / yr means less is being handed to the IRS each year in the first place.

Reading the numbers

  • Gains / yr figures are rates, not totals. They answer "how much of my balance becomes taxable each year", which stays readable over a forty-year history. A cumulative total would not.
  • Lot counts can exceed the number of trades made. FIFO splits one sale across however many lots it touches, and the end-of-window mark adds an entry for each position still open.
  • Tiny weight changes are ignored. Movements below 0.1% of portfolio value are treated as accounting noise between the strategy return series and the underlying ETF returns rather than as trades. Their gain is still counted; they just do not inflate the lot counts.
  • A dash instead of a percentage means the strategy booked no gross gains at all in the window. That is different from having too little data, which shows an explicit "Not enough data" message.
  • The gold percentages will differ sharply from each other. A strategy can show "67% of LT" and "0% of all" when its long-term bucket is nearly empty. The long-term figure is the one that drives the tax; the other exists to stop the first being misread.

How this relates to the Taxable Account toggle

The toggle uses the same simulation, but it runs over the strategy's entire history, not the date range selected here.

The panel is window-scoped; the toggle is not. So the LT Gains % displayed here is often not the exact split being applied to your after-tax returns, and narrowing the date range will change this panel without changing the tax being charged.

Limitations to be aware of

  • The panel needs at least 12 months of allocation data in the selected range; with less it shows "Not enough data" rather than a misleading number.
  • Blended (custom) portfolios are analyzed from their net ETF weights. When two sleeves trade the same ticker in opposite directions, those offsetting trades net out and may be under-counted, so blended results are a slight approximation.
  • Distribution yields are estimates. Each ticker carries a published income character and yield, and rate-sensitive holdings track the prevailing short rate rather than a fixed figure. These are good approximations, not a record of what any particular fund actually paid.
  • This is an estimate of a strategy's tax character, not a projection of your actual tax bill. It models no wash sales and no lot-selection choices a real investor or broker might make.
Permalink to this answer → Last updated August 6, 2026