The Strategy Catalog
Twenty-nine named strategies in seven tiers, three of them controls that exist to keep the rest honest — and behind them about six engines, because most of the catalog is the same skeleton with a different config.
The posture
Stocks and stock ETFs only. No bonds and no bond ETFs; BIL is the cash proxy and never a rate view, so sixty-forty-ish proxies its bond sleeve with parked cash. Decisions are made every hour; holding horizons run from a day upward. Version 1 does not day trade — the pattern-day-trader rule at a $10k live cap, the 402 on intraday bars, and commission drag on small round trips decide that together — so the day-trading tier stays on the page with its designs intact and returns only as paper if the intraday probe ever lands.
And the earnings posture, Allan's own: no strategy initiates a position inside a name's pre-print window. The single exception, earnings-expectation-gap, is shadow-gated on a probability signal that must prove calibration before the strategy is allowed to exist.
Tier 0 — the controls
The tournament means nothing without baselines. These three run forever and are never promoted or retired.
spy-hold— buy SPY at account open, hold, reinvest. The question is "can computer trading beat the S&P 500?" and this account is the S&P 500. Its config is{ "symbol": "SPY", "targetWeight": 1.0 }and nothing else; a control with a tunable is not a control.coin-flip— a seeded RNG picks from a universe on a fixed cadence. Any strategy that cannot beat a coin over a real sample is noise dressed as intelligence. The seed is in the config because the manifest reproduces the run only if it is fixed.sixty-forty-ish— SPY and BIL, rebalanced quarterly. What "doing nothing clever" earns.
Two of the three have already run. Gate 2 is spy-hold matching SPY total return over 8,455 days; coin-flip returned a CAGR of 8.77 %, losing about two points to SPY with 2,014 % annual turnover — a control behaving like one.
The grid
| Tier | Strategy codes | Ships |
|---|---|---|
| 0 Controls | spy-hold · coin-flip · sixty-forty-ish | Day 1 |
| 1 GMI backbone | gmi-mechanical · sector-rotation · stress-responsive · news-tactical · claude-research | Launch |
| 2 Macro and factor | regime-allocator · housing-cycle · momentum-12-1 · fed-path · style-rotation · dollar-mag7 · conviction | First wave |
| 3 Event and swing | post-earnings-drift · upgrade-cluster · insider-cluster · macro-event-reaction · earnings-expectation-gap | Second wave; the last shadow-gated |
| 4 Day trading | gap-and-go / gap-fade · opening-range-breakout · futures-bias-open · mag7-spy-convergence | Deferred — not in v1 |
| 5 Long horizon | compounder-hold · dip-buyer · liquidity-tide | Early; liquidity gated on its signal |
| 6 Ensemble | committee · prob-weighted · challenger-fleet | After the field has a record |
Catalog discipline: a strategy enters as a sketch, gets a config schema and a walk-forward backtest before any paper account, and its record is permanent. A retired strategy keeps its row and its reason, so a failed idea stays failed instead of coming back with a new name.
Six engines, twenty-nine configs
"Config, not code" works because a small set of engines executes an unlimited set of strategy rows. Read the catalog with that eye and most entries collapse into a handful of shapes. The EngineTypes table names them, and the daemon asserts the rows at startup:
| Engine | What it does | Strategies |
|---|---|---|
rotation | Graded-universe weight allocation | gmi-mechanical, sector-rotation, regime-allocator, momentum-12-1, style-rotation |
threshold-rules | Config predicates over named signals → target weights | housing-cycle, dollar-mag7, fed-path, dip-buyer |
overlay | Scales a host account's gross exposure | stress-responsive |
event-tactical | Event-driven capped entries with mandatory exits | news-tactical, the Tier 3 swing strategies |
research-thesis | Thesis-driven capped entries with corroboration gates | claude-research, conviction, compounder-hold |
control | The Tier 0 baselines | spy-hold, coin-flip, sixty-forty-ish |
dollar-mag7, the first real strategy built, is a threshold rule over one FRED series: the 63-day change in DTWEXBGS above +3 % is a strong-dollar regime, and the strategy tilts 30 % of a seven-name Mag 7 basket toward a domestic hedge of IWM and XLU. The regime-conditioned rotation family is a map from regime code to ETF weights with two rules baked in — act on detectedUtc, never effectiveDate, because the latter is lookahead; and never on USREC, which is declared retroactively.
One inconsistency to resolve before that family is coded: the sketch as written names IEF and TLT in its Slowdown and Contraction rows, and the coin-flip config's universe includes TLT and GLD. The posture forbids bond ETFs. The sketch is wrong, not the posture.
Twenty transitions in thirty-three years
The regime strategies carry a sample-size warning that the leaderboard will not show. Thirty-three years of daily bars is 8,456 observations for a price strategy. For a strategy keyed on regime changes it is roughly twenty transitions — twenty events, some of them a week apart, spread across four or five distinct macro environments. A rotation strategy that looks brilliant across twenty transitions has been fitted to twenty data points, and the transition-window analysis in the tear sheet exists partly to say so.
This is why the controls run forever and why coin-flip is on the leaderboard: a live demonstration of what a small sample can make a coin look like.
How far back each family can honestly go
| Strategy family | Backtest horizon | Bounded by |
|---|---|---|
| Price-only (spy-hold, momentum-12-1, dip-buyer) | 1993 → | SPY's first bar |
| Multi-ETF (sector-rotation, regime rotation) | ~1999 → | The sector SPDRs' own history |
| Macro and forex (dollar-mag7, fed-path, housing-cycle) | ~1999 → | EURUSD's first day; FRED vintages via GMI |
| GMI-dependent (gmi-mechanical, stress-responsive) | today → | A one-week lived ribbon; reconstructed history stamped as such |
| News (news-tactical) | one year, growing | The archiver started 2026-09-01 |

The dollar-mag7 number is confident garbage, and its own stamps say so: the seven names were chosen knowing they survived, and the macro input was absent for most of the run.
- One method:
Decide(MarketState) → TargetWeights, synchronous and pure - Weights, not orders — sizing and execution are downstream
- A config envelope with a no-trade band and a turnover cap
- A paper account, a leaderboard row, and SPY to beat
- The stress-gauge override always wins