Skip to content

View translation

BtcSolLeadLagCatchUpMomentumLS

Hypotheses

BTC→SOL Intraday Lead-Lag Catch-Up Momentum, Long-Short (Two-Instrument BINANCE USD-M Perps, 15m Bars OHLCV-Only, Trade SOL in the Direction of a Significant Volatility-Normalized BTC Impulse When SOL Has NOT Yet Re-Priced Its Beta-Expected Move, Exit on Catch-Up / Time / ATR Stop, 3-Parameter)

Hypotheses

A LONG-SHORT, two-instrument intraday LEAD-LAG momentum on Binance USD-M perps: BTCUSDT.BINANCE is the information LEADER (signal source only, never traded) and SOLUSDT.BINANCE is the FOLLOWER we trade. This is NOT cross-sectional rank-and-rotate (L32 exhausted class), NOT ratio mean-reversion (ETH/BTC fade died 'other'), NOT funding/options/liquidations (all dead), and NOT single-name VWAP/Keltner reversion (saturated). The mechanism is crypto-native microstructure: BTC leads the market's information flow, and higher-beta L1 alts re-price the same macro impulse with a lag due to fragmented liquidity and slower participant attention. When BTC makes a large volatility-normalized move over a short window but SOL has captured only a fraction of its beta-expected co-move, we enter SOL in BTC's direction and harvest the catch-up. OHLCV-only on two liquid majors (both have full multi-year catalog history — no data_unavailable risk; no_supplementary_data is the best-surviving tag family at 4%). Deliberately routed to fill three under-represented buckets at once: pairs scope (13.6%), long_short direction (13.8%), and short_1m_15m horizon (8.8%). Only 3 parameters (BTC impulse z-threshold, catch-up ratio, max-hold bars) to resist the 248 overfit deaths; beta is estimated on a rolling window, not tuned.

Hypotheses

Iteration 3 targets each of the three Layer-4 QA defects with focused changes; the signal computation (rolling beta, BTC impulse z, vol-normalized residual) and clean imports are unchanged so Layers 1-3 stay green (verified locally: static + all six synthetic scenarios pass). (1) Account liquidation / leverage death-spiral: leverage dropped 3.0->1.0 and gross exposure hard-capped at gross_cap=0.5 x equity notional (max_notional = equity*min(leverage,gross_cap)); the ATR used for sizing is now FLOORED at min_atr_frac (0.4%) of price, which removes the low-vol size explosion that was hitting the notional cap and ballooning fixed-notional positions as equity shrank; per-trade risk cut 2.0%->0.75%. With one position at a time capped at 0.5x equity and no leverage, an account wipe is no longer reachable. (2) Below-fee-floor edge and turnover 1123x: a fee-aware entry gate now requires the expected not-yet-captured move |residual| >= min_catchup_frac (0.4%, comfortably above the ~0.10% round-trip + impact), the BTC impulse threshold is raised (btc_z 1.5->2.0), the capture gate tightened (0.5->0.35), and a cooldown_bars=4 re-entry lock plus longer max_hold (12->16) cut churn and select for larger per-trade catch-up moves. (3) Drifting catch-up exit: the residual-through-zero exit (which crossed zero as BTC's sliding-window expected decayed, unrelated to SOL catching up) is REMOVED; exits are now purely snapshot-based (entry-time ATR TP/stop + time stop), so the target is fixed for the trade's life and premature/erratic exits are eliminated -- this also lets winners run to the 2.5-ATR TP instead of being banked tiny, addressing the inverted reward/risk. Leverage=1.0 so the leverage-set-but-unused gate does not apply.

Hypotheses

Negative edge in every regime across a decisive sample. The BTC->SOL lead-lag catch-up strategy loses in all 7 years (2020 -27.4%, 2021 -32.3%, 2022 -21.1%, 2023 -44.9%, 2024 -34.3%, 2025 -37.6%, 2026 -38.0%), ending at total_return -95.3% with max_drawdown 95.3% (CI 74.9%-100%) — past the >50% hard-abandon line. Across 803 trades: profit_factor 0.55, Sharpe -0.95 with CI [-1.89, -0.44] entirely below zero, Sortino -0.65, PSR 0.0, avg_trade_return_pct -0.35% (negative, below fee floor), expectancy -$117.78/trade. The catch-up thesis is falsified on its own numbers: avg_win $350 is smaller than avg_loss $444 (inverted reward:risk) at a 41% win rate — SOL has already re-priced BTC's impulse by the time the 4-bar z-threshold fires, so the strategy chases exhausted moves. This is the OHLCV-only momentum/lead-lag class with zero survivors; tuning btc_z/catch_up_ratio/max_hold_bars cannot flip a negative expectancy that holds in every year, and lead-lag catch-up on liquid majors is a well-mined, structurally dead idea, so neither iterate nor revise_hypothesis applies.

Implementation

Two-instrument intraday BTC->SOL lead-lag catch-up momentum on Binance USD-M perps (15m bars, OHLCV-only, long-short). BTCUSDT.BINANCE is the leader (signal only, never traded); SOLUSDT.BINANCE is the follower traded. Each bar it aligns SOL/BTC closes by timestamp, estimates SOL's rolling beta to BTC over vol_lookback bars, and measures BTC's L-bar volatility-normalized impulse (z_btc). The continuous signal is the vol-normalized beta residual = (beta*btc_ret - sol_ret)/sigma_sol. Entry: |z_btc| > btc_z AND SOL captured less than catch_up_ratio of its beta-expected co-move AND the not-yet-captured move |residual| exceeds min_catchup_frac (fee-aware), with a re-entry cooldown -> trade SOL in BTC's direction. Exits are snapshot-based only: a fixed ATR take-profit / ATR stop (from the entry-time ATR) or a time stop. Sizing risks risk_per_trade of equity at the ATR stop (ATR floored so low-vol windows can't explode size), hard-capped at gross_cap x equity notional; leverage=1 (no margin).

