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 for that fund in that month:
cost = the higher of (the fund's own cost, the era minimum) x a market-stress multiplier
1. The fund's own cost. Every US ETF publishes its 30-day median bid/ask spread. Each fund is charged its full spread on every buy and every sell. A patient limit order at the midpoint would pay only half of it, but real trades placed at the open or the close, or as market orders, often pay more, and the median sits below the average because bad days skew it. Charging the full spread covers that, and commissions with it. Some typical figures:
| Fund type | Example | One-way cost |
|---|---|---|
| Large, liquid ETFs (stocks, Treasuries, gold) | VOO, QQQ, IEF, TLT, BIL | about 1 bp (0.01%) |
| Liquid leveraged ETFs | SSO, QLD, UPRO, TQQQ | 1 to 2 bps |
| Smaller or specialist funds | CAOS, DBMF, CLSE, TMF | 4 to 6 bps |
| Thinly traded funds | 20 bps or more |
Leverage is not what drives trading cost; liquidity is. TQQQ trades on a one-cent spread most days, while a thinly traded fund can cost twenty times that. A fund with no figure on file is charged 10 bps.
2. The era minimum. Today's penny-wide spreads did not exist in the past, so every trade pays at least the minimum for its time:
| Period | Minimum, one way | Why |
|---|---|---|
| Before May 1975 | 50 bps | Fixed brokerage commissions |
| May 1975 to 1992 | 25 bps | No ETFs yet; these years use index data |
| 1993 to mid-1997 | 15 bps | First ETFs, prices quoted in eighths of a dollar |
| Mid-1997 to 2000 | 8 bps | Sixteenths, early online brokers |
| 2001 to 2007 | 3 bps | Decimal pricing, $8 to $10 commissions |
| 2008 onward | 2 bps | Modern spreads |
These minimums are estimates built from those market milestones, not measured figures.
3. The market-stress multiplier. Spreads widen when the whole market panics, and tactical strategies tend to trade most at exactly those times. Each month's cost is multiplied by the VIX at the close of the prior month divided by 20, never less than 1x and capped at 4x. Normal markets (VIX 12 to 20) pay 1x; late 2008 and March 2020 paid about 3x. Before 1990, when there is no VIX, a stand-in built from the stock market's own recent volatility is used, so 1974 and 1987 are charged for their crashes too. The multiplier applies on top of the era minimum.
Two examples:
- Selling VOO in June 2017: VOO's spread is about 1 bp, below the 2 bp minimum, so 2 bps. VIX was about 10, so 1x. Cost: 2 bps.
- Selling VOO in October 2008: still 2 bps, but VIX was about 40 to 60 that autumn, so 2x to 3x. Cost: 4 to 6 bps.
So a month that rotates 50% of a modern portfolio out of one large ETF and into another costs roughly 0.02% (2 bps on the 50% sold + 2 bps on the 50% bought) in calm markets.
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
- Spreads are a recent snapshot applied to the fund's whole history. A fund that was thinly traded in its early years and liquid today is charged today's cost, subject to the era minimum. The fund figures are refreshed from time to time.
- Some funds do not publish their spread on their own pages. For those the figure is estimated from the share price and how heavily the fund trades.
- Order size is not modeled. The figures suit an individual account; a very large order in a thin fund would cost more.
- 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.
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.