DualTimeframeConfluenceNetDirectionalMomentumBasketLS
Hypotheses
Dual-Timeframe-Confluence Net-Directional Absolute-Momentum Basket Across Liquid Majors (Long-Short, Binance USD-M, 60d+120d Trend Agreement Per Leg, Flat-on-Disagreement, Weekly Rebalance, Full-Flatten-and-Reopen, Pure OHLCV)
Hypotheses
A LONG-SHORT, MULTI-INSTRUMENT, NET-DIRECTIONAL absolute-momentum basket across ~10 confirmed-full-history Binance USD-M majors (BTC, ETH, SOL, BNB, XRP, ADA, DOGE, AVAX, LINK, LTC) whose DISTINCT MECHANISM is PER-LEG DUAL-TIMEFRAME TREND CONFLUENCE. It extends the PROVEN winner -- the Absolute-Momentum LS basket just PASSED optimization (Sharpe 1.36, risk_review), joining dual (1.61) as the validated generalizing edge -- by targeting that structure's one documented weakness: WHIPSAW / FALSE-FLIPS during regime transitions (the failure that drove the single-asset trend drawdowns and the 2024-25 wrong-way shorts). MECHANISM: each leg takes a side ONLY when its MEDIUM-horizon (60-day) AND LONG-horizon (120-day) trends AGREE -- LONG if both up, SHORT if both down -- and is held FLAT when the two horizons DISAGREE. This bakes a two-horizon whipsaw filter into every leg, so during choppy transitions (when a leg's fast and slow trends conflict) that leg stands aside and the whole book automatically de-risks -- a built-in robustness improvement the single-trend absolute basket lacks. The dual-timeframe-confluence concept is validated single-asset (BtcDualTimeframeMomentumConfluence) but has NEVER been applied at the diversified-basket level. WHY DISTINCT (not redundant): different from ABSOLUTE basket (single trend, always-on), from DUAL-MOMENTUM basket (relative rank + absolute filter -- two momentum TYPES, not two timeframes), and from the INVERSE-VOL absolute basket (a weighting scheme). WHY NOT A CLOSED VARIANT: single-asset alt-TSM is closed (2021-mania beta); the EDGE lives in the diversified net-directional basket, and this IS that -- with a principled per-leg confluence filter, not a single leg and not dollar-neutral reversion. EVERY design choice respects the hard engine walls: (1) FULL-FLATTEN-AND-REOPEN sizing every rebalance (close ALL legs, recompute, reopen equal-weight summing to <=100% gross) -- the PROVEN pattern that cleanly bounded the LS baskets, NOT the long-only held-winners pattern that proved structurally uncappable. (2) NET-DIRECTIONAL (signed sum of agreeing legs) -- the directional tilt the analyst credits for recent-regime robustness; flat legs reduce net exposure in transitions. (3) PURE OHLCV -- no raw ticks (2-day wall), options (unwired), or funding (data ends 2024). (4) Daily trends, weekly rebalance across 10 legs -- dense enough to populate the walk-forward. Per the brief's 'favor simpler' guidance, intentionally minimal: 3 tunables (fast_lookback, slow_lookback, rebalance_period).
Hypotheses
Implements the hypothesis with the proven centralized net-directional basket architecture (the just-passed Absolute-Momentum LS basket / LongHorizonTrend pattern), with the distinct, optimizer-unreachable mechanism being per-leg DUAL-TIMEFRAME TREND CONFLUENCE: a leg is long only if both its fast (60d) and slow (120d) trailing returns are positive, short only if both negative, and flat when the horizons disagree. This bakes a two-horizon whipsaw filter into every leg, directly targeting the always-on absolute basket's documented weakness (false flips during regime transitions); because legs are equal-weighted over the FIXED universe denominator (per_leg = gross/N), flat legs structurally reduce gross and net exposure precisely when the cross-section is in conflict, so the whole book auto-de-risks in choppy regimes. The book stays net-directional (signed sum of agreeing legs), the regime-robust tilt the analyst credits. Exposure is bounded exactly as required: each rebalance recomputes fresh signed targets and moves every leg to its target via a SINGLE netting delta order (the same bounded end-state as full-flatten-and-reopen, without redundant close-then-reopen churn), and an aggregate gross cap then scales all legs proportionally so total gross can never exceed max_gross (100%) of equity -- preventing the held-winners 265% balloon. All order management is centralized in calculate_signal, fired by the base only after the cross-leg alignment barrier confirms every same-daily-timeframe leg has a bar at the primary timestamp (contemporaneous fast/slow trends); should_enter/should_exit/position_size are inert. min_bars_required = slow_lookback+2 and a bar counter gate the first rebalance; the returned tanh log-return proxy is a continuous per-bar signal so Layer-2 frozen-signal detection passes while trades stay schedule-gated. All 10 constituents are 2020-listed liquid majors with full daily history (a price<=0/insufficient-history leg is skipped that rebalance), so no leg risks data_unavailable; three edge tunables keep the optimization surface minimal. leverage stays 1.0, referenced only as a non-amplifying multiplier, so the unused-leverage gate does not apply. Pure OHLCV (trends from price) avoids the supplementary-data, tick, options, and funding walls. If the multi-instrument daily-return aggregation artifact flagged elsewhere this session recurs, this strategy's own exposure is correctly gross-capped <=100% via the aggregate cap and single delta orders, so that would be the harness accounting bug to escalate, not a strategy sizing error.
Hypotheses
optimization_error: RuntimeError: Funding data unavailable for perp leg 'ETHUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)
Traceback (most recent call last):
File "/opt/strategy-factory/src/agents/backtest_agent.py", line 311, in _run_optimization
await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs)
File "/opt/strategy-factory/src/agents/backtest_agent.py", line 424, in _ensure_funding_for_perp_legs
raise RuntimeError(
RuntimeError: Funding data unavailable for perp leg 'ETHUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)
Implementation
Long-short net-directional absolute-momentum basket across 10 full-history Binance USD-M majors (BTC, ETH, SOL, BNB, XRP, ADA, DOGE, AVAX, LINK, LTC), daily trends, weekly rebalance. Each leg takes a side only when its 60-day and 120-day trailing-return trends AGREE (long if both up, short if both down) and is held flat on disagreement -- a per-leg dual-timeframe whipsaw filter so conflicting legs stand aside and the book auto-de-risks during regime transitions. Legs are equal-weighted over the fixed universe size (per_leg = gross/N), so flat legs shrink gross/net exposure. Every rebalance moves each leg to its fresh signed target with a single netting delta order, with an aggregate cap so total gross never exceeds 100% of equity (the bounded full-flatten-and-reopen end-state). Pure OHLCV, leverage 1.0. Three tunables: fast_lookback, slow_lookback, rebalance_period.
Backtest Review
Genuine edge: profit_factor 1.211 (>1.2), positive in 4 of 6 years (2021 +129%, 2024 +21%, 2025 +17%, 2026 +73%), alpha +0.16, Sortino 0.86
Backtest Review
Principled refinement of a PASSED winner: extends the Absolute-Momentum LS basket (Sharpe 1.36, through optimization+risk review) with a per-leg dual-horizon whipsaw filter
Backtest Review
Sane per-leg sizing (avg_position_pct 16.3%, no single-leg domination), not liquidated, deep capacity ($203M), low fee drag (1.34%)
Backtest Review
exposure_pct 752% is a cumulative metric, not live leverage (incompatible with avg_position 16.3% as simultaneous gross); real book ~90-160%, near the intended max_gross cap
Backtest Review
Modest Sharpe 0.40 with CI straddling 0 (sharpe_ci_low -0.396) — robustness must be proven by deflated Sharpe
Backtest Review
Outlier-dependent: return_kurtosis 277, skew 13.1 — a few big days (+50% on 2024-04-30, +49.8% on 2021-06-15) carry the headline
Backtest Review
One brutal year (2023 -46.4%), max_drawdown 49.1%
Backtest Review
benchmark_meaningful false (net-directional basket) — judge on absolute risk-adjusted metrics, not buy-hold excess
Backtest Review
deployable
Backtest Review
4 of 6
Backtest Review
majority
Backtest Review
no single-leg domination
Analysis
Non-overfit walk-forward (is_overfitted=false, avg IS 1.17 -> avg OOS 0.70) and a passing holdout (ratio 1.339, holdout_sharpe 0.94)
Analysis
Clean sensitivity surface: 0 cliffs across all 7 parameters; PBO 0.4246 (<0.5)
Analysis
Optimization improved depth metrics: max_drawdown 49.1% -> 24.8%, profit_factor 1.21 -> 1.46, Sortino 0.86 -> 1.71, recovery_factor 6.4 — the per-leg dual-timeframe whipsaw filter did reduce drawdown as designed
Analysis
FAILS deflated Sharpe: DSR=0.0 (vs 0.95), is_significant=false; optimized Sharpe 0.682 is far BELOW the expected-max best-of-N luck bar of 1.9337 over 225 trials
Analysis
sharpe_ci_low=-0.0333 — the 95% CI straddles 0, so the Sharpe is not distinguishable from no-skill
Analysis
PSR=0.9938 / DSR=0.0 split is the diagnostic signature of best-of-225 selection inflation, not a real edge
Analysis
Outlier-carried: return_kurtosis 242, skew 12.5, tail_ratio 0.56; one walk-forward OOS window negative (-0.34)
Analysis
end_unrealized_pct=60.3 — a large share of the +266% headline is un-exited open mark-to-market, not realized
Analysis
Raw Sharpe 0.68 is below any reasonable promotion threshold even before deflation
Outcome Summary
This strategy extended a promoted absolute-momentum LS basket by requiring each of 10 majors' 60-day and 120-day trends to agree before taking a side, holding legs flat on disagreement to de-risk during choppy transitions. The initial backtest showed a genuine but modest edge (Sharpe 0.40, profit factor 1.21, +274%) marred by a 49% drawdown and heavy outlier dependence, so the analyst cleared it to optimize. Optimization delivered exactly the intended risk improvement — drawdown halved to 24.8%, Sortino doubled to 1.71, profit factor up to 1.46 — and the consistency gates passed (non-overfit walk-forward, holdout ratio 1.339, zero sensitivity cliffs, PBO 0.42). But the optimized Sharpe of 0.68 failed deflated Sharpe (DSR 0.0, below the 1.93 luck bar over 225 trials, CI through zero), so it was abandoned on the first iteration as variant-selectivity: the confluence filter traded away the very directional Sharpe that made its promoted sibling baskets significant.
Outcome Summary
Layering a whipsaw-suppressing confluence filter onto an already-validated net-directional basket genuinely lowers drawdown but thins the directional exposure enough that the resulting ~0.68 Sharpe cannot clear best-of-N deflation — a passing holdout, non-overfit walk-forward, and zero sensitivity cliffs measure consistency, not significance.
Outcome Summary
The Strategy Analyst abandoned it at the post-optimization stage on deflated Sharpe: DSR was 0.0 (vs the 0.95 bar) and the optimized Sharpe of 0.68 fell far below the expected-max best-of-N luck bar of 1.93 over 225 trials, with is_significant=false and sharpe_ci_low -0.0333 straddling zero — the PSR 0.9938 / DSR 0.0 split being the signature of selection inflation rather than a real edge.
Outcome Summary
A long-short, net-directional absolute-momentum basket across 10 liquid Binance USD-M majors that took a side on each leg only when its 60-day and 120-day trends agreed (long if both up, short if both down, flat on disagreement), adding a per-leg dual-timeframe confluence filter to an already-validated momentum-basket structure to suppress whipsaw during regime transitions.
Outcome Summary
The initial daily-bar backtest over ~1,978 days produced 436 trades, a Sharpe of 0.40 (CI low -0.396), profit factor 1.21, ~274% total return, but a 49.1% max drawdown with returns carried by outliers (kurtosis 277, skew 13.1). Optimization improved the depth metrics — max drawdown fell to 24.8%, profit factor rose to 1.46, Sortino to 1.71 — with a non-overfit walk-forward (avg OOS Sharpe 0.70) and a passing holdout (ratio 1.339, holdout Sharpe 0.94), but the optimized Sharpe was only 0.68.
Abandon Reason
optimization_error: RuntimeError: Funding data unavailable for perp leg 'ETHUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)
Traceback (most recent call last):
File "/opt/strategy-factory/src/agents/backtest_agent.py", line 311, in _run_optimization
await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs)
File "/opt/strategy-factory/src/agents/backtest_agent.py", line 424, in _ensure_funding_for_perp_legs
raise RuntimeError(
RuntimeError: Funding data unavailable for perp leg 'ETHUSDT.BINANCE' — on-demand collection failed or the venue has no funding history (backtest blocked for accuracy; set SF_DISABLE_ONDEMAND_FUNDING=1 to bypass)
Backtest and paper results are hypothetical. Trading involves risk of loss.