Skip to content

View translation

SpotMajorsTrendBreadthBasket

Hypotheses

Trend-Breadth Absolute-Momentum Majors Basket, Long-Only Spot (BINANCE_SPOT: BTC/ETH/SOL/BNB/AVAX/LINK/ADA/XRP, Own EVERY Major Above Its Own 100-Day Trend — Equal Weight, Exposure Scales With Breadth, Cash Otherwise, Weekly Check, 2-Parameter)

Hypotheses

A LONG-ONLY, diversified TIME-SERIES (absolute) momentum basket — the distinct twin of the deployed CROSS-SECTIONAL (relative-strength) rotation, and deliberately NOT a rank/top-K construction. Instead of ranking and holding the 3 strongest names, it independently checks each of the 8 spot majors against its OWN long-term trend and holds equal-weight EVERY name that is above trend (0 to 8 of them), so total invested exposure scales with market BREADTH: nearly fully invested when the whole sector trends up, mostly cash when breadth collapses. This is a materially different mechanism from the three pending rank-rotations (no cross-sectional ranking, no fixed slot count — it is a breadth/regime construction), and its extreme simplicity (essentially ONE parameter, the trend length) is the strongest possible defense against the overfit graveyard that is the #1 killer here (235 deaths). It is engineered against this session's other death modes: LONG-ONLY spot + 1x leverage → CANNOT be liquidated (unlike the three -100% single-name perp blowups); equal-weight across up-to-8 names → no single-name 81%-DD concentration (unlike the mid-cap rotation); the breadth-scaled cash allocation → automatic de-risking in bear regimes (the drawdown control the equal-weight variants lacked). It fills the under-represented BINANCE_SPOT venue. Not carry (dead ex-BTC), not a grid (fat-tail), not a single-name bet (blowup), not options (fragile/blocked), not pairs (-82%), not a rank-rotation (pending).

Hypotheses

Iteration-4 addresses the QA finding that the strategy genuinely loses money on the down/choppy window (total_return -11.9%, Sharpe -1.86, and the win_rate=0/PF=0 accounting artifact where winners stay open/trimmed while only down-cross exits book as trades). The iter-3 hysteresis dead-zone stopped rapid re-crosses but still ENTERED names whenever price poked above SMA*(1+band) even when that SMA was flat or falling — i.e. bull-traps in a down tape, which are precisely the losing whipsaws. The smallest hypothesis-preserving fix is to turn the entry gate into a true absolute-momentum filter: a name is entered only when price is above its band AND its SMA is rising over trend_slope_lookback days. On the tested down/choppy window most majors have a flat/falling SMA, so the basket now stays in cash through those regimes instead of buying losing entries, removing the -11.9% loss driver; genuine up-trends (rising SMA) are still owned and ridden to a hysteresis exit that books as a win. This keeps every element QA confirmed correct — the on_bar execution override that fixed the iter-1 alignment-barrier freeze, own fresh per-symbol close buffers, hand-verifiable CASH equity marking, gross bounded below 1x, and long-only trim discipline — untouched, and stays faithful to the hypothesis (own every major above its own trend, breadth-scaled exposure, ~2 tuned parameters). The rising-trend requirement is the canonical trend-following-in-chop remedy and is the highest-expectancy single lever available without abandoning the mechanism; it necessarily keeps trade count modest because it deliberately refuses falling-trend entries, prioritizing positive expectancy over raw trade frequency.

Hypotheses

Abandoning after 4 iterations with no progress on the identical, decisive defect I flagged in iter-1 and iter-3 (which I designated the final plumbing pass). The equity accounting is STILL broken and worse: daily_returns shows an impossible +437.09% single-day return on 2021-02-18 (iter-1 +199% -> iter-3 +407.94% -> iter-4 +437.09%) for a long-only 1x equal-weight (1/8) spot basket that cannot move that much in a day, and the entire return series still FREEZES at 2021-02-18 with nothing through the 2026 end date (only 28 trades over a claimed ~9-year window). The iter-4 change addressed the signal (rising-SMA gate) but again left the accounting/continuity bug untouched, despite the explicit iter-3 instruction to stop rebuilding the bespoke on_bar/_portfolio_value plumbing and clone the proven sibling SpotMajorsMomentumRotationLong's execution verbatim. Every headline metric (total_return 553%, Sharpe 1.47, PF 8.8, Calmar 20.5, avg_trade_return_pct 51.9%/trade) is an artifact of this corrupted, truncated curve and cannot be optimized. The underlying long-only spot trend-breadth premise is sound and could be resurrected as a fresh hypothesis that reuses the working sibling's machinery wholesale, but this implementation line has not converged across four passes and continuing to iterate only burns budget toward timeout.

