A strategy that looks good before costs can look bad after them. The gap is usually turnover: how much of the portfolio changes at each rebalance.

How costs add up

Every trade pays something:

  • Commission: often zero now for retail, not zero for everyone.
  • Spread: the gap between the price to get in and the price to get out.
  • Slippage: the price moving while you trade, more for bigger orders.

A model that replaces half its stocks every month pays these on half the portfolio, twelve times a year.

What we charge

  • 5 basis points (0.05%) per trade, on every stock that changes.
  • Then the same test with double the cost (10 bp).

The doubled-cost test is a stress test. Our cost estimate could be optimistic, and real costs rise in stressed markets. A result that only survives at exactly 5 bp is fragile.

def net_result(gross, weights_prev, weights_new, bp=5): turnover = (weights_new - weights_prev).abs().sum() return gross - turnover * bp / 10_000 

What we saw

None of our twelve model families had a significant edge before costs, so costs didn't change the overall answer. But the doubled-cost column is the first one to check on any model page: the more often a model changes its picks, the more it loses there.

The question to ask

Whenever you see a backtest: is that before or after costs? And what turnover? If the answer isn't on the page, assume before.

Every model page on the site shows the result at 1x and 2x costs side by side.

From Quantooo Lab, the makers of quantooo.com, a free, open and educational quant lab: every formula, every test and every failure is public. See it here: https://quantooo.com/models

Educational, not investment advice.