Backtest turnover costs: 36 ETH/USDT comparisons.
In one ETH/USDT backtest, a simple drift rule returned 18.15% before costs. After modelled fees and slippage, it returned 3.54%.
Reducing trading helped against that rule. It still failed to beat a much simpler alternative: buying and holding.
Download all 36 results · CSVHistorical simulation. Costs: 10 bps fees + 5 bps slippage on each traded side. These are assumptions, not a broker bill.
The same signal, a different decision to trade
The simple rule holds ETH when its estimated 30-hour drift is positive and cash when it is negative. A hold band adds a cost threshold and a noise threshold: small changes keep the previous position instead of triggering another switch.
We tested the full band, each threshold removed separately, and both removed. Cash and buy & hold provide controls. Parameters were fixed before retrieving the data for this comparison; these past months remain exploratory evidence.
August · 744 hourly bars
| Rule | End value USDT | Net return | Max drawdown | Entries | Costs USDT |
|---|---|---|---|---|---|
| Drift rule | 103.54 | +3.54% | -13.79% | 44 | 12.67 |
| Full hold band | 110.92 | +10.92% | -5.92% | 1 | 0.32 |
| Without cost threshold | 113.85 | +13.85% | -10.27% | 5 | 1.59 |
| Without noise threshold | 115.28 | +15.28% | -11.85% | 3 | 1.04 |
| Buy & hold | 132.09 | +32.09% | -5.92% | 1 | 0.35 |
| Cash | 100.00 | +0.00% | 0.00% | 0 | 0.00 |
All values include modelled execution costs. Max drawdown is the largest peak-to-trough fall in the simulated path. Each row starts with its own 100 USDT.
The drift rule opened 44 positions and traded 8,444.33 USDT of notional. Its modelled costs were 12.67 USDT. The full hold band opened once and cost 0.32 USDT, but buy & hold ended with 132.09 USDT versus the band’s 110.92.
September · 720 hourly bars
| Rule | End value USDT | Net return | Max drawdown | Entries | Costs USDT |
|---|---|---|---|---|---|
| Drift rule | 90.99 | -9.01% | -11.61% | 38 | 10.75 |
| Full hold band | 108.52 | +8.52% | -9.10% | 1 | 0.31 |
| Without cost threshold | 92.59 | -7.41% | -13.86% | 5 | 1.41 |
| Without noise threshold | 102.83 | +2.83% | -7.49% | 3 | 0.88 |
| Buy & hold | 108.52 | +8.52% | -9.10% | 1 | 0.31 |
| Cash | 100.00 | +0.00% | 0.00% | 0 | 0.00 |
The full band and buy & hold are identical in September: both stay long for the entire month and finish at 108.52 USDT. The band’s positive return therefore does not demonstrate extra forecasting skill.
Removing the cost threshold improves August’s result by 2.93 USDT but reduces September’s by 15.94 USDT. The trade-off changes with the path: fewer trades can avoid friction and can also delay a useful switch.
Fees are not the whole difference
The drift rule’s August gross-to-net return gap is 14.61 percentage points. That is different from the 12.67 USDT sum of modelled costs. Costs change the capital available for later returns; the final equity gap is not simply the fee bill.
For each execution, the direct cost model is traded notional × (fee bps + slippage bps) / 10,000. Compounding then affects the rest of the path.
Two fixed stress checks
At 35 bps per side, the drift rule finishes with 86.83 USDT in August and 78.16 USDT in September. With an extra hour of execution delay at the original costs, the full band’s August end value falls from 110.92 to 107.62 USDT. The CSV includes every stress case; none was selected as a new default after seeing these results.
What this comparison does—and does not—show
- Data: Binance ETH/USDT spot, closed hourly bars. August and September 2026 are separate monthly runs. July history warms up signals; it does not contribute starting capital or historical profits.
- Timing: signals use a closed bar; trades occur at the next bar’s open. Remaining positions are sold at the end, with costs.
- Fixed rule: 30-hour estimation window, five-hour extrapolated drift, cost reserve 2 and noise multiplier 0.5. The fee/slippage assumptions are 10/5 bps normally and 20/15 bps under stress.
- Checks: a separate signal calculation and decimal cash/ETH ledger reproduced the 36 end values; the largest recorded difference was below 0.000000000001 USDT.
- Limits: retrospective, two-month exploration; not untouched out-of-sample evidence. Broader search history is incomplete. No significance test or deflated Sharpe conclusion is available. Candle prices and fixed slippage do not model live order-book depth or taxes.
This is a worked example of cost sensitivity and controls, not a recommendation to trade the rule or evidence of future profits.
Use the data to challenge your own result
Keep the gross result, the actual modelled cost total and the final net result separate. Compare the same starting capital, time window and execution assumptions. Include a simple market-exposure control before crediting a strategy with an edge.
The download contains aggregate simulation results, including losing variants, exposure, turnover and independently recomputed end values. Raw market bars and internal operating records are not included.
Read the CSV correctly
scenario_id:retailuses 10 bps fees + 5 bps slippage per side;harshuses 20 + 15 bps;delayuses the retail costs with an extra hour of execution delay.- Returns, drawdowns and exposure are fractions:
0.10means 10%.cost_dragis gross return minus net return, not a USDT fee total. actual_model_costs_usdtsums modelled costs on traded notional. For August's drift rule, 8,444.33 USDT × 0.0015 is about 12.67 USDT; the compounded return gap is 14.61 percentage points.entry_episodescounts new positions.rebalancescounts execution events, including the final sale:open_rebalances + terminal_liquidations. These counts are different.final_equity,pnlandindependent_final_usdtare simulated USDT values. Every row starts with its own 100 USDT; rows are not a pooled account.
Background: Binance public market-data documentation · Backtesting.py documentation on commission and spread.
Check your own candle data
Before analysing turnover and costs, check your input for duplicate timestamps, ordering problems and inconsistent OHLC prices. Our checker accepts your own JSON rows and reports findings without repairing the data.
- Use the OHLCV report API: 0.02 USDC on Base per report, up to 2,000 rows. Inspect the free synthetic example and request format before paying.
- Offline-kit sales have ended. Existing Lightning buyers can recover their order and download using their original private recovery link. Do not pay again for an already paid purchase.
These optional paid tools check internal consistency. They do not verify market accuracy, trading costs, complete exchange calendars or future returns. Free alternatives may be sufficient. This article and its 36-result CSV remain free.
Support this open research
If this worked example saved you time, you can leave a small tip. Suggested amount: 3 USDC. The article and all 36 results remain free; support does not buy a subscription, trading advice or an additional service.
Native USDC on Base only · Network ID 8453. Use an existing compatible wallet and check the network, token and recipient before sending. Your wallet may charge a network fee.
You can also select and copy the address above. This page never connects to your wallet or initiates a transaction.
Check the USDC token
Base mainnet contract: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913. Confirm it against Circle’s official contract list.