Why every strategy has to beat a coin toss
Run the same sizing, stops and fees with seeded random entries across many seeds and you get a distribution of luck. A strategy is interesting only if it clearly sits outside it.
"It made money in the backtest" is a weak sentence. A lot of random things make money in a backtest, because markets move and costs are small compared with a lucky run. The question is whether the strategy did better than chance would, using exactly the same machinery.
The control group#
Take the strategy under test. Keep everything except its signal: the same sizing, the same stops, the same fees, the same number of entries. Replace the signal with a coin toss, seeded so it is reproducible. Run that hundreds of times, with different seeds.
You now have a distribution of what luck does under your own rules. Your strategy is one more point. Where does it sit?
import random
def percentile_vs_luck(strategy_result, run, n_bars, n_entries, seeds=range(500)):
luck = []
for seed in seeds:
rng = random.Random(seed)
entries = sorted(rng.sample(range(n_bars), n_entries))
sides = [rng.choice(("buy", "sell")) for _ in entries]
luck.append(run(entries, sides)) # same sizing, stops and fees as the real strategy
beaten = sum(r < strategy_result for r in luck)
return beaten / len(luck) # 0.5 is a coin toss; you want to be far above itA strategy that lands in the middle of that cloud has no edge. Beating zero is not enough, because most coin tosses beat zero about half the time.
Why this catches things nothing else does#
- It exposes bias in the machinery. If random entries come out consistently positive, your fills or fees are too kind, and every result is inflated.
- It exposes bad luck dressed as skill. A good run can sit comfortably inside the random cloud.
- It is a sanity floor for tuning. Trying many variants of a strategy and keeping the best one finds the luckiest variant, not the best. The walk-forward post goes into how to account for that.
In the live system, too#
A good setup keeps a coin toss variant running next to the real ones on a demo account, with identical sizing and stops. It costs almost nothing, and it is the only honest answer to "is any of this skill?".
This is how trading software can be built. It is not investment advice. Trading crypto assets, especially with leverage, carries a risk of losing money, and results from tests or simulations do not guarantee anything in live markets. The studio builds trading software and tooling. It does not manage anyone's money, hold client funds or trade on anyone's behalf.
The best of a hundred coin flips looks like talent
Try enough strategies and one of them will look brilliant, even when every one is a coin toss. The number of tries is part of the result, and it is the part nobody prints.
Slippage is a fee nobody prints
The exchange prints its fee. It does not print the spread, the thin book or the stop that fills worse than its trigger. A test that leaves them out is flattering itself.
Start from the task, not the strategy
A trading bot project begins with what the bot is for, what it may lose and what it must never do. The signal comes last, and it is the smallest part of the work.