DualMomentumAgreementLongShortBasketDaily
Hypotheses
Binance USD-M Dual-Momentum Long-Short Basket (Absolute Trend AND Cross-Sectional Rank Confirmation, Flat-on-Disagreement, Weekly Rebalance)
Hypotheses
A long-short, multi-instrument managed-futures basket across ~18 liquid Binance USD-M alt perpetuals that requires TWO momentum signals to AGREE before taking a position — combining the factory's two separately-validated edges into one more-robust construction. Signal A (absolute / time-series): each asset's own trend (the mechanism promoted at Sharpe 1.48). Signal B (relative / cross-sectional): each asset's rank versus its peers (the mechanism in my pending cross-sectional basket). The basket goes LONG a name only if it is BOTH in an absolute uptrend AND top-ranked relative; SHORT only if BOTH in an absolute downtrend AND bottom-ranked; anything where the two disagree is left FLAT. This conjunction is the novel, robustness-adding element: it directly prevents the dominant crypto failure mode that sank the abandoned SOL/AVAX ratio MR (and would sink a naive low-vol short leg) — shorting a name that is actually trending UP — because the short leg fires only on names in genuine absolute downtrends. It is deliberately data-safe: Binance USD-M OHLCV only, the one surface that reliably backtests in this harness (avoiding the Deribit/COIN-M/Hyperliquid-alt/liquidations/multi-leg-funding infrastructure blocks that killed recent novel ideas), and avoids every refuted class (no funding, no basis, no ratio MR, no options). Same-venue, same daily timestamps; few parameters to resist overfitting. Improves the portfolio's most-skewed dimension (87% long-only) with a market-neutral-leaning sleeve, while being distinct from both the promoted pure-time-series basket and the pure cross-sectional basket.
Hypotheses
Implements the dual-momentum AGREEMENT hypothesis: Signal A (absolute time-series trend, sign of lookback return) and Signal B (cross-sectional rank) must both confirm before a leg is taken, which structurally prevents shorting names that are actually trending up. Iteration-2 fix: the Layer-2 synthetic proxy re-binds strategy methods and does not preserve the @staticmethod descriptor, so `self._bar_ts(bar)` was passing two positional args to a one-arg static function ('takes 1 positional argument but 2 were given'). Converted `_bar_ts` to a regular instance method (`def _bar_ts(self, bar)`), which is correct under both the real engine and the proxy. No other logic touched — imports, signal construction, sizing and rebalance flow (all of which already passed Layer 1) are unchanged.
Hypotheses
Failed deflated Sharpe and every forward gate decisively, confirming the pre-optimization concern. DSR=0.1037 (vs 0.95 bar), with the optimized Sharpe 0.725 BELOW the 225-trial expected-max luck bar of 1.108 (is_significant=false, PBO 0.599>0.5, sharpe_ci_low 0.07 effectively straddling zero) — after multiple-testing correction the selected config is statistically indistinguishable from best-of-N noise. Two independent forward gates concur: the walk-forward is is_overfitted=TRUE with avg IS 1.041 collapsing ~15x to avg OOS 0.068 (windows [0.21, -0.31, 0.31], one negative), and the HOLDOUT FAILED and is NEGATIVE (holdout_sharpe -0.486, ratio -7.137) — the untouched recent window loses money, consistent with genuine 2025-2026 decay (2025 -17%, rolling Sharpe -2 to -4). The clean sensitivity grid (0 cliffs) and PSR 0.9915 measure consistency, not significance — the textbook PSR-vs-DSR trap — and cannot override the DSR, PBO, is_overfitted, and negative-holdout failures. Not iterate (attempt 1 of 2): the binding failure is a negative forward holdout plus near-zero OOS across a flat 0-cliff surface whose entire range sits below the luck bar, so there is no under-explored robust region to tune toward — a second best-of-225 sweep re-selects the same sub-significant, decaying config. Not revise_hypothesis: the net-directional momentum-basket mechanism is already validated/promoted on the pure time-series basket (~1.48) and the cross-sectional basket, so this dual-momentum-agreement variant on the same 18-alt universe is variant-selectivity failing deflation, not a proven mechanism stranded on a dead target. FAILURE PATTERN: the flat-on-disagreement conjunction of two separately-validated momentum edges does NOT compound into a more-robust edge — requiring both signals to agree strips out the very directional Sharpe that made the promoted parents significant, collapsing the construction to a ~0.3 base / 0.72 optimized Sharpe that cannot clear best-of-225 deflation (DSR 0.10, below the 1.11 luck bar), with an is_overfitted walk-forward (avg OOS 0.07) and a NEGATIVE recent holdout (-0.49). A clean sensitivity grid and PSR~0.99 do not rescue a variant whose forward holdout loses money; the promoted pure-TS and pure-cross-sectional baskets remain the configurations where this class clears the bar.
Implementation
Long-short managed-futures basket across ~18 liquid Binance USD-M alt perpetuals, rebalanced weekly on daily bars. A name is held LONG only if its own return over `lookback` days is positive AND it ranks in the cross-sectional top-K; SHORT only if that return is negative AND it ranks in the bottom-K; disagreement leaves it FLAT. Equal gross budgets per side (dollar-neutral leaning), inverse-vol weights within each sleeve with a floored vol denominator, total gross capped at 1.0x (no leverage). Orders are placed per-leg from calculate_signal's rebalance driver; the base single-position hooks are inert.
Verification Results
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['assets', 'lookback', 'gross_cap', 'vol_floor', 'resize_frac', 'min_notional', 'num_per_side', 'vol_lookback', 'qty_precision', 'rebalance_days', 'default_qty_precision']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
- steady_downtrend: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
- flat_ranging: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
- volatility_spike: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
- zero_volume: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
- price_gap: TypeError: DualMomentumAgreementLongShortBasketDaily._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735692660000)
Backtest Review
Strategy functions and matches the hypothesis: 593 trades split 268 long / 325 short, a genuinely balanced long-short basket with both legs active (long_win_rate 0.437, short_win_rate 0.489).
Backtest Review
Adequate sample for optimization: 2063 data days, 18-asset universe, only 3 tunables (lookback, num_per_side, rebalance_days) with the construction frozen — low overfitting surface.
Backtest Review
Data-safe, same-venue Binance USD-M OHLCV only; benchmark_meaningful=false is correct for a market-neutral sleeve, so it should be judged on absolute risk-adjusted metrics, not buy-hold.
Backtest Review
Very thin base edge: Sharpe 0.34, profit_factor 1.069, sharpe_ci_low -0.36 (CI straddles zero) — fees/impact (impact_cost_pct 11.6%) are consuming most of the gross edge.
Backtest Review
Return is entirely a 2021 artifact (+316.7%); 2023 -19%, 2025 -36%, 2026 -3.8%, with rolling Sharpe -5 to -7 through late 2025 — genuine recent-regime decay, and return_kurtosis 197 / skew 7.4 = outlier-carried.
Backtest Review
The 'robustness-adding' conjunction appears to have degraded, not improved, the edge relative to its promoted parent mechanisms (Sharpe 1.48 → 0.34); this profile matches an already-abandoned L/S momentum-basket sibling.
Backtest Review
both legs active
Analysis
Clean sensitivity surface (0 cliffs across all 9 parameters) and a legitimate, balanced market-neutral construction (395 long / 456 short optimized), correctly implementing the dual-momentum conjunction.
Analysis
Low fee drag on the optimized config (commission 1.28% of gross, impact 2.73%) — costs are not the binding problem.
Analysis
sharpe_ci_low marginally positive (0.07).
Analysis
Fails deflated Sharpe decisively: DSR 0.1037 vs 0.95, optimized Sharpe 0.725 BELOW the 225-trial expected-max luck bar of 1.108 (is_significant=false, PBO 0.599>0.5) — indistinguishable from best-of-N noise.
Analysis
Walk-forward is_overfitted=TRUE: avg IS 1.041 collapses ~15x to avg OOS 0.068 with a negative window (-0.312).
Analysis
Holdout FAILED and is NEGATIVE: holdout_sharpe -0.486, ratio -7.137 — the untouched recent window loses money, confirming genuine 2025-2026 decay (2025 -17%, rolling Sharpe -2 to -4).
Analysis
The conjunction degraded rather than added edge relative to its promoted parents (pure TS basket ~1.48); the flat-on-disagreement filter strips directional Sharpe.
Analysis
Outlier-carried (return_kurtosis 105, skew 6.4); PSR 0.9915 vs DSR 0.10 is the classic multiple-testing trap.
Outcome Summary
This strategy combined two of the factory's separately-validated momentum edges—absolute trend and cross-sectional rank—into one 18-asset Binance USD-M long-short basket that only traded names where both signals agreed, aiming to add robustness and diversify the portfolio away from its 87% long-only skew. It functioned as designed with a balanced long/short book, but the base backtest showed a thin Sharpe of 0.34 with a confidence interval straddling zero, and the pre-optimization gate flagged it for optimize while warning the edge was fee-eroded and carried by a 2021 outlier. Optimization lifted the in-sample Sharpe to 0.725 but every forward gate failed: deflated Sharpe 0.10 versus a 0.95 bar, PBO 0.599, an overfitted walk-forward collapsing to ~0.07 OOS, and a negative recent holdout of -0.486. On iteration 2 of 2 the analyst abandoned it, concluding the flat-on-disagreement conjunction stripped the very directional Sharpe that made its parents significant, leaving the pure time-series and pure cross-sectional baskets as the configurations where this class actually clears the bar.
Outcome Summary
Requiring two separately-validated momentum edges to agree (flat-on-disagreement) strips out the directional Sharpe that made the promoted parent strategies significant, so the conjunction degrades rather than compounds robustness—and a clean sensitivity grid plus high PSR (0.99) cannot rescue a config that fails deflation and loses money on a fresh holdout.
Outcome Summary
The analyst abandoned it at the post-optimization ANALYZING stage: it failed deflated Sharpe (0.1037 vs 0.95 bar), was below the 225-trial expected-max luck bar of 1.108 (is_significant=false, PBO 0.599), was flagged is_overfitted (avg IS 1.041 collapsing ~15x to avg OOS 0.068), and failed a negative holdout (ratio -7.137), confirming genuine 2025-2026 regime decay.
Outcome Summary
A long-short managed-futures basket across 18 liquid Binance USD-M alt perpetuals that goes long/short a name only when its absolute (time-series) trend and its cross-sectional momentum rank agree, staying flat on disagreement to avoid shorting names that are actually trending up.
Outcome Summary
The base backtest produced 593 trades (268 long / 325 short) over 2063 data days with a total return of ~379% but a thin Sharpe of 0.34 (CI low -0.36), profit factor 1.069, and 51.5% max drawdown. After 3-phase optimization the Sharpe rose to 0.725 with 25.5% max drawdown, but the holdout window was negative (Sharpe -0.486) and deflated Sharpe was only 0.10.
Backtest and paper results are hypothetical. Trading involves risk of loss.