A rules-based strategy, and the framework built to disprove it.
Most backtests are built to make an idea look good. This one is built to catch me out.
The problem with backtests
A backtest run on the same history you used to choose your settings will almost always look excellent. That is not evidence — it is the definition of fitting the past.
So the framework treats every flattering result as suspect until it survives tests designed to break it.
Every result is scored against a fixed basket of ten index funds, chosen in advance and never reordered — picking a flattering benchmark after seeing your result is the easiest way to fool yourself.
Settings are re-chosen using only older data and then traded on stretches the strategy has never seen.
Trades are reshuffled thousands of times to separate genuine edge from the luck of the order they happened to arrive in.
Every fill pays slippage and commission, and when a stop and a target fall inside the same bar the stop is assumed to hit first, because price data cannot say which came first.
Python, pandas and yfinance, with no paid data feeds.
Three strategy engines: a plain-English plan builder, a YAML rule engine, and a dedicated simulator for the ladder strategy itself.
288 automated checks across five test suites, including two that verify no trade can ever use information from the future.