Verification Results

Verification failed (Layer 4 — QA review): - The strategy LIQUIDATED the account in the sandbox: total_return -100%, max_drawdown 100%, liquidated=true (2026-05-10), Sharpe -2.52 with CI [-6.59, -2.12] (magnitude > 5 => code/risk-defect territory), profit_factor 0.44, return_skew -14.2, kurtosis 217. avg_position_pct 1743% is far above the intended 3x (300%) leverage cap — the signature of a leverage death-spiral: risk-based sizing hits the max_notional=equity*leverage=3x cap in low-vol windows, and as losses accrue the fixed-notional positions balloon relative to shrinking equity until liquidation. An account-wiping strategy cannot pass; 3x leverage + 2% per-trade risk on a high-turnover 15m book is not survivable and there is no aggregate exposure guard. - Edge is below the fee floor and net-negative. avg_trade_return_pct 0.069% is under the 0.15% futures floor and the ~0.10% round-trip, over 353 trades. Turnover 1123x, total_impact_usd $83,527 — the intraday lead-lag signal produces no gross move that clears commissions + impact at this churn. Realized reward/risk is inverted (avg_loss $1191 ≈ 2.1x avg_win $564) despite the 'roughly symmetric' 2.0-ATR stop / 2.5-ATR TP: time-stop and catch-up exits bank small winners while stop-outs/gaps produce the large losers. - The catch-up exit references the current-bar residual, but expected = beta*btc_ret is recomputed each bar over a sliding L-window, so the exit target drifts as BTC's rolling impulse decays and the residual crosses zero for reasons unrelated to SOL catching up — causing premature/erratic exits.

Verification Results

Analyst to evaluate at backtest_review. Entry gate is structurally fee-aware (min_catchup_frac 0.4% > 0.15% floor), but negative per-trade expectancy plus long/short asymmetry (long_win_rate 0.25 vs short_win_rate 0.50) suggests the continuation bet behaves like a reversion in-sample; unlikely fixable by tuning 3 parameters.

Verification Results

Sandbox backtest is a clear net loser over a measurable 66-trade / 363-day sample: total_return -13.7%, Sharpe -2.24 (CI [-3.76, -0.81] entirely below zero), profit_factor 0.44, avg_trade_return_pct -0.329% (negative, below the fee floor), win_rate 0.36. This does NOT carry a code-defect signature (win_rate is not 0.0, |Sharpe| < 5, profit_factor != 0.0), so it is a genuine realized-edge failure rather than a polarity/sizing/exit bug. The code correctly implements the hypothesis; the lead-lag catch-up simply does not produce positive expectancy in-sample. Flagged for the analyst at backtest_review, not a QA correctness block.

