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