6  Strategy Catalogue

This chapter is a comprehensive, self-contained reference to every registered strategy on the platform — the downstream companion to the Factor Catalogue. Where that chapter documents factors (measured, predictive characteristics of an instrument), here we document strategies: the portfolio-construction mechanics that trade them, organised by the factor family they draw on.

Scope note — strategies, not factors. In the platform’s canonical model (see Factor & Strategy Lifecycle), a strategy is a (factor_id, mechanic, params) triple: it always names exactly one underlying factor, plus a mechanic — the reusable selection/weighting algorithm that turns the factor’s value into positions (e.g. rank the cross-section and go long/short the extremes, or just follow each instrument’s own sign) — plus the sizing/universe/rebalance parameters around it. A strategy cannot exist without a factor beneath it; the dependency runs factor → strategy, never the reverse. Strategy promotion — the passage through incubating, paper, and live — additionally requires the underlying factor’s recorded lifecycle status to already be validated.

6.1 Current run snapshot

Auto-generated snapshot from the nightly deep run of 2026-09-25, refreshed 2026-09-27. Only the content between the LEMONADE:RUN-SNAPSHOT markers is regenerated each deep run; every hand-authored section outside them is left untouched.

Two strategies were backtested in the nightly run: a benchmark momentum strategy and a classic momentum strategy, both using a 12‑month momentum factor scaled by volatility. The benchmark achieved an in‑sample Sharpe of +0.64 and a CAGR of 16.47 % but suffered a maximum drawdown of 45.88 %, and it failed the gate test. The classic momentum strategy recorded a negative Sharpe of –0.08, a CAGR of –1.99 % and a maximum drawdown of 35.39 %, also failing the gate. No other strategies were backtested in this run.

  • Benchmark momentum shows modest Sharpe but high drawdown, failing gate
  • Classic momentum underperforms with negative Sharpe and CAGR, also failing gate
Strategy Factor Mechanic Nightly Sharpe CAGR MaxDD Gate (Sharpe/MaxDD)
clinic06-benchmark momentum_12_1_vol_scaled long_only_top_n yes +0.64 16.47% -45.88% fail (1.10/-0.20)
classic-momentum momentum_12_1_vol_scaled long_short_quantiles yes -0.08 -1.99% -35.39% fail (1.10/-0.20)
classic-momentum-dollar-neutral momentum_12_1_vol_scaled dollar_neutral_rank no — — — — (1.10/-0.20)
classic-momentum-long-only momentum_12_1_vol_scaled long_only_top_n no — — — — (1.10/-0.20)
etf-sector-momentum momentum_12_1_vol_scaled long_only_top_n no — — — — (0.50/-0.30)
etf-trend tsmom_12_1_vol_scaled long_flat_trend no — — — — (0.50/-0.25)
residual-momentum residual_momentum_252d_eod long_short_quantiles no — — — — (1.10/-0.20)
sue-earnings-momentum sue long_short_quantiles no — — — — (1.10/-0.20)

Sharpe / CAGR / max drawdown are this run’s in-sample backtest metrics from each strategy’s backtest sidecar. The Gate column is a deterministic read of Sharpe clearing the configured Sharpe floor and max drawdown staying within the configured limit — the elapsed-days and consecutive-clean-run gates, and the strategy-promotion lifecycle state of record, are NOT reflected here. Mechanics, universes, and per-strategy narratives are in the hand-authored sections below.