Implementation

Long-only, liquidation-immune BINANCE_SPOT time-series (absolute) momentum breadth basket over 8 majors (BTC/ETH/SOL/BNB/AVAX/LINK/ADA/XRP), 1-DAY bars, pure OHLCV. Weekly it checks each name against its own trend_length-day SMA and holds equal-weight 1/N in every name that is above a RISING trend, so invested exposure scales with market breadth (near fully invested in a broad up-trend, mostly cash when breadth collapses). Entry requires price > SMA*(1+trend_band) AND a rising SMA (SMA_now > SMA trend_slope_lookback days ago); held names are kept until price < SMA*(1-trend_band) (hysteresis exit). Own alignment-free daily-close buffers, CASH-correct equity marking (USDT cash + Sigma qty*close), delta-to-target sizing bounded at (1-cash_buffer)<1x, spot long-only SELL-only-to-trim.

Verification Results

Verification failed (Layer 4 — QA review): - Degenerate trade metrics that signal a defect/accounting problem, not a clean result: profit_factor 0.0, win_rate 0.0, avg_win 0.0, largest_win 0.0 -- every one of the 11 realized round-trips is a loss. Root cause is the exit accounting interacting with the trend-follow logic: a position is only COUNTED as a closed trade when its quantity returns to zero, and full closes happen ONLY on the down-cross path (a name drops below its own SMA -> target_dollar=0 -> full sell). Winners that keep trending stay OPEN (never counted) or are merely TRIMMED by the 20% rebalance_band (a partial reduction that does not close the position and is not booked as a trade). So the realized-trade set is structurally all down-cross whipsaws, which forces win_rate/PF to ~0 regardless of the true edge and makes the per-trade metrics (avg_trade_return_pct -8.79%) uninterpretable as an edge measure. This is exactly the win_rate=0.0 / profit_factor=0.0 pattern that must be treated as a code/accounting defect rather than routed onward as a fee/edge failure. - Beyond the metric artifact, the strategy genuinely loses money on the window: total_return -11.9% with end_unrealized_pct 0.0 (no hidden unrealized winners), Sharpe -1.86 with CI [-3.07, -0.52] ENTIRELY below zero, calmar -1.07, omega 0.38, tail_ratio 0.18, return_skew -4.29. A long-only trend-breadth basket on 8 spot majors in this down/choppy ~1-year window buys names on the up-cross and sells them on the down-cross (bull-trap whipsaw), paying ~0.20% spot round-trip each time. This is the same no-fee-clearing-edge outcome the cross-sectional and risk-parity siblings produced across their iterations -- the pure-OHLCV majors-trend mechanism has no positive expectancy on the available spot data, in any of its rank / risk-parity / breadth forms. - Sub-measurability and another offline-vs-engine discrepancy. The engine produced only 11 trades over 363 days (turnover 1.83) -- below the ~100-trade measurability floor and FEWER than iter-1's 26, despite the developer's rationale claiming the on_bar fix yields '470 rebalances' and 'far more than the old 26 trades'. Rebalances are not trades (most weeks no name crosses its trend, so nothing fires), and the offline harness figures again do not correspond to engine trade counts. The execution/equity plumbing itself (own fresh close buffers, cash + Sigma qty*close marking, gross bounded at 1-cash_buffer, spot long-only SELL-only-to-trim) is implemented correctly and the impossible-return / freeze bugs from iter-1 do appear fixed (max single-day move is sane, max_drawdown 11.9%). The failure is viability, not the plumbing.

Backtest Review

Premise remains sound and liquidation-immune (long-only spot trend-breadth momentum); a working deployed sibling proves the architecture CAN run correctly

Backtest Review

The iter-4 rising-SMA entry gate is a reasonable signal improvement in principle

Backtest Review

SAME defect as iter-1 and iter-3, now WORSE: impossible +437.09% single-day return on 2021-02-18 for a long-only 1x 1/8 spot basket (iter-1 +199%, iter-3 +407.94%, iter-4 +437.09%) — the equity accounting is still spiking

Backtest Review

SAME freeze: daily/monthly/annual return series all end at 2021-02-18, nothing through the 2026 end date, only 28 trades over a claimed ~9-year window

