Skip to content

View translation

BnbBinanceDualTimeframeMomentumConfluenceLS

Hypotheses

BNB Binance USD-M Dual-Timeframe Momentum Confluence — Long-Short 4H Trend Aligned with the Daily Trend, Flat on Disagreement, ATR Trailing Exit (Low-Kurtosis Asset Selection, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument, pure-price MOMENTUM-CONFLUENCE trend follower on BNBUSDT.BINANCE (USD-M perpetual), 4H primary + 1D trend confirm. This is a deliberate, evidence-driven ASSET selection, not another re-skin. Across my recent proposals the proven confluence mechanism (paper-stage BTC dual-TF, Sharpe 1.99) has repeatedly produced genuinely GOOD, DISTRIBUTED, decorrelated-alpha edge (LINK-HL positive every year, AVAX-HL PF 1.57 / +42.4% 2025) yet died for TWO specific, documented reasons: (a) on Hyperliquid the ~2.3y history was too short to clear the bootstrap-CI / deflated-Sharpe significance gate ('unestablished edge, wrong venue/data'); and (b) higher-beta alts carry fat right tails that push return_kurtosis up and let the deflated-Sharpe / outlier checks flag the result. BNB is chosen to attack BOTH at once: it has ~5–6 years of Binance USD-M history (ample sample for the significance gate the HL ports failed), and it is the SMOOTHEST-trending liquid major — an exchange-token whose trends grind rather than spike, giving the LOWEST return-kurtosis of the liquid names, which is precisely the property that lets a distributed trend edge clear the deflated-Sharpe / outlier-mirage gates that killed the higher-kurtosis Donchian/alt variants. It keeps the proven confluence logic (align a 4H momentum read with the daily trend, flat on disagreement, trail winners) — NOT a breakout (dodges the L9/L41 outlier-mirage class), NOT a mean-reversion fade (L53), NOT a squeeze (L54), NOT a cross-sectional/per-name-ensemble basket (L52), NOT a non-price-feed gate (L46), NOT options/COIN-M (L50/L51). Fills the long-short direction gap (13.7% vs an 86% long-only book) and adds a non-BTC/ETH name to the Binance book. Venue-quota note: Binance is over-represented, but my own trail proves this mechanism cannot be VALIDATED on short HL history — a survivor requires the long-history venue, so I prioritize survivability here. Risk profile: ~1.5% equity risk per trade via ATR stop; volatility-scaled sizing (notional = risk_budget / (atr_mult * ATR_4H)) with a per-trade notional cap (≤25% of equity*leverage); 2x leverage cap (reads self.config.leverage). Exactly 3 tunable parameters (slow/fast EMA ratio, daily-trend lookback, ATR trailing multiple); fast EMA fixed at the survivor's proven relative value to resist best-of-N overfit.

Hypotheses

Iteration 2 makes the ONE change the feedback asked for and nothing else: it collapses the optimizer's effective degrees of freedom from ~8 back to the hypothesis's declared 3. The trading logic, thresholds, bounds and defaults are byte-identical to iteration 1 -- I re-ran the full-sample replay of this exact class and got the identical 450 trades / +1.61% avg per trade / PF 2.01, so nothing that passed has regressed. HOW THE FIX WORKS (verified against the optimizer source, not assumed): WalkForwardOptimizer's objective and ParallelRunner both iterate every entry in `parameters` and call trial.suggest_int/suggest_float on any numeric value, using _param_bounds when declared and a mechanical x0.5-1.5 band otherwise -- which is exactly how fast_ema (12->7), atr_period (14->20), risk_pct (->0.0116) and max_notional_frac (->0.3675) got tuned in iteration 1. Both files skip any key whose name starts with an underscore (`if name.startswith("_"): params[name] = base_value`), and SensitivityAnalyzer.generate_variations does the same. So the four infra knobs are now passed as _fast_ema=12, _atr_period=14, _risk_pct=0.015, _max_notional_frac=0.25 and are read from those keys in __init__ with unchanged defaults; min_notional was dropped from the config entirely (the base class already defaults it to 5.0, the correct BNB value) so it cannot be searched either. I verified programmatically that the searchable set is now exactly ['ema_ratio', 'daily_lookback', 'trail_atr_mult'] with _declared_bounds returning {ema_ratio: (2.0,4.0), daily_lookback: (10,30), trail_atr_mult: (2.0,4.0)} -- the declared bounds are kept as instructed, and the strategy still resolves fast=12 / slow=36 / atr=14 / risk=0.015 / cap=0.25 at runtime. Layers 1-3 re-verified locally: static analysis clean, all six synthetic scenarios pass with a continuous varying signal, and the real 365-day sandbox runs 128 trades, +19.97%, Sharpe 0.98, PF 1.59, avg 0.878% per trade, zero min-notional drops. With three dimensions instead of eight, Optuna's 75 trials per window now cover the space far more densely per dimension, which is the textbook PBO reducer and should also lift the holdout ratio by cutting best-of-N selection noise; if PBO still exceeds 0.5 or the holdout ratio stays below 0.70 on this honest 3-parameter surface, I agree with the Analyst that the edge does not survive OOS selection on BNB and should be abandoned rather than iterated again.

Hypotheses

Triggers my pre-registered iteration-1 stopping rule. The developer applied the prescribed fix correctly — the walk-forward search is now genuinely constrained to the 3 declared tunables (best_params confirms only ema_ratio/daily_lookback/trail_atr_mult moved; the rest stayed pinned via underscore-prefix), and sensitivity is clean (0 cliffs). But cutting the effective DOF from ~8 to 3 did NOT fix the two hard gates: PBO is still 0.5238 (was 0.5331 — essentially unchanged, still > 0.5) and the holdout ratio is still 0.612 (was 0.627 — slightly worse, still < 0.70; holdout Sharpe 1.275 vs WF-OOS 2.08). Both are code-enforced unwaivable hard fails, so promote is impossible, and this is the terminal optimization attempt (2 of 2). My iteration-1 verdict pre-registered exactly this: 'if attempt 2 still shows PBO > 0.5 OR holdout ratio < 0.70 after constraining to 3 params, the edge does not survive honest OOS selection on this asset and should be abandoned.' Both conditions still fail. A PBO still above 0.5 with a minimal 3-param surface means the walk-forward selection is more-likely-than-not overfit ON BNB specifically — the strong optimized backtest (Sharpe 1.29, PF 2.33, DD 7.5%) is the best-of-N artifact the PBO/holdout gates exist to catch. This is a cleaner abandon than the ADA sibling: ADA cleared PBO (0.48) and DSR (1.0) and failed only holdout (a near-miss), whereas BNB fails BOTH PBO and holdout even after the fix. There is no honest lever left (the DOF constraint is done and didn't move the gates). The low-kurtosis-asset thesis was reasonable and the mechanism is the paper survivor's, but the BNB instance does not clear multiple-testing/holdout robustness. Abandon.

Implementation

Long-short, single-instrument momentum-confluence trend follower on BNBUSDT.BINANCE USD-M perpetual, 4H primary bars with a 1-DAY trend confirm. Fast leg = (EMA12 - EMA36)/ATR14 on the 4H series, returned every bar as a continuous volatility-scaled read; slow leg = sign of the 20-day daily return, consumed from real BNBUSDT 1-DAY bars via on_extra_bar. LONG only when both point up, SHORT only when both point down, FLAT on disagreement. Exits on a 3x-ATR trailing stop from the best close since entry, on the daily trend flipping, or on the 4H read flipping. Sizing risks ~1.5% of equity at the trailing-stop distance, capped at 25% of equity x 2x leverage. EXACTLY three optimizer-visible tunables: ema_ratio, daily_lookback, trail_atr_mult -- every other knob is passed under an underscore-prefixed key that the optimizer and sensitivity analyzer skip.

Verification Results

Optimizer/analyst: confirm the searchable set is exactly {ema_ratio, daily_lookback, trail_atr_mult} in the actual run and enforce PBO<=0.5 and holdout>=0.70; abandon if either still fails, per the developer's own statement.

Verification Results

Iteration-2 overfit fix must be re-confirmed by the optimizer/analyst, not QA. The change collapses the optimizer's searchable DOF from ~8 to the hypothesis's declared 3 by moving fast_ema/atr_period/risk_pct/max_notional_frac to underscore-prefixed keys (_fast_ema etc.) that the developer states the WalkForwardOptimizer and SensitivityAnalyzer skip. I verified the strategy side: the p.get keys in __init__ exactly match the config keys, so they resolve to fast=12/slow=36/atr=14/risk=0.015/cap=0.25, and _param_bounds declares only the 3 tunables. Whether the optimizer actually skips underscore keys is infra behaviour outside the strategy code and QA's remit — if wrong, the DOF reduction wouldn't take effect, though the strategy still runs correctly. Iteration-1 failed PBO 0.5503 / holdout 0.63; whether the 3-DOF surface now clears PBO<=0.5 and holdout>=0.70 is the optimizer/analyst's call.

Verification Results

For live deployment, persist _side/_extreme/_entry_atr or reconstruct from cache.positions_open() rather than from the current signal.

Verification Results

should_exit() infers _side from the live signal sign on restart (_side==0). Unreachable in backtest; only a live mid-position crash-restart risk. (The ORB sibling upgraded this to read cache.positions_open(); the same upgrade would harden this for live use.)

Backtest Review

Iteration-1 fix implemented as prescribed: fast_ema/atr_period/risk_pct/max_notional_frac moved to underscore-prefixed keys the optimizer & sensitivity analyzer skip, pinning the search to the 3 declared tunables (DOF 8 -> 3) — the direct PBO reducer

Backtest Review

Base backtest unchanged and strong: Sharpe 0.966 with CI-low 0.3585 > 0, PSR 0.9986, PF 1.82, max_drawdown 10.0%, avg_trade_return_pct 1.59%, 453 trades

Backtest Review

Positive EVERY year 2020-2026 including the 2022 bear (+28.4%); return_kurtosis 10.2 (low-kurtosis-asset thesis held) — distributed edge; cleared deflated Sharpe 0.9521 in prior optimization

Backtest Review

Trading logic and base result are identical to iteration 1 — the fix is entirely in the optimizer search surface, so its success is only provable in the re-optimization (PBO/holdout must actually clear)

Backtest Review

Prior optimization failed PBO 0.53 and holdout ratio 0.627; if the underscore-skip does not actually constrain Optuna, those hard fails will recur

Backtest Review

Single-config Sharpe 0.97 will likely optimize to ~1.3-1.4, under the 1.5 soft floor (waivable only if both hard gates clear)

Analysis

Prescribed fix applied correctly: search constrained to the 3 declared tunables (best_params confirms only ema_ratio/daily_lookback/trail_atr_mult moved); 0 sensitivity cliffs, tight 1.40-1.66 grid

Analysis

Deflated Sharpe clears (0.9526), sharpe_ci_low 0.6985 > 0, PF 2.33, max_drawdown 7.5%, avg_trade_return_pct 2.05%, positive most years

Analysis

PBO 0.5238 STILL > 0.5 after cutting DOF to 3 (was 0.5331) — walk-forward selection is more-likely-than-not overfit on this asset even at minimal DOF

Analysis

Holdout ratio 0.612 STILL < 0.70 (was 0.627, slightly worse): holdout Sharpe 1.275 vs WF-OOS 2.08

Analysis

Both are UNWAIVABLE hard gates -> promote impossible; and this is the terminal optimization attempt (2 of 2)

Analysis

Fails BOTH PBO and holdout (unlike the ADA sibling which cleared PBO+DSR and failed only holdout) — a clearer robustness failure; recent regime softening (rolling_sharpe negative late July 2026)

Analysis

Do NOT change the signal logic — the mechanism is sound. The two hard fails (PBO 0.5331 > 0.5, holdout ratio 0.627 < 0.70) are driven by the optimizer expanding the search to ~8 params, contradicting the hypothesis's declared minimal 3-param surface. best_params shows fast_ema 12->7, atr_period 14->20, risk_pct->0.0116, max_notional_frac->0.3675 were all tuned, plus ema_ratio (3.99) and trail_atr_mult (3.93) railed to their upper bounds. FIX: restrict the walk-forward search to ONLY the 3 declared tunables (ema_ratio, daily_lookback, trail_atr_mult) and PIN the rest at hypothesis defaults for the optimizer (fast_ema=12, atr_period=14, risk_pct=0.015, max_notional_frac=0.25, min_notional=5.0). Cutting effective DOF from ~8 to 3 is the textbook PBO reducer and should also lift the holdout ratio (less best-of-N fit to the search). Keep the declared bounds. Expectation: Sharpe will likely land ~1.3-1.4 (still under the 1.5 soft floor), but that floor is waivable if attempt 2 clears BOTH hard gates (PBO < 0.5 AND holdout ratio >= 0.70), given PF 2.38 / DD 4.9% / DSR 0.95 / positive-every-year. The evidence the edge is real, not curve-fit: zero sensitivity cliffs with a tight 1.45-1.66 grid, DSR 0.9521, and a distributed positive-every-year record. If attempt 2 still shows PBO > 0.5 or holdout ratio < 0.70 after constraining to 3 params, the edge does not survive honest OOS selection on this asset and should be abandoned. Detailed feedback written to workspace/discussions/13775061-1912-4126-8627-9dacba4d18ae/iteration_1_feedback.md.

Outcome Summary

BnbBinanceDualTimeframeMomentumConfluenceLS ported the factory's survivor mechanism to BNB, chosen deliberately as the smoothest-trending, lowest-kurtosis major to clear the significance and outlier gates that killed higher-beta and short-history siblings. The base backtest was strong and distributed (+385%, Sharpe 0.97, PF 1.82, kurtosis 10.2, positive every year), and a prescribed fix correctly constrained the optimizer's search to just 3 tunables. But the terminal optimization still failed both hard robustness gates — PBO 0.524 and holdout ratio 0.612 essentially unmoved by the DOF cut — meaning the strong optimized Sharpe of 1.29 was a best-of-N artifact. The analyst abandoned it at the ANALYZING stage per its pre-registered rule, a cleaner robustness failure than the ADA sibling (which failed only holdout); it reached optimization and analysis but not risk review or promotion.

Outcome Summary

Constraining degrees of freedom to reduce overfit only helps if the gates actually move — when PBO stays above 0.5 and the holdout fails even at a minimal 3-parameter surface, the strong optimized backtest is the best-of-N artifact those gates exist to catch, and the low-kurtosis-asset thesis cannot overcome an instance that fails multiple-testing robustness on that specific asset.

Outcome Summary

It earned an 'optimize' verdict and, on the terminal (second) attempt after a prescribed degrees-of-freedom fix that correctly pinned the search to 3 parameters, the analyst abandoned it at the ANALYZING stage on its pre-registered stopping rule: cutting DOF from ~8 to 3 did not move the two unwaivable hard gates — PBO stayed 0.524 and holdout ratio 0.612 — so promotion was impossible. A PBO above 0.5 even at minimal DOF means the walk-forward selection is more-likely-than-not overfit on BNB specifically.

Outcome Summary

A long-short, single-instrument dual-timeframe momentum-confluence trend follower on BNBUSDT.BINANCE USD-M (4H primary + 1D confirm, 3 parameters) that took a position only when the ATR-normalized 4H EMA spread agreed with the daily trend, went flat on disagreement, and trailed winners with an ATR stop — porting the factory's survivor mechanism to BNB, chosen as the smoothest-trending (lowest-kurtosis) liquid major to clear the significance/outlier gates.

Outcome Summary

The backtest (BNBUSDT.BINANCE 4H, 2368 data days) returned +385% with Sharpe 0.966 (CI-low 0.36), profit factor 1.82, max drawdown 10.0%, low kurtosis 10.2, positive every year including the 2022 bear (+28.4%). Optimization (constrained to the 3 tunables via underscore-skipped keys) cleared deflated Sharpe (0.9526) and lifted the config to Sharpe 1.29/PF 2.33/DD 7.5%, but both robustness gates failed: PBO 0.524 (>0.5) and holdout ratio 0.612 (<0.70, holdout Sharpe 1.275 vs WF-OOS 2.08).
Strategy report

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