Skip to content
All strategies

Strategies

Market-State-Gated 6-Month Cross-Sectional Momentum on a Frozen 2020-01-01 Top-10 Spot Universe (Hindsight-Free), Long-Only Top-3, Monthly Rebalance, Flat in USDT When BTC's 12-Month Return <= 0 (BINANCE_SPOT, 1D)

Outcome: Abandoned

FrozenTop10SpotMomentumBtcStateGated

Outcome Summary

This strategy was meant as a faithful, survivorship-free test of market-state-gated 6-month momentum on crypto spot: hold the top 3 of a frozen 2020 top-10 universe each month, or sit in USDT when BTC's 12-month return is not positive. The code used fixed-length ring buffers and rebalanced only once a month, to avoid the sandbox timeouts seen in earlier runs. Even so, all 3 iterations failed Layer 3 verification, with the sandbox backtest going past the 300s limit, and the run was abandoned. No backtest, optimization, analyst or risk review ever produced results, so the hypothesis itself remains untested.

Hypothesis

Distils the source's two concrete rules: (1) market state = sign of the broad market's trailing 12-month return, checked once at each month start; (2) in the UP state, hold the prior-6-month momentum winners, equal weight, rebalanced monthly; in the DOWN state, liquidate everything into the defensive asset. Adaptations: (a) The source's short-losers leg is DROPPED. Dollar-neutral books are 0-for-12 here (L137), and on this factory's USEQ sector test of exactly this source (6-1 sector long/short with a defensive……Show moreShow less

Distils the source's two concrete rules: (1) market state = sign of the broad market's trailing 12-month return, checked once at each month start; (2) in the UP state, hold the prior-6-month momentum winners, equal weight, rebalanced monthly; in the DOWN state, liquidate everything into the defensive asset. Adaptations: (a) The source's short-losers leg is DROPPED. Dollar-neutral books are 0-for-12 here (L137), and on this factory's USEQ sector test of exactly this source (6-1 sector long/short with a defensive gate) the loser leg was the drag: PF 1.03 on 517 trades. (b) The defensive asset is USDT cash, not TLT; per L143 the signal and the trade stay in one market. (c) Market = BTCUSDT.BINANCE_SPOT, the crypto 'broad index' proxy; BTC is also a tradable member of the universe. (d) Universe: the source used every NYSE/NASDAQ stock, while this factory's US list is today's S&P 500, so it would carry survivorship bias (L151). Instead the universe is FROZEN point-in-time: the 10 largest non-stablecoin coins by market cap on 2020-01-01 that had Binance spot USDT pairs: BTC, ETH, XRP, BCH, LTC, BNB, XTZ, XLM, TRX, ADA. EOS (then top-10) is excluded only because its ticker was renamed in 2025, which breaks continuous data. No name was chosen for how it did after 2020, and later winners such as SOL and DOGE are deliberately left out. That makes it a 10-name universe (L173 cap). Hard cap: 3 holdings. Why this is not a duplicate: the factory's dead siblings are (i) USEQ SPDR sector rotation, 5 runs, overfit or PF about 1.0; (ii) crypto dual-momentum with each asset's OWN absolute-momentum filter on WEEKLY clocks, drawdowns of 65-77%; (iii) the deployed 30-day weekly perp rotation. None of them combined a 6-month ranking window with a monthly clock and a single broad-market 12-month state switch on a hindsight-free frozen universe. The novelty gate may still judge the family too close. If it does, the analyst should treat this as the one faithful test of the source and not iterate it. Flat-state declaration (L150): flat in USDT in every DOWN month. BTC's 12-month return was negative in roughly 40-45% of months over 2018-2026, so expected time flat is about 40%. Implementation note, given the recent sandbox_timeout deaths: daily bars, a fixed-length deque of 366 closes per instrument, and work only on the first daily bar of each UTC month. That is O(1) per bar, with no history rescans.

Iteration 3 preserves the passed signal and changes only history storage: a fixed circular buffer replaces deque middle-index reads, making every lookback O(1) and removing the Layer-3 timeout risk.

verification_loop: sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of BTCUSDT.BINANCE_SPOT-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).

Implementation

Monthly long-only equal-weight top-three momentum among a frozen 2020 Binance spot top-ten universe; holds USDT cash whenever BTC's trailing 12-month return is non-positive.

Verification Results

sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of BTCUSDT.BINANCE_SPOT-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

Even when the design is meant to do O(1) work per bar on monthly clocks, check the multi-instrument daily strategy's real runtime against the sandbox time limit before submitting it, since a sandbox_timeout here stops the whole test before any edge is measured.

It was abandoned in a verification loop after 3 iterations, because the Layer 3 sandbox backtest went past the 300s wall-clock limit on a ~20000-bar window (2400 days of BTCUSDT.BINANCE_SPOT 1-day bars). The backtest-review, analyst and risk stages were never reached.

Long-only, monthly-rebalanced 6-month cross-sectional momentum (top 3 of 10) on a frozen, hindsight-free 2020-01-01 top-10 Binance spot universe, moving fully into USDT whenever BTC's trailing 12-month return was <= 0.

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

Analysis

Momentum and State of Market Filters

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