Verification Results

Optional: add a lower bound (e.g. captured > -catch_up_ratio) if the intent is 'SOL lagging in the same direction' only. Acceptable as-is per the stated hypothesis.

Verification Results

The catch-up gate `self._captured >= self.catch_up_ratio -> None` also admits large-NEGATIVE captured values (SOL moved opposite to BTC), turning those bars into unbounded-divergence entries. This is directionally consistent with a catch-up bet and matches hypothesis intent, so not a defect — noted for confirmation that the intended breadth includes opposite-direction divergence, not only mild under-capture.

Backtest Review

Clean two-instrument construction with BTC as signal-only, 803 trades (decisive sample), OHLCV-only with full catalog history (no data risk)

Backtest Review

Trades match the hypothesized mechanism (SOL-only, long+short, ~3h holds) — so the negative result is a real verdict on the premise, not a bug

Backtest Review

Loses in EVERY year 2020-2026 (-21% to -45% annually); total_return -95.3%, max_drawdown 95.3% (CI to 100%) — past the hard-abandon line

Backtest Review

profit_factor 0.55, Sharpe -0.95 (CI [-1.89, -0.44] fully negative), Sortino -0.65, PSR 0.0 — no statistical edge

Backtest Review

avg_trade_return_pct -0.35% (negative, below fee floor), expectancy -$117.78/trade; inverted reward:risk (avg_win $350 < avg_loss $444) at 41% win rate

Backtest Review

OHLCV-only lead-lag/momentum class with zero survivors; SOL re-prices BTC's impulse too fast to harvest — chases exhausted moves

Outcome Summary

BtcSolLeadLagCatchUpMomentumLS bet on a crypto-native microstructure edge: BTC leads information flow and higher-beta SOL re-prices the same macro impulse with a lag, so it entered SOL in BTC's direction whenever SOL had under-captured its beta-expected co-move. The trades matched the design (SOL-only, long and short, ~3h holds) but the result was a clean verdict on the premise, not a bug — it lost in all seven years, ending -95.3% with a 95.3% drawdown, Sharpe -0.95, profit factor 0.55, and negative per-trade expectancy driven by an inverted avg_win $350 < avg_loss $444 at a 41% win rate. The analyst abandoned it at the backtest-review gate, concluding SOL re-prices BTC's move too fast to harvest and that tuning the three parameters could not flip an expectancy negative in every regime, so it never reached optimization, risk review, or paper trading.

Outcome Summary

On liquid majors the lead-lag catch-up is too fast to harvest — SOL has already re-priced BTC's impulse by the time a multi-bar z-threshold fires, so the strategy chases exhausted moves; a well-mined microstructure premise can be structurally dead rather than merely mistuned.

Outcome Summary

It was abandoned at the pre-optimization backtest-review gate: the edge was negative and statistically significant in the wrong direction across every regime, breaching the >50% drawdown hard-abandon line, so optimization and all later stages were never reached.

Outcome Summary

A long-short, two-instrument intraday lead-lag momentum on Binance USD-M perps that used BTC as a signal-only leader and traded SOL in the direction of a significant volatility-normalized BTC impulse whenever SOL had captured only a fraction of its rolling-beta-expected co-move, exiting on catch-up, an ATR stop/take-profit, or a time stop with three tuned parameters.

Outcome Summary

Over a decisive 803-trade sample it lost money in every year from 2020 to 2026, ending at -95.3% total return with a 95.3% max drawdown (CI to 100%), Sharpe -0.95 (CI [-1.89, -0.44] fully negative), profit factor 0.55, and probabilistic Sharpe 0.0. Per-trade expectancy was -$117.78 (avg_trade_return_pct -0.35%, below the fee floor) with an inverted reward:risk of avg_win $350 versus avg_loss $444 at a 41% win rate.

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['btc_z', 'beta_max', 'beta_min', 'lookback', 'atr_period', 'atr_tp_mult', 'min_notional', 'vol_lookback', 'atr_stop_mult', 'max_hold_bars', 'catch_up_ratio', 'risk_per_trade'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000) - zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000) - price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735695840000)
Strategy report

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