Evidence explorer
How do simple rules really do?
Every strategy template and a handful of combined-condition rules, backtested across fixed US, UK and EU universes with the same costs, from every starting year the price history allows and not from one. A designed experiment, not a pile of whatever people happened to run: every run is shown, including the ones that were refused and the ones whose rule never fired, and the counts are made only on windows that share no days.
Run on 8 Oct 2026 · total return (dividends reinvested) · methodology · technical details
What was counted
Of 9,560 runs, 4,273 are counted here: base rules that ran and fired, on windows of one length that share no days with each other. 800 of 4,273 returned more a year than buying the same symbols and holding them, and 3,469 of 4,273 had a smaller max drawdown. Left out of every count: 4,171 runs on windows that overlap a counted one, 1,084 runs of neighbouring settings and 32 refused.
Counted another way, as universes in periods: in 67 of 406 universe and period pairs the median rule counted there beat holding. Rules of one family on one universe are close relatives, and this count treats them as one. The cells are not independent of each other: the Analyze view and the methodology say what the counts are and are not.
Explore the runs
9,560 runs in this generation; 32 refused
Refused and never-fired runs matching these filters
Methodology
A designed grid, not a sample of user runs
Every run is a house backtest from a grid we fixed in advance: 17 rules taken from the 27 community templates and 5 rules that combine conditions, crossed with 43 fixed universes and windows of 5, 10, 15, 20 years. The latest windows end on 25 Sep 2026; the five and ten year windows are also run from earlier starting years (see Start dates below). Each template also runs on its own symbols (12 more universes), so every template has a house backtest of exactly its prompt. The generation shown has 9,560 runs, and they are all shown: nothing is dropped for looking bad, and runs that were refused or whose rule never fired stay in the corpus with the reason. Nobody chose which runs to keep, so a good-looking family can't be an artefact of which backtests people happened to save.
Timing rules that trade one instrument run on the single-instrument universes; ranking rules need a basket with more names than they hold; combined-condition rules run on both (each symbol is timed on its own prices and the symbols that are in share the portfolio equally). Other pairings are not in the grid.
Start dates: the same rule from many starting years
A result that ends on one date says how a rule did from one start. So the five-year windows start every year from 2001 to 2021 (21 windows) and the ten-year windows every second year from 2002 to 2016 (8 windows), each starting on the same day of the year. Neighbouring windows share four fifths of their days whatever the length: closer starts would add runs that are nearly copies of each other. The 15 and 20 year windows are not moved, because the price history places only one of each.
A window is only in the grid for a universe whose prices start early enough to give the rule's indicators the history the engine asks for before the first tested day: 420 calendar days for most rules, and more for the two rules that use MACD or a 50-day exponential average, which are computed from every earlier close and need longer to settle. Gold, whose fund started in 2004, has five-year windows from 2006. Before each run the generator counts the real daily bars in the price table and refuses the run if there are fewer than the rule asks for.
Windows of one length that share no days with each other are the ones every count on this page is made on: five-year windows ending in 2006, 2011, 2016, 2021 and 2026, and ten-year windows ending in 2016 and 2026. A rule on a universe has at most 5 of the first and 2 of the second. The windows in between overlap them; they show how much the starting year moved a result, and are never added to a count.
How the universes were chosen
The universes added since the first grid were each chosen by a rule stated in advance, from the symbols we hold daily prices for:
- Developed markets outside the US (EFA); Emerging markets (EEM); Long US Treasuries (TLT); US property (VNQ). The asset-class funds the community templates use that the first grid did not test on their own: developed markets outside the US, emerging markets, long US Treasuries and US property. The cash-like fund (BIL) and the total-market fund (VTI, close to SPY) are left out.
- 10 more FTSE 100 shares. The ten FTSE 100 shares quoted in pounds with daily prices from January 2000 that had the highest traded value (the median of close x volume over the 252 daily bars to 25 September 2026), after the ten already in the first basket.
- 10 more Euro Stoxx 50 shares. The ten Euro Stoxx 50 shares quoted in euros with daily prices from January 2000 that had the highest traded value (the median of close x volume over the 252 daily bars to 25 September 2026), after the ten already in the first basket.
- Technology sector (XLK); Financials sector (XLF); Energy sector (XLE); Health care sector (XLV); Industrials sector (XLI); Consumer discretionary sector (XLY); Consumer staples sector (XLP); Utilities sector (XLU); Materials sector (XLB). Each of the nine sector funds in the sector basket, on its own.
- FTSE 250 (MIDD.L); UK government bonds (IGLT.L). The London-listed funds we hold daily prices for, quoted in pounds with prices from January 2009 or earlier, that track UK mid-sized companies and UK government bonds, beside the FTSE 100 fund.
- NVIDIA (NVDA); Apple (AAPL); Microsoft (MSFT); Amazon (AMZN); Alphabet (GOOGL). One of the five members of the 10 US mega caps basket with the highest traded value (the median of close x volume over the 252 daily bars to 25 September 2026).
- AstraZeneca (AZN.L); Shell (SHEL.L); HSBC (HSBA.L); BP (BP.L); Unilever (ULVR.L). One of the five members of the 10 FTSE 100 shares basket with the highest traded value (the median of close x volume over the 252 daily bars to 25 September 2026).
- ASML (ASML.AS); SAP (SAP.DE); TotalEnergies (TTE.PA); Siemens (SIE.DE); LVMH (MC.PA). One of the five members of the 10 Euro Stoxx 50 shares basket with the highest traded value (the median of close x volume over the 252 daily bars to 25 September 2026).
The asset-class funds and the two baskets of ten more shares get every window. The sector funds, the two UK funds and the single shares get only the windows that share no days: their job is to show whether a result holds on other instruments, and those windows are the ones a count is made on.
Neighbouring settings
Each rule that times one instrument and each combined-condition rule also runs with two neighbouring settings, one either side of its own, fixed in the grid in advance: Golden cross (50/200-day SMA) (40 and 160 days instead of 50 and 200; 60 and 240 days instead of 50 and 200). Close above its 210-day SMA (a 170-day average instead of 210; a 250-day average instead of 210). 20/100-day SMA crossover (16 and 80 days instead of 20 and 100; 24 and 120 days instead of 20 and 100). RSI(14) dip: buy below 30, sell above 50 (buying below 25 instead of 30; buying below 35 instead of 30). 20-day breakout (a 16-day channel instead of 20; a 24-day channel instead of 20). 55-day breakout (a 44-day channel instead of 55; a 66-day channel instead of 55). Golden cross, only buying while RSI(14) < 70 (an RSI ceiling of 60 instead of 70; an RSI ceiling of 80 instead of 70). RSI(2) dips above the 200-day SMA (buying when RSI(2) is below 5 instead of 10; buying when RSI(2) is below 15 instead of 10). MACD cross while above the 200-day SMA (a 160-day average instead of 200; a 240-day average instead of 200). 20-day breakout above the 50-day EMA, 8% trailing stop (a 6% trailing stop instead of 8%; a 10% trailing stop instead of 8%). Above the 100-day SMA with a positive 3-month return (a 80-day average instead of 100; a 120-day average instead of 100). They show how much a result moves when the setting moves. Nothing is searched for a best setting, and a neighbouring setting is never in a count of rules that beat holding: it would be the same rule counted three times. The ranking rules have none, because the grid already holds their neighbours (6 and 12 month look-backs; the top 1, 3 and 5).
How the counts are made
- Every count is on block windows: windows of one length that share no days with each other. A rule on a universe has at most five five-year blocks and two ten-year blocks.
- Only rules that ran, fired and have a buy-and-hold benchmark on the same window are counted. Refused runs, rules that never fired and the neighbouring settings are left out, and each is counted beside the figure.
- Cells in the same period share the same market, rules of one family are close relatives, and shares in one market move together. The cells are not independent of each other, so a count here is a tally of what happened in this grid.
- The rolled windows overlap by four fifths. They show how much the starting year moved a result and are not added to any count.
- The share universes are today's lists: companies that shrank, were taken over or failed are not in them, which flatters every rule on them and buy-and-hold alike.
- These are hypothetical backtests on past prices. Past results say little about any single later year.
Every run is checked before it is shown
When a generation has run, every stored run is read back and checked against itself: its CAGR against its own curve, its max drawdown against the fall visible in that curve, its excess return against the two CAGRs, the tested dates against the window it was asked for, and that its indicators had the history they ask for. A generation is shown only if every run passes; one that does not is kept aside with the failing runs and reasons, and this page goes on showing the last generation that passed. For this generation 9,560 runs were checked and 0 failed.
The same costs for every run
Every trade pays 1.0 basis point of slippage plus 0.5 basis points of commission on its value, on both buys and sells: the engine's defaults, the same the Strategy Agent's runs use.
Returns are total return: each dividend is credited on its ex-dividend date to the shares held at the previous close, after withholding tax, and reinvested at that day's close (through the rebalance on a rebalance day, otherwise in the paying holding). Cash receives no dividends. The buy-and-hold benchmarks are total return too.
Stamp duty is deducted on purchases, never on sales: 0.5% on UK-incorporated shares (UK stamp duty reserve tax) and 1% on Irish-incorporated ones. ETFs pay none, and London lines of companies incorporated elsewhere are treated as paying none.
Dividend withholding is a UK-resident investor's default, deducted at source: UK shares 0%, US 15% (with a W-8BEN), and each European country's own rate before any treaty reclaim (Germany 26.375%, France 25%, Italy 26%, Spain 19%, Switzerland 35%, Netherlands 15%). Rates that depend on paperwork are flagged on the Strategy Agent's result card.
A trailing stop is measured from the highest close since the purchase, checked on each day's closing price, and sells at that close: a fall through the stop inside a day is not seen until the close.
Money not invested earns the risk-free rate the engine is configured with (2.0% a year for this generation); Sharpe and Sortino are measured above it. No currency conversion: UK runs are in pounds and EU runs in euros, each against its own buy-and-hold.
Exactly what the Strategy Agent would run
Each run is the payload the Strategy Agent builds for its prompt: the prompt goes through the agent's own parser and payload builder, and a test checks the corpus payloads against the agent's for every rule. Only the dates differ: the corpus uses fixed windows so runs can be reproduced, where the agent's window ends today. The agent runs up to 20 years; the prompts stored with the 15 and 20 year runs ask for 10, the agent's limit when the grid was designed, and those runs call the engine with the same payload over their full window. When the agent's parser doesn't read a grid prompt as the rule it stands for, the run is refused with its reading rather than run as something else. Generations made before 2026-09-28 refused the momentum rankings on sector ETFs this way (the agent read them as sector rotation); the parser now reads them as written.
The benchmark for every run is the same symbols bought in equal weights on the first day and held (no rebalancing, so the weights drift), over the same window with the same costs. Runs made before 2026-09-28 rebalanced that basket monthly instead; each run's detail says which. Excess return is the run's CAGR minus that benchmark's.
What turnover means here
Turnover is the engine's own figure, in one of two units, and each run says which. Rules that time a single instrument report entries a year: how many times the rule entered a position. Every other rule reports a share of the portfolio traded per year. The two are never drawn on one axis: the explorer has a separate axis for each.
What the share is measured against depends on the engine version that made the generation, and a run's record does not store it. Engine builds from October 2026 report one-way turnover: the lesser of what was bought and what was sold, each trade divided by the portfolio's value that day, per year, so a rule that buys once and holds reads 0%. Earlier builds reported the value bought divided by the starting equity, per year, which counts the first purchase and overstates a portfolio that has grown. This generation was made on 8 Oct 2026; its engine build is under Technical details below. Read the turnover figures as "turnover as that engine reported it", and compare them only within one generation.
No look-ahead
Signals read closing prices up to the previous trading day and trades fill at the next close. The one exception is a trailing stop, which one rule has: how it is checked and filled is stated with the costs above. Price history before the window start is loaded only to warm up indicators (a 200-day average is defined on the first tested day); warm-up days never enter the returns. A window starts on the first trading day on or after its start date, and a run is refused if any of its symbols has no daily prices that early.
Survivorship
The stock baskets (10 US mega caps, 10 FTSE 100 shares, 10 Euro Stoxx 50 shares, 10 more FTSE 100 shares, 10 more Euro Stoxx 50 shares, NVIDIA (NVDA), Apple (AAPL), Microsoft (MSFT), Amazon (AMZN), Alphabet (GOOGL), AstraZeneca (AZN.L), Shell (SHEL.L), HSBC (HSBA.L), BP (BP.L), Unilever (ULVR.L), ASML (ASML.AS), SAP (SAP.DE), TotalEnergies (TTE.PA), Siemens (SIE.DE), LVMH (MC.PA), and the templates' stock lists) are today's large companies. A backtest over past years only includes companies that survived and grew into those lists, which flatters every rule on them and buy-and-hold alike. The index ETFs (SPY, QQQ, IWM, ISF.L, EXW1.DE, the sector ETFs) don't have this selection problem. The nine sector ETFs leave out real estate and communications, which only started in 2015 and 2018.
Versions are never mixed
Every run is keyed on its exact payload, the engine version, the cost model and a hash of the prices it read. The engine version includes a behaviour fingerprint from three fixed canary backtests, so any change to the engine's maths or costs gives new runs, and a page shows one generation at a time.
Technical details
- Engine build
- 0.1.0 (behaviour f6cdd0b5)
- Cost model
- engine-total-return-uk-investor-v1-2026-09-28
- Grid
- grid-v2
- Price table
- market_prices
These name the exact code and settings behind the runs. Each run's own detail (Reproduce this run) carries its fingerprint and the request the engine was given.
What the families are
- Trend (moving averages): Golden cross (50/200-day SMA); Close above its 210-day SMA; 20/100-day SMA crossover; 40/160-day SMA crossover; 60/240-day SMA crossover; Close above its 170-day SMA; Close above its 250-day SMA; 16/80-day SMA crossover; 24/120-day SMA crossover.
- Mean reversion (RSI): RSI(14) dip: buy below 30, sell above 50; RSI(14) dip: buy below 25, sell above 50; RSI(14) dip: buy below 35, sell above 50.
- Breakout (Donchian): 20-day breakout; 55-day breakout; 16-day breakout; 24-day breakout; 44-day breakout; 66-day breakout.
- Momentum ranking: Momentum: top 3 by 12-month return; Momentum: top 3 by 6-month return; Momentum: top 5 by 12-month return; Momentum: hold the 12-month leader; Momentum: hold the 6-month leader.
- Rotation: Rotation: top 3 by momentum and low volatility; Rotation: top 2 by momentum and low volatility.
- Low volatility: Low volatility: the 3 calmest; Low volatility: the 4 calmest.
- Risk parity: Risk parity (inverse volatility); Hierarchical risk parity.
- Combined conditions: Golden cross, only buying while RSI(14) < 70; RSI(2) dips above the 200-day SMA; MACD cross while above the 200-day SMA; 20-day breakout above the 50-day EMA, 8% trailing stop; Above the 100-day SMA with a positive 3-month return; Golden cross, only buying while RSI(14) < 60; Golden cross, only buying while RSI(14) < 80; RSI(2) below 5 above the 200-day SMA; RSI(2) below 15 above the 200-day SMA; MACD cross while above the 160-day SMA; MACD cross while above the 240-day SMA; 20-day breakout above the 50-day EMA, 6% trailing stop; 20-day breakout above the 50-day EMA, 10% trailing stop; Above the 80-day SMA with a positive 3-month return; Above the 120-day SMA with a positive 3-month return.
These are hypothetical backtests of rules on past prices. They are not recommendations, and past results say little about any single future year.