Skip to content
All strategies

Strategies

USEQ Asset-Class Rotational Momentum: Hold Top-3 of 5 Asset-Class ETFs (SPY/EFA/EEM/IEF/GLD) by 12-Month Return, Equal-Weight, Monthly Rebalance, Daily Bars, Long-Only Unlevered

Outcome: Abandoned

UseqAssetClassTop3MomentumRotation

Outcome Summary

The hypothesis proposed a 20-year USEQ test of top-3-of-5 asset-class momentum rotation (SPY/EFA/EEM/IEF/GLD) with monthly rebalancing, to add a non-crypto mechanism to the research corpus. The developer produced a partial implementation with ranking, equal-weight slot sizing and an optional absolute-momentum SHY filter. The coding stage timed out three times, and the run was abandoned as 'coding_stuck_3_timeouts'. No backtest, optimization or analyst verdict was produced, so the idea itself remains untested.

Hypothesis

Classification: (a) a concrete trading idea. The source gives a universe of 5 asset-class ETFs, ranks them by 12-month rate of change, holds the top 3 equally weighted, and rebalances monthly. The Quantpedia original universe is SPY, EFA, IEF, VNQ, GSG. Our USEQ universe file has neither VNQ nor GSG (checked: it has AGG EEM EFA GLD IEF IWM LQD QQQ SHY SPY TIP TLT), so the closest 5-class universe that exists in our data is SPY (US equity), EFA (developed ex-US equity), EEM (emerging equity), IEF (7-10y……Show moreShow less

Classification: (a) a concrete trading idea. The source gives a universe of 5 asset-class ETFs, ranks them by 12-month rate of change, holds the top 3 equally weighted, and rebalances monthly. The Quantpedia original universe is SPY, EFA, IEF, VNQ, GSG. Our USEQ universe file has neither VNQ nor GSG (checked: it has AGG EEM EFA GLD IEF IWM LQD QQQ SHY SPY TIP TLT), so the closest 5-class universe that exists in our data is SPY (US equity), EFA (developed ex-US equity), EEM (emerging equity), IEF (7-10y Treasuries) and GLD (gold, as the real-asset/commodity sleeve). Substitutions: EEM for VNQ, GLD for GSG. This is a set of asset classes chosen before seeing results, not a hand-picked stock list (lesson 151): each ETF is the standard liquid proxy for its class and all five existed and were liquid throughout the test. The universe is 5 names, well under lesson 173's cap of about 10, so ranking costs 5 O(1) lookups per month. Daily history: GLD begins 2004-11, the others earlier, so with a 252-session warm-up the first rebalance is around 2005-11. That gives roughly 20 years and about 240 rebalances, which covers 2008, 2013 (taper), 2020, 2022 (bonds and stocks falling together) and the 2023-26 gold run. Venue: USEQ, zero commission, about 0.02-0.05% round trip in spread and impact. The factory has run USEQ on only 2.5% of its experiments, and none of those used a daily multi-asset rotation of this kind. The mechanism is the long-horizon time-series and cross-asset momentum of macro asset classes (Asness-Moskowitz-Pedersen 2013). It has nothing to do with crypto microstructure, so it adds a new mechanism to a corpus that is 67% BINANCE. Risk profile: 1.0x gross, no leverage, one-third of equity per holding, no stop-loss (a monthly rotation IS the exit; stops on a daily rotation book are extra fitted parameters). Flat state: the primary variant is always invested in 3 of the 5 ETFs, about 0% flat. It is long-only, so it never pays a double-notional sign flip; the lesson-150 concern about 'never flat' designs is sign-flip cost, which does not apply here, and turnover is only about 0.5-1 name per month. PRE-REGISTERED SECOND VARIANT, scored separately and NOT part of the primary claim (lesson 130): an absolute-momentum filter where any top-3 name with a negative 12-month return has its third moved to SHY (cash proxy). This variant is expected to be flat, in SHY, about 15-25% of the time.

Iteration 2: the only change is to fix the Layer-2 crash. _pending() called self.cache.orders_inflight, which the synthetic mock cache does not provide. It now always uses orders_open and calls orders_inflight only when the cache has it (the real NautilusTrader cache does). Signal, rebalance, sizing and config are unchanged. Gross exposure is at most 0.97x equity: sells happen on one session and buys on a later session.

coding_stuck_3_timeouts

Implementation

Monthly (calendar-anchored) rotation into the top-3 of SPY/EFA/EEM/IEF/GLD by trailing 252-session return, equal-weight 1/3 each, whole shares, long-only, unlevered on USEQ daily bars. Pre-registered variant (use_abs_filter=True) moves negative-momentum slots to SHY.

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['top_n', 'cash_symbol', 'min_notional', 'notional_pct', '_param_bounds', 'abs_threshold', 'lookback_bars', 'use_abs_filter'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000) - steady_downtrend: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000) - flat_ranging: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000) - volatility_spike: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000) - zero_volume: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000) - price_gap: AttributeError: '_MockCache' object has no attribute 'orders_inflight' (bar timestamp: 1735704780000)

sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of SPY.USEQ-1-DAY-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

Outcome Summary

Multi-leg daily rotation code with persisted slot state and staged exits and entries timed out three times in coding, so a future attempt should start with a simpler minimal implementation (for example, the primary variant only) that can finish within the coding time limit.

The run was abandoned in the coding stage with reason 'coding_stuck_3_timeouts' after 3 iterations. It never reached verification, backtest review, optimization, analyst review or risk review.

A long-only, unlevered monthly rotation on USEQ that ranks five asset-class ETFs (SPY, EFA, EEM, IEF, GLD) by 12-month return and holds the top 3 at equal weight, based on cross-asset time-series momentum (Asness-Moskowitz-Pedersen 2013); a pre-registered variant moves any top-3 name with a negative return into SHY.

No performance data exists: the backtest report is empty, no optimization ran, and there are no Sharpe, return or trade-count figures.

Analysis

Asset Class Momentum

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