Backtest Review

The iter-3 instruction to stop rebuilding the bespoke plumbing and clone the proven sibling's execution verbatim was not followed; iter-4 changed the signal, not the broken accounting

Backtest Review

All headline metrics (total_return 553%, Sharpe 1.47, PF 8.8, Calmar 20.5, avg_trade_return_pct 51.9%/trade) are artifacts of the corrupted, truncated equity curve — uninterpretable and not optimizable

Backtest Review

Four iterations with no progress on the identical core defect

Backtest Review

Not evaluated — equity curve is a corrupted artifact (impossible +437% single day, series frozen after 2021-02-18).

Analysis

FINAL plumbing iteration. Your iter-2/iter-3 rework did NOT fix the two defects I flagged in iter-1 — they both persist and one is worse: (1) daily_returns shows +407.94% on 2021-02-18, physically impossible for a long-only 1x equal-weight (1/8) spot basket — the equity mark is still spiking; (2) the return series ENDS at 2021-02-18 (nothing through 2026, only 38 trades in ~9 years) — the freeze recurred, just at a different date than iter-1's 2021-11-09. The bespoke on_bar override + self._closes buffers + _portfolio_value() approach has now failed twice on this exact bug. STOP rebuilding it from scratch. Instead: (a) The deployed sibling SpotMajorsMomentumRotationLong runs continuously 2017-2026 with correct CASH equity and no impossible returns. Copy its execution/equity/sizing machinery VERBATIM and change ONLY the selection rule from cross-sectional top-K rank to your absolute per-name above-own-trend hysteresis test. Do not re-derive the equity accounting. (b) Before returning, add an assertion/log that rejects any single-bar equity change beyond a sane bound (e.g. >30%) and confirm the per-rebalance log actually prints for dates in 2022, 2023, 2024, 2025, AND 2026 — paste evidence that rebalances fire past 2021. (c) Re-run the full window and confirm: no single-day return >~20%, a continuous equity curve to 2026-07, and a plausible trade count (hundreds, not 38). If the impossible-return + freeze is still present after cloning the sibling, this will be abandoned — do not return a third broken curve.

Outcome Summary

This strategy pursued a sensible, liquidation-immune idea — own every spot major above its own rising long-term trend at equal weight, letting breadth scale exposure and automatically de-risk into cash during bear regimes. It never got a valid read, because its bespoke equity-accounting and execution plumbing was broken from iteration 1: the curve posted a physically impossible +437% single-day gain for a 1x 1/8 spot basket and then froze at 2021-02-18, leaving just 28 trades over a claimed nine-year window and rendering every headline metric an artifact. Successive iterations improved the signal (hysteresis in iter-3, a rising-SMA gate in iter-4) but repeatedly ignored the explicit instruction to stop rebuilding the plumbing and clone the proven sibling's machinery verbatim, so the same defect recurred and worsened. After four non-converging passes the backtest review abandoned this implementation line — noting the underlying trend-breadth premise is sound and could be resurrected as a fresh hypothesis reusing the working sibling's execution wholesale.

Outcome Summary

When a working sibling already has correct execution machinery, an explicit instruction to clone it verbatim must be followed — re-deriving bespoke on_bar/portfolio-marking plumbing across iterations burned four passes on a corrupted, frozen equity curve without ever testing the sound underlying premise.

Outcome Summary

The backtest review abandoned it after four iterations with no progress on the identical decisive defect flagged since iteration 1: the bespoke on_bar/equity-marking plumbing kept spiking (+199% → +407.94% → +437.09% across iterations) and freezing the curve at 2021-02-18, while iteration 4 changed only the signal (a rising-SMA entry gate) and again left the accounting/continuity bug untouched.

Outcome Summary

A long-only spot time-series (absolute) momentum basket on eight BINANCE_SPOT majors that independently held equal-weight (1/8) every name trading above its own rising 100-day trend and sat in cash otherwise, so total exposure scaled with market breadth — an automatic bear-regime de-risker distinct from the deployed cross-sectional rank-rotation.

Outcome Summary

The results were uninterpretable because the equity accounting was corrupted: headline figures (total return 553%, Sharpe 1.47, profit factor 8.8, Calmar 20.5, avg per-trade return 51.9%) were artifacts of a broken curve showing an impossible +437.09% single-day return on 2021-02-18, after which the entire return series froze — only 28 trades over a claimed ~9-year window.
Strategy report

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