Skip to content

View original

CrossAssetRelativeMomentumRotationSpyTltGld

Hypotheses

Cross-Asset Relative-Momentum Rotation Across SPY/TLT/GLD (USEQ, Daily Bars, Monthly Rebalance, Hold the Single Strongest 6-Month Performer, 2-Parameter)

Hypotheses

A long-only, low-turnover ROTATION strategy on three deeply liquid, structurally UNCORRELATED US ETFs on the USEQ venue: SPY (US equity beta), TLT (long-duration Treasuries), GLD (gold). Each month the strategy ranks the three by trailing 6-month total return and holds 100% of equity in the SINGLE highest-ranked asset until the next rebalance. This is NOT a symbol/venue swap of the crypto momentum winners (which the meta-learner flags as dead, L91), NOT a regime/vol gate bolted onto a directional signal (L92), and NOT one of the USEQ classical anomalies in the dead list L74 (no seasonality, no sector reversion, no dual-TF trend, no cointegration pairs, no vol-regime timing). It is also distinct from the in-pipeline SPY/TLT risk-on/off hysteresis strategy: that switches binary between two assets on a single-asset SMA trend; this RANKS three assets by their own cross-sectional momentum and always holds whichever risk-or-defensive sleeve is objectively leading. The mechanism is the well-documented cross-asset relative-strength effect (Faber/Antonacci class): the leading macro asset tends to persist over 1-3 month horizons, and because the three assets are negatively-to-uncorrelated, the rotation naturally sits in Treasuries or gold during equity drawdowns without ever shorting. Deliberately 2 parameters (lookback = 6 months, number-held = 1) to combat the #2 killer (overfit, 376 deaths) — decades of split-adjusted daily USEQ history give an enormous, honest out-of-sample runway.

Hypotheses

Implements the Faber/Antonacci cross-asset relative-strength mechanism exactly as specified: rank-by-trailing-return over 6 months, hold the single leader, rebalance monthly. The rebalance schedule is anchored to CALENDAR time (year*12+month derived from the bar's own timestamp via pure civil-from-days arithmetic), never to a process-relative bar counter, so it is identical across restarts, backtests and paper replay. All three legs share one USEQ session calendar and are read from ONE synchronized close buffer (a deque of same-timestamp rows) so index-based lookbacks can never desynchronize; the base template's same-timeframe alignment barrier already defers processing until all three legs have delivered the session's bar. Sizing is capital-relative via get_account_equity() and floored to whole shares (USEQ size precision 0); losers are closed before the winner is bought so the freed cash funds the purchase, and an unchanged leader is left alone unless the share delta exceeds $250, which keeps turnover at the low level the hypothesis requires. leverage stays 1.0 and the strategy is strictly long-only (a SELL is only ever issued against an existing long), so USEQ's Reg-T margin is unused. calculate_signal returns a continuous daily variable — the leader's excess momentum over the basket mean — recomputed every session even though the trade fires monthly. Venue kept as USEQ per the hypothesis: the three instruments are US ETFs and only USEQ carries them.

Hypotheses

failed deflated Sharpe: DSR=0.0, expected-max=2.75 over 225 trials — selected Sharpe (0.318, OOS 0.180) is indistinguishable from best-of-N noise, compounded by two unwaivable hard-gate failures (walk-forward is_overfitted=TRUE with IS 1.159 -> OOS 0.180, and PBO 0.5472 > 0.5). Sharpe CI [-0.016, 0.654] straddles zero, is_significant=false, and the candidate does not survive programme-level FDR (keeps 4 of 249). This is a robustness/edge death, NOT fee-fragility (avg_trade_return_pct 1.67% clears the USEQ floor) — the trades correctly implement the cross-asset relative-momentum mechanism, so this is a fair test and the premise is simply weak on this SPY/TLT/GLD universe. There is no robust parameter region to tune toward: lookback_days is a cliff, the whole sensitivity sweep tops out ~0.49 Sharpe, and the oos_vault is UNDERPOWERED (~21 trades vs 100 needed) because the monthly-rotation cadence is structurally too slow to validate on available history — a 2nd optimization pass would only curve-fit noise. A near-identical QQQ/GLD/TLT dual-momentum rotation sibling (similarity 0.83) already died. Failure pattern: overfit / no-generalization (cross-asset ETF momentum rotation).

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.

Verification Results

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.

Verification Results

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

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.

Backtest Review

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.

Backtest Review

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.

Backtest Review

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.

Backtest Review

Legitimate macro-rotation family, explicitly distinct from the dead single-name momentum clones (L90/L82) and the USEQ classical-anomaly dead list (L74/L75).

Backtest Review

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.

Backtest Review

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.

Backtest Review

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.

Analysis

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.

Analysis

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.

Analysis

Holdout is technically positive (Sharpe 0.036 on 22 trades) and consistent_with_oos=true — no catastrophic forward collapse.

Analysis

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.

Analysis

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).

Analysis

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.

Analysis

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.

Analysis

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.

Analysis

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.

Analysis

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

CrossAssetRelativeMomentumRotationSp-87cfad6b15

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.

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.

Outcome Summary

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.

Outcome Summary

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.

Outcome Summary

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.
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.