Strategies
Cross-Asset Relative-Momentum Rotation Across SPY/TLT/GLD (USEQ, Daily Bars, Monthly Rebalance, Hold the Single Strongest 6-Month Performer, 2-Parameter)
Outcome: Abandoned
CrossAssetRelativeMomentumRotationSpyTltGld
Outcome Summary
This strategy faithfully implemented a Faber/Antonacci-style cross-asset relative-momentum rotation, deliberately using only two parameters and decades of split-adjusted USEQ history to resist overfitting. Its trades cleared fees comfortably (avg_trade_return_pct 1.67%), but the edge was thin and noisy: the base backtest showed negative alpha versus an equal-weight basket, and after 3-phase optimization the walk-forward flagged is_overfitted=TRUE, PBO exceeded 0.5, and the deflated Sharpe fell to 0.0 — the selected Sharpe was indistinguishable from best-of-N noise. With no robust parameter region (lookback_days flagged a cliff), an underpowered out-of-sample vault, and a near-identical QQQ/GLD/TLT sibling already dead, the analyst abandoned it as a robustness/edge failure rather than a fee-fragility one. It was abandoned at the post-optimization analyzing stage after a single iteration, never reaching risk review or paper trading.
Hypothesis
Implementation
Long-only cross-asset relative-momentum rotation on three uncorrelated USEQ ETFs (SPY equity beta, TLT long-duration Treasuries, GLD gold) using 1-DAY session bars. On the first session of each calendar month the three are ranked by trailing 6-month (126-session) total return and 97% of equity is placed in the single highest-ranked asset, held untouched until the next month-start. Turnover is a few round trips a year, so USEQ's ~0.02-0.05% spread+impact round trip is negligible against multi-percent monthly holding returns. Two edge parameters only (lookback_days, top_n). Never shorts; during equity drawdowns the ranking naturally parks the book in Treasuries or gold.
Verification Results
No change required. Optionally rename to avoid the lint warning, but the override is deliberate and correctly used.
min_bars_required(self) shadows the base framework method. Static analysis flagged this, but it is a FALSE-POSITIVE concern here: the base template's _maybe_process_primary() explicitly calls self.min_bars_required() (base_template.py line ~479), so the override IS honored as the warmup gate. Additionally calculate_signal has its own guard (_trailing_returns returns None until lookback_days+1 aligned rows exist), so signals cannot be computed on insufficient history regardless. No functional defect.
Low-turnover rotation: the sandbox produced only 17 trades over ~1650 days because the strategy trades only when the leader changes (same-leader and <$250-delta rebalances are skipped by design). Over full USEQ history the tradeable window is bounded by GLD (data from ~2004) and TLT (~2002), so the honest sample is ~21 years of monthly rebalance opportunities with likely ~40-90 actual round trips — measurable for a rotation book, but on the thinner side; the analyst should confirm the full-history trade count supports a robust walk-forward. Mechanism is the well-documented Faber/Antonacci cross-asset relative-strength effect, not a re-parameterization of a dead crypto/USEQ family. Economics are healthy (zero USEQ commissions, avg_trade_return_pct 3.56%, negligible impact vs multi-percent monthly holds).
Backtest Review
- Sharpe
- 0.24
- Total return
- 137.16%
- Max drawdown
- 39.65%
- Trades
- 77
- Win rate
- 48.1%
- Profit factor
- 1.60
Trades implement the stated mechanism: 77 long-only round trips, 0 shorts, monthly cadence, rotating into the strongest of SPY/TLT/GLD. The pattern matches the Faber/Antonacci cross-asset relative-strength hypothesis.
Adequate, reliable sample for a low-turnover rotation book: 77 trades over ~21 years of tradeable history (bounded by GLD from 2004), metrics_reliable=true. Sufficient for a walk-forward.
Clears costs with large margin: avg_trade_return_pct 1.32% >> USEQ ~0.05% floor; total_impact only $3.5k, commission 0. This is NOT a fee-edge case.
Positive gross edge (PF 1.60, total_return +137%, recovery_factor 3.85) and a deliberately tiny 2-parameter search space (lookback_days, top_n) that resists overfitting — decades of split-adjusted USEQ history give an honest OOS runway.
Legitimate macro-rotation family, explicitly distinct from the dead single-name momentum clones (L90/L82) and the USEQ classical-anomaly dead list (L74/L75).
NEGATIVE alpha (-0.68%) and NEGATIVE information ratio (-0.284) vs the equal-weight SPY/TLT/GLD basket (benchmark_meaningful=true): the momentum SELECTION underperformed naively holding all three equally on a risk-adjusted basis. This is the key thing optimization must beat — if no lookback/top_n setting produces positive alpha over equal-weight, the selection signal adds no value.
Sharpe 0.241 with CI [-0.097, 0.592] straddling zero, CAGR only 4.16% over ~21 years — a thin, noisy edge; the base backtest is close to the ceiling.
Max drawdown 39.6% (CI up to 72%) and losing years of -30% (2022 rate shock), -18.8% (2020), -18% (2012) contradict the thesis that the rotation sits defensively during equity drawdowns — 100% single-asset concentration whipsawed rather than protected.
Analysis
Mechanism is faithfully implemented: 85 long-only round trips, 0 shorts, monthly cadence, rotating into the strongest of SPY/TLT/GLD; trades match the Faber/Antonacci cross-asset relative-strength hypothesis.
avg_trade_return_pct 1.67% clears the USEQ fee floor (~0.05%) with wide margin, so this is NOT a cost-fragility death — the failure is edge robustness, not fees.
Deliberately tiny 2-parameter search space and decades of split-adjusted daily history give an honest OOS runway; profit_factor 1.81 and win_rate 0.494 are respectable at the headline level.
Holdout is technically positive (Sharpe 0.036 on 22 trades) and consistent_with_oos=true — no catastrophic forward collapse.
Two UNWAIVABLE hard gates fail: walk-forward is_overfitted=TRUE (avg IS Sharpe 1.159 -> avg OOS 0.180, windows 0.0 / +0.75 / -0.21) and PBO 0.5472 > 0.5 — the parameter selection is more likely than not overfitting.
Robustness confirms the selected Sharpe is best-of-N noise: deflated_sharpe 0.0 << 0.95, is_significant=false, Sharpe CI [-0.016, 0.654] straddles zero, expected-max-Sharpe 2.75 over 225 trials dwarfs the realized 0.318, and it does NOT survive programme-level FDR (keeps 4 of 249, candidate_p 1.0).
Optimized OOS Sharpe 0.180 is far below any promotion bar (and below the 0.3 abandon threshold); overall Sharpe 0.318, Sortino 0.35, max_drawdown 28% (rate_shock_2022 -27.7% / 28% DD), recovery weak.
lookback_days is flagged a CLIFF parameter (sensitivity swings 0.31 <-> 0.49 with no stable plateau) and the whole sweep tops out ~0.49 Sharpe — there is no robust parameter region to tune toward.
oos_vault flagged UNDERPOWERED (~21 expected trades vs 100 needed): the mechanism is structurally too slow to validate on available history, so a 2nd optimization pass would only curve-fit noise.
Sibling in the outcome store (QQQ/GLD/TLT dual-momentum defensive rotation, similarity 0.83) already died risk_reject at 44% DD — this cross-asset ETF rotation family is not producing deployable edge.
Benjamini-Hochberg at q=0.10 over 249 programme candidates keeps 4. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Outcome Summary
A monthly single-asset rotation is structurally too slow to validate (~21 expected vault trades vs the 100 needed), so on the SPY/TLT/GLD universe the momentum selection adds no robust edge over simply equal-weighting the three assets.
The analyst abandoned it after optimization: two unwaivable hard gates failed (walk-forward is_overfitted=TRUE with IS Sharpe 1.159 collapsing to OOS 0.180, and PBO 0.5472 > 0.5), while deflated Sharpe was 0.0 against an expected-max of 2.75 over 225 trials, is_significant=false, and it did not survive programme-level FDR.
A long-only, 2-parameter monthly cross-asset relative-momentum rotation on USEQ that ranks SPY, TLT, and GLD by trailing 6-month return and holds 100% of equity in the single strongest performer.
The base backtest returned +137% (CAGR 4.16%) over ~21 tradeable years across 77 trades but with a thin Sharpe of 0.24 (CI [-0.10, 0.59]), 39.6% max drawdown, and negative alpha (-0.68%) / information ratio (-0.284) versus an equal-weight SPY/TLT/GLD basket. Optimization lifted it to Sharpe 0.318 (return +234%, PF 1.81, DD 28%) but walk-forward OOS Sharpe was only 0.18.
Backtest and paper results are hypothetical. Trading involves risk of loss.