H-003: Best daily trend rule (chosen 2018-2021) beats buy-and-hold out of sample, spot
Weak Family: trend · Status: weak
Do trend-following rules beat buy-and-hold in crypto? The idea did a bit better than simply buying and holding, but not by enough to rule out luck. Treat it as unproven.
Result
significant after Bonferroni (p < 0.0167) on 0/3 assets (need 2); beats buy-and-hold on 2/3
| Asset | Period | Rule (chosen in-sample) | Sharpe | Hold Sharpe | CAGR | Hold CAGR | Max drawdown | Hold drawdown | In market | p-value | Beats hold | Counts as win |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| BTCUSDT | oos (2022-01-01 → 2026-10-13) | SMA50 | 0.77 | 0.50 | +22.2% | +13.1% | -50.6% | -66.9% | 52% | 0.150 | yes | no |
| ETHUSDT | oos (2022-01-01 → 2026-10-13) | DC20 | 0.17 | 0.22 | -1.0% | -7.8% | -52.5% | -74.0% | 37% | 0.401 | no | no |
| SOLUSDT | oos (2022-01-01 → 2026-10-13) | DC55 | 0.41 | 0.36 | +8.5% | -9.2% | -63.4% | -94.6% | 31% | 0.289 | yes | no |
Equity curves
Growth of 1 unit, log scale, fees included. Only days on which the rule is fully defined are counted.
Why it might work
Daily trend following trades a few times a month, so fees become a small fraction of the move. Eleven classic rules; selection strictly in-sample.
Verdict history
- 2026-09-23: Weak (F1MEBOT (2026))
- 2026-10-14: Weak (this engine, data to 2026-10-13)
Pre-registered specification
kind: rule_search
candidates:
SMA20:
type: price_above_sma
window: 20
SMA50:
type: price_above_sma
window: 50
SMA100:
type: price_above_sma
window: 100
SMA200:
type: price_above_sma
window: 200
SMA20/50:
type: sma_cross
fast: 20
slow: 50
SMA50/200:
type: sma_cross
fast: 50
slow: 200
TSMOM30:
type: tsmom
lookback: 30
TSMOM90:
type: tsmom
lookback: 90
TSMOM180:
type: tsmom
lookback: 180
DC20:
type: donchian
entry: 20
DC55:
type: donchian
entry: 55
mode: long_flat
fee: 0.001
universe:
- BTCUSDT
- ETHUSDT
- SOLUSDT
in_sample:
start: '2018-01-01'
end: '2021-12-31'
out_of_sample:
start: '2022-01-01'
significance:
method: bootstrap
n: 400
alpha_family: 0.05
criterion:
min_strict_wins: 2