6.2 Provenance

  • Config fields (factor_id, mechanic, params, universe, benchmark, promotion gates, enabled_in_nightly / research_day_backtest) are pulled directly from config/strategies/*.yaml as of 2026-08-05 — eight strategies, all kind: factor (every registered strategy today is factor-driven; no other strategy kind exists yet).
  • Empirical fields (backtest CAGR/Sharpe/drawdown, probability of backtest overfitting, deflated Sharpe ratio, strategy-level permutation test) have no equivalent to the Factor Catalogue’s single dated run synthesis — there is no one diagnostic run that scored all eight strategies at once. Each strategy’s numbers live in its own backtest sidecar (surfaced on the operator dashboard’s Strategies hub) and, where a strategy has a dedicated findings write-up, that document is the authoritative source; both are cited per entry below. Everywhere else, empirical fields are marked as not-yet-measured rather than guessed — see Method.
  • None of the eight are currently live-submitting paper orders. The experiment_portfolio_ids list in config/execution.yaml — the list that binds a strategy’s construction output to the paper order path — is empty. All eight are evaluated purely by nightly/research-day backtest plus promotion-gate comparison against their sharpe_min/max_drawdown_max thresholds. This is a distinct, earlier-stage track from the machine-learning signal book’s live paper execution (first live fills in July 2026) — that book trades a separate predictor ensemble, not one of these factor-strategy triples.

6.3 Method: where the backtest evidence lives

Each strategy entry below has empirical fields that are frequently not yet measured. All are sourced the same way, stated once here rather than repeated eight times:

  • Backtest run — a per-strategy engine subprocess drives the simulation (nightly for enabled_in_nightly: true strategies; research-day-only for research_day_backtest: true strategies), producing a net-asset-value series, tearsheet, and cost-drag sidecar. CAGR/Sharpe/MaxDD/cost-drag come from there, and are all in-sample backtest quantities.
  • Overfitting controls — the probability-of-backtest-overfitting estimate and the strategy-level permutation test (research-day-only, with split and permutation counts read from each strategy’s own research: block) are the anti-overfitting layer discussed in Validation and Anti-Overfitting. The same epistemic caveat as the Factor Catalogue’s t-statistic columns applies here: a clean in-sample Sharpe is necessary evidence, not sufficient.
  • The actual promotion bar is the promotion_gates block (min_elapsed_days, min_green_nightlies, sharpe_min, max_drawdown_max), evaluated against the recorded strategy state by the strategy-promotion lifecycle machinery — not any single backtest metric in isolation.
  • Where to look: the operator dashboard’s Strategies hub surfaces the current run’s tearsheet, health timeline, and (for the six cross-asset/momentum strategies below) benchmark comparison for each strategy.

6.4 1. Cross-sectional equity momentum

The platform’s primary momentum family — four strategies sharing one factor (momentum_12_1_vol_scaled, Factor Catalogue §4) and one universe (us_large_cap), each isolating a different construction choice: quantile long/short, long-only, beta-hedged dollar-neutral, or a fixed external yardstick. Jegadeesh–Titman 1993 [#49].

6.4.1 classic-momentum

  • Underlying factor: momentum_12_1_vol_scaled
  • Mechanic: long_short_quantiles — long the top decile, short the bottom decile of the cross-section, ranked monthly
  • Universe: us_large_cap — 500 names, NYSE/NASDAQ, ≥$1B market cap, ≥$5 price, ranked by 20-day dollar ADV
  • Params: 50 long / 50 short, monthly rebalance, 21-day hold, $500k capital, max_leverage: 2.2, volatility-managed to a 10% portfolio-volatility target
  • Benchmark: SPY (+ 17 more — QQQ/IWM/DIA/MTUM, VIXY/TLT/HYG, 10 sector SPDRs)
  • Lifecycle: enabled_in_nightly: true. Promotion gate: sharpe_min 1.1, max_drawdown_max -0.20, 30 elapsed days, 5 green nightlies.
  • Notes: the declared factor was corrected in June 2026 from momentum_12m_1m to momentum_12_1_vol_scaled so the configuration honestly names the column the backtest actually trades — the traded signal was unchanged, only the label. One consequence: the underlying factor’s recorded lifecycle status is still experimental (not validated), so this strategy knowingly trades a pre-validation factor for research purposes, and the operator dashboard renders that status honestly rather than a validated factor it doesn’t trade.

6.4.2 classic-momentum-long-only

  • Underlying factor: momentum_12_1_vol_scaled (same correction/caveat as above)
  • Mechanic: long_only_top_n — long the top decile, no short leg
  • Universe: us_large_cap (identical to classic-momentum)
  • Params: 50 long / 0 short, monthly rebalance, 21-day hold, $500k capital, max_leverage: 2.2, max_position_size_pct: 0.20, volatility-managed to 10%
  • Benchmark: SPY, QQQ, IWM
  • Lifecycle: enabled_in_nightly: true; seed: true marks this configuration as the auto-spawned incubating stub that appears once momentum_12_1_vol_scaled validates, though the production strategy-cascade enforcement switch itself remains off. Same promotion gate as classic-momentum.
  • Notes: the net-long baseline — deliberately the directional sibling of classic-momentum-dollar-neutral on the identical factor, so comparing the two isolates whether the edge is cross-sectional (survives beta-hedging) or merely directional (mostly market beta).

6.4.3 classic-momentum-dollar-neutral

  • Underlying factor: momentum_12_1_vol_scaled (same correction/caveat as above)
  • Mechanic: dollar_neutral_rank — long the top decile / short the bottom decile, rank-weighted to net ≈ 0 exposure
  • Universe: us_large_cap (identical to classic-momentum)
  • Params: 50 long / 50 short, monthly rebalance, 21-day hold, $500k capital, max_leverage: 2.2, volatility-managed to 10%
  • Benchmark: SPY, QQQ, IWM
  • Lifecycle: enabled_in_nightly: true. Same promotion gate as classic-momentum.
  • Notes: the market-beta-hedged sibling in the same three-way comparison — run to isolate cross-sectional alpha from directional market exposure, independent of classic-momentum-long-only’s net-long read on the same question.

6.4.4 clinic06-benchmark

  • Underlying factor: momentum_12_1_vol_scaled

  • Mechanic: long_only_top_n — long the top 20, equal-weight, no shorts

  • Universe: us_large_cap (500 names, same filters as classic-momentum)

  • Params: 20 long / 0 short, monthly rebalance, 21-day hold, $1M capital, max_leverage: 1.1, max_position_size_pct: 0.60

  • Benchmark: SPY, QQQ, IWM

  • Lifecycle: enabled_in_nightly: true, but not a promotion candidate — a fixed external yardstick, not traded.

  • Empirical. A dual-cost comparison over 2016-01-04 → 2025-12-30 (2,513 daily net-asset-value rows), recorded in an internal findings note of 2 August 2026, gives the in-sample backtest results below (each Sharpe is net of the modelled cost drag shown in the same row):

    Cost regime CAGR Sharpe MaxDD Cost drag (bps)
    Platform-default (per-name Corwin–Schultz spread) 18.04% 0.70 −43.77% 503.57
    Fixed (Clinic-faithful flat 1% spread) 16.42% 0.65 −44.07% 613.98
  • Notes: a platform-native replica of the QSResearch Clinic-06 long-only top-20 vol-scaled-momentum book — not a new alpha source. Six deliberate structural divergences from the original harness (survivorship-free universe, dollar- vs share-volume ranking, dropped magnitude threshold, platform-default vs flat-1% cost, etc.) are catalogued in the findings note; each is the measurement of a platform effect, not noise. Its purpose is separating “platform effect” from “strategy edge” for every other strategy in this catalogue, not generating a tradeable signal of its own.


6.5 2. Sector rotation

Same factor and mechanic as the us_large_cap family above, applied to a much thinner, single-asset-class cross-section — the 11 SPDR sector ETFs rather than 500 individual names.

6.5.1 etf-sector-momentum

  • Underlying factor: momentum_12_1_vol_scaled
  • Mechanic: long_only_top_n — long every ETF in the panel ranked into the top tier (long_q: 11 = the full 11-name panel), equal-weight
  • Universe: us_etf_sector_rotation — the 11 SPDR sector ETFs (XLK/XLF/XLV/XLE/XLI/ XLC/XLY/XLP/XLB/XLRE/XLU)
  • Params: 11 long / 0 short, monthly rebalance, 21-day hold, $1M capital, max_leverage: 1.1, max_position_size_pct: 0.30
  • Benchmark: SPY + the 11 sector ETFs
  • Lifecycle: enabled_in_nightly: false — backtest-only, paper-off. Requires the ETF-inclusion switch to be on so the upstream allowlist admits the sector panel. Promotion gate is looser than the equity family: sharpe_min 0.5, max_drawdown_max -0.30.
  • Notes: the exchange-traded-fund universe-extension demonstration — it shows the same cross-sectional-momentum mechanic works on a thin, single-asset-class cross-section once ETFs are admitted at all, ahead of any nightly-enablement decision.

6.6 3. Time-series momentum / Trend

The platform’s own-trend-sign complement to cross-sectional momentum: instead of ranking names against each other, each instrument is judged only against its own history — long if trending up, flat otherwise. Works on cross-asset panels too thin for a meaningful cross-sectional rank. Moskowitz–Ooi–Pedersen 2012 [#115], Hurst–Ooi–Pedersen 2017 [#95].

6.6.1 etf-trend

  • Underlying factor: tsmom_12_1_vol_scaled — funnel-exempt; this strategy’s own backtest is the factor’s only evidence (see Factor Catalogue §12)
  • Mechanic: long_flat_trend — long every ETF whose own vol-scaled 12-1 trend is positive, flat otherwise (no shorts, no cross-sectional comparison)
  • Universe: us_multi_asset_etf_trend — a ~14-name cross-asset panel, one liquid long-history instrument per asset class (SPY/QQQ/IWM equity, EFA/EEM international, TLT/IEF/LQD/HYG rates & credit, GLD gold, DBC commodities, UUP dollar, VNQ REIT, TIP inflation-linked), pinned explicitly so a venue filter can’t drift the panel
  • Params: long_q 14 (the full panel cap), monthly rebalance, 21-day hold, $1M capital, max_leverage: 2.2, volatility-managed to a 10% portfolio-volatility target
  • Benchmark: SPY, AGG
  • Lifecycle: enabled_in_nightly: false, research_day_backtest: true (opts into the research-day-only backtest fan-out so its tearsheet surfaces on the Strategies hub without going nightly). Backtest-only, paper-off. Requires the ETF-inclusion switch to be on. Promotion gate: sharpe_min 0.5, max_drawdown_max -0.25.
  • Notes: the platform’s first per-asset trend sleeve — the highest-value diversifier available to a US-equity book per Hurst–Ooi–Pedersen 2017. Per-asset inverse-volatility weighting (rather than today’s equal-weight over the trend-positive names) is a deferred follow-on.

6.7 4. Residual (market-neutral) momentum

The beta-hedged sibling of ordinary cross-sectional momentum: strips out market beta before ranking, via a rolling regression against an equal-weighted benchmark. Blitz–Huij–Martens 2011 [#50].

6.7.1 residual-momentum

  • Underlying factor: residual_momentum_252d_eod — the strongest information-ratio result in the factor-research synthesis: a gross, in-sample cross-sectional information ratio of +0.724 (horizon, universe, and sample as catalogued in the Factor Catalogue); note this is the atomic factor id, not the deprecated composite residual_momentum_252d, which the platform has no service to compute
  • Mechanic: long_short_quantiles — long top decile / short bottom decile of the 252-day residual-return z-score
  • Universe: us_large_cap
  • Params: 50 long / 50 short, monthly rebalance, 21-day hold, $1M capital
  • Benchmark: SPY
  • Lifecycle: enabled_in_nightly: false, research_day_backtest: true. Promotion gate: sharpe_min 1.1, max_drawdown_max -0.20 (same bar as the equity momentum family).
  • Notes: despite trading the run’s single strongest factor result, the strategy itself is still research-day-only, not nightly-tracked — factor-level information ratio and strategy-level backtest promotion are evaluated on separate cadences and neither implies the other has cleared its own gate.

6.8 5. Earnings momentum / PEAD

Trades the drift that follows a standardised earnings surprise — prices under-react to the news and continue drifting toward it for weeks. Bernard–Thomas 1989 [#75], Chan–Jegadeesh–Lakonishok 1996 [#79].

6.8.1 sue-earnings-momentum

  • Underlying factor: sue (Standardised Unexpected Earnings, Factor Catalogue §11)
  • Mechanic: long_short_quantiles — long top decile / short bottom decile of SUE, the standard PEAD convention
  • Universe: us_large_cap
  • Params: 50 long / 50 short, monthly rebalance, 21-day hold, $1M capital
  • Benchmark: SPY
  • Lifecycle: enabled_in_nightly: false by explicit design (config comment: “start dormant; flip once validated in a backtest”), research_day_backtest: true. Same promotion gate as residual-momentum (sharpe_min 1.1, max_drawdown_max -0.20).
  • Notes: the backtest wiring for this strategy was broken — a Friday deep-run crash — and repaired in early August 2026; the fix spanned four drift-prone layers, so a re-break here is a plausible failure mode to check first if this strategy’s research-day backtest goes red again.

6.9 Next steps

  1. Compile a per-strategy empirical table analogous to the Factor Catalogue’s diagnostic-run synthesis — today only clinic06-benchmark has a dedicated, dated findings write-up; the other seven have not-yet-measured CAGR/Sharpe/MaxDD and overfitting-audit fields above.
  2. Once residual_momentum_252d_eod and sue progress toward validated, revisit whether residual-momentum and sue-earnings-momentum should move from research_day_backtest to enabled_in_nightly.
  3. Reconcile each strategy’s recorded lifecycle state (incubating / paper / live) against this chapter — the config-level enabled_in_nightly / research_day_backtest flags shown here are readiness signals, not the lifecycle state of record.
  4. Add strategy-level permutation-test and overfitting figures once the strategy-level permutation test has run against the full eight-strategy set in one research-day pass, so results are directly comparable.