BtcMacroConfirmedMomentumLS
Hypotheses
BTC Macro-Confirmed Momentum, Long-Short (Single-Instrument BTCUSDT.BINANCE Perp, 4H Primary Momentum + 1-WEEK Macro-Trend Confirm, Flat on Disagreement, ATR-Trailing, 2-Parameter)
Hypotheses
A LONG-SHORT, single-instrument, pure-OHLCV momentum strategy on BTCUSDT.BINANCE USD-M perpetual that applies the factory's ONLY proven-positive mechanism — dual-timeframe momentum confluence (the paper-stage survivor, Sharpe ~1.99) — with a SLOWER confirm: a 4-HOUR primary momentum signal gated by a 1-WEEK macro-trend filter, taking a directional position only when both agree and standing flat on disagreement. This is the evidence-forced final variant of an exhaustive ~25-hypothesis search in which every other family died: alt directional (no edge on any alt), lead-lag transfer (overfit), relative-momentum rotation (no robust edge on ETH/BTC, SOL/ETH), supplementary confirms (coverage/no-edge), reversion (fee_edge), breakout (overfit). The survivor's ports failed specifically on OVERFIT / OOS-collapse, and the diagnosis points at the DAILY confirm being fast enough to fit best-of-N noise. This variant swaps the daily confirm for a WEEKLY macro-trend filter: the weekly trend changes slowly (~52 states/year), acting as a robust regime gate that only permits 4H momentum trades ALIGNED with the dominant multi-week bull/bear regime — a construction designed to generalize out-of-sample (macro regime is the most persistent, least-noisy signal in crypto) rather than curve-fit. It trades the one instrument (BTC) and one mechanism (momentum confluence) with demonstrated edge, changing only the confirm HORIZON to a slower, more-robust one — distinct from my pending 4H+1D (survivor), 1H+4H (fast), and 1H+4H+1D (triple) configs. Pure OHLCV (the only reliably measurable, coverage-complete data), single-instrument, standard incremental indicators (developer-safe), and DELIBERATELY 2-PARAMETER to minimize overfit. It fills the under-target LONG-SHORT bucket (13.6% vs 86.4% long-only).
Hypotheses
Iteration fix for the semantic auditor's finding, and nothing else. The hypothesis pre-registers a 1-WEEK macro-trend confirm and rests its entire generalization argument on that horizon ('~52 states/year'); the previous file locked MACRO_WEEKS = 4 (168 4H bars = 28 days), a monthly filter with ~13 states/year, so the executed code was a 4x slower horizon than declared. The single change is MACRO_WEEKS 4 -> 1 (MACRO_BARS = 42), plus the derived figures in the comments (horizon ratio 14x -> 3.5x, history requirement ~170 -> ~44 bars) so the documentation matches what runs. Everything that already passed the earlier verification layers is untouched: same imports and class structure (Layer 1), same continuous three-branch signal returned every bar in natural sigma units (Layer 2), same entry-cross/exit/sizing logic that produced trades in the sandbox (Layer 3), same locked constants and same 2-parameter _param_bounds surface. Venue remains BINANCE USD-M futures because the strategy takes short setups; leverage stays 1.0 and no sizing path reads it. Note that a 1-week confirm flips state ~4x more often than the 4-week one, so the gate opens/closes more frequently and trade count should rise; all prior performance figures for this file describe the 4-week variant and do not carry over -- this is the first measurement of the hypothesis as written.
Hypotheses
Overfit / no-generalization death (NOT fee-edge — per-trade return 3.42% clears the floor). Three HARD gates fail and cannot be waived: walk-forward is_overfitted=TRUE (avg IS Sharpe 3.999 -> avg OOS -1.120 with windows +0.29/+4.15/-7.80), out-of-sample Sharpe -1.120 <= 0, and the holdout has only 1 trade. Optimization made the strategy WORSE, not better (Sharpe 0.93 -> 0.43, PF unchanged in kind but the config collapsed 154 default-param trades into 7 over 6 years by pushing entry_thresh to 2.19 / mom_lookback to 28) — a curve-fit to a handful of clean windows, the textbook sign the default backtest was fitting a favorable path rather than a real edge. Robustness confirms noise: deflated_sharpe 0.0, is_significant=false, Sharpe CI [-0.359, 1.060] straddles zero, and it fails programme-level FDR (keeps 3 of 236, candidate_p 1.0). Per the overfit-vs-dead-premise rule, high-IS/OOS-collapse is ABANDON not revise: reframing the same momentum-confluence mechanism onto another horizon just overfits again — and it already has, dying 0-for-N across BTC faster-horizon (1H+4H, overfit), BTC triple-TF (1H+4H+1D, overfit), and now this weekly-macro variant, while only the original BTC 4H+1D configuration survived (idiosyncratic to that horizon). This is optimization attempt 2 of 2 with no untried robust parameter region (sensitivity maxes ~0.9 Sharpe everywhere), and the code's own pre-committed abandon condition applies. Failure pattern: overfit / no-generalization.
Implementation
Long/short single-instrument momentum on BTCUSDT.BINANCE USD-M perpetual, 4-HOUR bars. A fast 4H momentum reading (close-to-close change over mom_lookback bars, normalised to random-walk sigma by ATR*sqrt(n)) is gated by a 1-WEEK macro-trend confirm measured on the same 4H series (42 bars = 7 days x 6). Risk is taken only when both legs point the same way and the weekly leg clears a modest directional floor (0.25 x entry_thresh); otherwise the signal is clipped strictly below the exit level so the strategy stands flat and regime bookkeeping alone can never fire an exit. Entries are fresh CROSSES of +/- entry_thresh (long or short). Exits are structural and untuned: an adverse gate-open signal at -0.5 x entry_thresh (hysteresis), or a 3-ATR trailing stop from the best close since entry. Sizing is risk-first: equity * 2% / (3 * ATR), capped at 1x equity notional, floored at BTC's 0.001 step and $100 min notional; leverage 1.0. Exactly two tunable parameters (mom_lookback, entry_thresh) with declared bounds; every other quantity is a module-level constant invisible to the optimizer.
Verification Results
If strict 'flat on disagreement' is intended, add an explicit exit when the gate transitions to the disagree state; otherwise document that disagreement suppresses new entries but existing positions ride the structural exits.
Verification Results
The hypothesis says 'flat on disagreement', but the code only stands flat on ENTRY when the macro/fast legs disagree (the weak/disagree branches clip the signal below the entry threshold so no new position opens). An EXISTING position is not force-closed on regime disagreement — it can only exit via the gate-open adverse-signal level (-0.5*entry_thresh) or the 3-ATR trailing stop, so a held position can persist through a period of disagreement until the trailing stop hits. This is a reasonable design (avoids churning on brief regime flickers) and matches the entry-gate intent, so it is informational rather than a mismatch worth failing.
Verification Results
Edge is concentrated almost entirely in the calm-vol tercile (Sharpe 2.11, +159% of the total) while normal and stressed terciles are near-flat (Sharpe 0.24/0.27, +5.9%/+7.5%), and information ratio vs buy-hold is -0.50 with beta only 0.08. The mechanism may only work in low-vol trend regimes; the full backtest / walk-forward should confirm whether the weekly-confirm generalizes across regimes rather than the calm-period concentration being an artifact. This is advisory context for the analyst, not a block.
Backtest Review
L82 proven-positive family: dual-timeframe momentum confluence on BTC Binance USD-M perp — the ONLY mechanism/venue that has ever produced a factory promotion. Do not blanket-abandon at review.
Backtest Review
Strong per-trade economics well clear of costs: avg_trade_return_pct 1.377% (~9x the 0.15% USD-M fee floor), PF 1.379, commissions only 2.95% of gross — not fee-fragile.
Backtest Review
Positive risk-adjusted edge: Sharpe 0.933 with bootstrap CI [0.173, 1.649] not straddling zero, PSR 0.962, Sortino 1.25, DD 20.5% (well under the review guard).
Backtest Review
Adequate, well-behaved sample for optimization: 154 trades over 6.7 years, balanced 82 long / 72 short — matches the long-short, flat-on-disagreement mechanism the hypothesis describes.
Backtest Review
This iteration corrects a genuine code<->hypothesis defect (macro confirm was locked at 4 weeks/monthly; now 1 week as pre-registered), and the trade count rose as predicted — a legitimate re-measurement, not thrashing.
Backtest Review
Edge is concentrated in the calm-vol tercile (Sharpe 1.94, +144%) while normal (0.65) and stressed (0.05, -1.6%) terciles are near-flat — QA's advisory concern that the weekly confirm may only work in low-vol trend regimes. Walk-forward/holdout must confirm cross-regime generalization.
Backtest Review
Negative information ratio vs buy-hold (-0.58) with low beta (0.07) and losing years in 2022 (-4.3%) and 2025 (-11.0%).
Backtest Review
Prior analyzing verdict was a boundary PBO 0.5013 miss; the developer's pre-committed abandon condition (PBO >= 0.5 after the corrected horizon, or sub-floor per-trade edge -> abandon, no further re-horizoning) must be enforced at the ANALYZING stage.
Analysis
Belongs to the L82 proven-positive dual-timeframe momentum-confluence family on BTC Binance USD-M — the only mechanism/venue that has ever produced a factory promotion
Analysis
Per-trade economics clear the fee floor (default-config avg_trade_return_pct 1.377%, optimized 3.42%); this is NOT a fee-edge death
Analysis
Sensitivity phase passed (no y-axis cliff on mom_lookback; entry_thresh flagged as the single cliff)
Analysis
Walk-forward flags is_overfitted=TRUE: avg IS Sharpe 3.999 collapses to avg OOS -1.120, with the three OOS windows wildly inconsistent (+0.29, +4.15, -7.80) — the edge is fit to specific windows, not a stable mechanism (HARD gate, unwaivable)
Analysis
Out-of-sample Sharpe -1.120 <= 0 (HARD gate, unwaivable)
Analysis
Holdout has only 1 trade — uninferable; the optimizer drove entry_thresh to 2.19 / mom_lookback to 28, collapsing 154 default-config trades into 7 over 6 years, a curve-fit to a handful of clean windows (HARD gate, unwaivable)
Analysis
Robustness decisive: deflated_sharpe 0.0, is_significant=false, Sharpe CI [-0.359, 1.060] straddles zero, PBO 0.4921, and it does not survive programme-level FDR (keeps 3 of 236, candidate_p 1.0)
Analysis
Optimization actively DEGRADED the strategy (Sharpe 0.93 -> 0.43, 154 -> 7 trades) — the classic sign the default backtest was riding a favorable path, not a real edge
Analysis
Loses in the stressed-vol tercile in both configs (optimized stressed Sharpe -0.647, return -5.4%) — no edge in the regime the macro gate is meant to exploit
Analysis
This is optimization attempt 2 of 2 (iteration limit); the prior iteration's PBO-boundary fix did not hold and there is no untried robust parameter region — the sensitivity grid maxes at ~0.9 Sharpe everywhere
Analysis
Code↔hypothesis misalignment found by the semantic auditor — the code does NOT implement the hypothesis. Re-code the strategy to implement the hypothesis EXACTLY (instrument, timeframe, direction, the named edge/mechanic, sizing). Concrete issues: Macro-confirm horizon mismatch: the hypothesis names a 1-WEEK macro-trend confirm in its title ('4H Primary Momentum + 1-WEEK Macro-Trend Confirm') and body ('gated by a 1-WEEK macro-trend filter... the weekly trend changes slowly (~52 states/year)'), and that ~52-state/year slowness is the hypothesis's core generalization argument. The implementation (src/strategies/generated/BtcMacroConfirmedMomentumLS_v4.py:113-114) locks MACRO_WEEKS = 4, so MACRO_BARS = 4 * 42 = 168 four-hour bars = 28 days — a 4-week/monthly regime filter with ~13 possible state changes/year, a 4x slower horizon than declared. The mismatch is confirmed by the code's own comments ('The horizons differ by ~14x' = 168/12, whereas a 1-week confirm would be 42/12 = 3.5x) and by the config description, which correctly says 'gated by a 4-week macro-trend filter' while the file's own header line still mislabels it '1-WEEK macro gate'. The pre-registered horizon and its quantified robustness claim therefore do not describe what is executed.
Analysis
Benjamini-Hochberg at q=0.10 over 236 programme candidates keeps 3. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Iteration History
Verification failed (Layer 4 — QA review):
- UNMEASURABLE SAMPLE AND NET-NEGATIVE IN-SAMPLE -- a slower confirm makes the strategy MORE selective, not less, so the trigger rate collapses exactly as on the other more-selective siblings. Sandbox produced 9 trades over 363 days (~9/year -> ~45-55 over a multi-year span, below the ~100 measurability floor, L16), the same death as the 1H+4H dual (9 trades) and the triple iter1 (12 trades). The developer modeled ~25-45/year; a 4-week macro gate removes more of the fast leg's crosses than the daily confirm did, so it landed at 9. Worse, the little sample there is is NET-NEGATIVE before OOS is even considered: avg_trade_return_pct -1.098% (below AND on the wrong side of the 0.15% fee floor), profit_factor 0.898, total_return -0.98%, Sharpe -0.062 (CI [-1.81, 1.41]), win_rate 0.333, short_win_rate 0.25 on 8 of 9 trades short; the only positive contribution is a single $6,685 win (return_skew 1.16, return_kurtosis 29.8) against a net loss. The hypothesis's premise -- that a weekly gate generalizes better OOS than the daily confirm that overfit -- cannot even be tested at n=9, and the in-sample sign is already wrong.
Iteration History
Verification failed (Layer 4 — QA review):
- THE GATE FIX WAS CORRECT AND PRODUCED A MEASURABLE SAMPLE, WHICH IS NET-NEGATIVE WITH ZERO GROSS EDGE -- the developer's own pre-committed abandon condition. Iteration 1 wrongly used a signed-minimum that imposed the full entry threshold on the macro leg (a ~10% four-week move), collapsing the count to 9; iteration 2 correctly restores the hypothesis's construction -- the macro leg is a directional FLOOR gate (0.25 x entry_thresh) and, when the regime is aligned and present, the signal IS the fast leg. That fix is right and lifted the count to 22 trades over 363 days (~110-130 over a multi-year span, now roughly measurable). But the enlarged sample has no edge: avg_trade_return_pct -0.0137% (essentially zero gross, on the wrong side of the 0.15% fee floor), profit_factor 0.865, total_return -3.96%, Sharpe -0.211 (CI [-2.02, 1.22]), win_rate 0.273. The reward:risk is favorable (avg_win $4,223 vs avg_loss $1,831, ~2.3x) but the 27% hit rate cannot carry it -- expected value ~= 0.273 x 4223 - 0.727 x 1831 ~= -$178/trade. Unlike the triple iter2 (PF 1.28, one-outlier-positive and now pending OOS), this is net-negative on the measurable sample, so there is no positive edge to carry to a robustness test.
Iteration History
Verification failed (Layer 4 — QA review):
- CONFIRMED NEGATIVE EDGE ON A MEASURABLE SAMPLE -- the developer's own pre-committed abandon condition, now re-confirmed by an immaterial defect fix. The iteration-3 change was a legitimate first-principles fix (the weak-regime and disagreement branches were clipped at exactly 0.5 x entry_thresh = the exit level, so losing the regime could fire the exit on bookkeeping rather than price; they now clip at 0.9 x exit_level, strictly below it, so only the gate-open/adverse-price branch can trigger the signal exit). But it did NOT change the outcome: 22 trades, total_return -4.18% (was -3.96%), profit_factor 0.858 (was 0.865), win_rate 0.273 (unchanged), avg_trade_return_pct -0.033% (below and on the wrong side of the fee floor), Sharpe -0.224 (CI [-2.03, 1.21]), expectancy -$190/trade. Per the developer's own falsification test (exits_signal vs exits_trail), the fix being immaterial means the exits were dominated by the trailing stop / adverse price, not the regime hair-trigger -- so the negative verdict stands entirely on the mechanism's own terms: the 4H momentum edge, once gated by the weekly macro filter, does not exist net of costs. The favourable 2.3x reward:risk (avg_win $4,218 vs avg_loss $1,843) cannot be realised because the 27.3% hit rate is below the ~30.3% it needs to break even.
Backtest and paper results are hypothetical. Trading involves risk of loss.