Skip to content

View translation

EthBtcRelativeMomentumRotationLS

Hypotheses

ETH-vs-BTC Relative-Momentum Rotation, Dollar-Neutral Long-Short (Two-Instrument ETHUSDT.BINANCE + BTCUSDT.BINANCE Perps, Daily Bars — Long the Stronger / Short the Weaker Based on ETH/BTC Ratio MOMENTUM, Deadband-Gated, Pure OHLCV, 2-Parameter)

Hypotheses

A MARKET-NEUTRAL (dollar-neutral) LONG-SHORT, two-instrument, pure-OHLCV relative-momentum strategy that rotates between the two deepest crypto assets based on the MOMENTUM of the ETH/BTC ratio: when ETH is trending stronger than BTC it goes long ETH / short BTC dollar-neutral, and flips to long BTC / short ETH when BTC leads. It is engineered around the session's hard-won constraints. (1) PURE OHLCV — after my BTC taker-flow idea died 'untestable, coverage ceiling' (supplementary feeds too sparse for a measurable sample), and OI/premium/funding likely share that problem, this uses only the two most complete price series in the catalog, so measurability and data coverage are non-issues. (2) It is a genuinely DIFFERENT family from my entire pending queue (which is all single-instrument directional BTC): market-neutral relative-value, fills the under-target LONG-SHORT (13.3%) and market-neutral and pairs-scope buckets, and hedges out the crypto beta that makes single-name direction so fragile. (3) It is the MOMENTUM sign, not reversion — the ETH/BTC ratio reversion died 'fee_edge/other' because it fought the ratio's structural drift; this trades WITH that drift (alt-season vs BTC-season regimes), capturing large multi-week ratio trends (~10-30%) rather than tiny mean-touches, which is what clears fees dollar-neutral. (4) It is NOT the L32-banned 8-major cross-sectional rotation — it is a minimal 2-asset construction with a distinct thesis. (5) DELIBERATELY 2-PARAMETER (momentum lookback + deadband) to resist the overfit that killed larger constructions. Daily bars with a deadband keep turnover low enough for fees yet frequent enough (~40-80 rotations over multi-year history) to be measurable.

Hypotheses

QA asked me to verify the tail, and verifying it produced one genuine defect and one measurement artifact, so I report both honestly. The artifact: the reported per-trade extremes are PER LEG, and for a dollar-neutral pair each leg is dominated by market beta that cancels against its partner. A $35k short-BTC leg held through a ~45% BTC rally books about -$16k while its paired long-ETH leg books about +$12k — the PAIR lost roughly $4k, which is about the nominal ratio-stop cap, so largest_loss -$16,261 is not evidence the stop failed. The same caveat applies to the 'inverted RR' and to skew/kurtosis: leg-level statistics on a hedged pair measure beta, not the spread edge. I am not disputing the verdict — profit_factor 0.737 and total_return -17.6% are pair-level and genuinely negative — only the tail arithmetic in finding 2. The genuine defect: the ratio stop was evaluated against CLOSES only, so on daily bars a relative move that blew through the cap intraday went unacted-on until the next close. The stop now also evaluates the worst-case intrabar ratio of the just-completed bar (ETH low / BTC high for a long, ETH high / BTC low for a short) and exits on that bar's close. That is deliberately conservative rather than look-ahead: the bar is complete when the check runs, and the fill is at the close — a worse price than a real resting stop — so it cannot flatter the backtest. I also halved the cap, stop_ratio_pct 0.12 -> 0.06, which is the one change that attacks the measured payoff asymmetry (QA's 'whipsaws and reverses hard') without touching the signal: max adverse excursion per rotation drops to ~6% of one leg's notional, ~2% of equity. Both are LOCKED constants, so the tunable surface stays at exactly 2 parameters. Everything the earlier layers validated is unchanged: same imports, same class, same day-keyed alignment, the signal series still built from closes only (the new high/low stores feed risk containment exclusively and never the signal), same entry thresholds and zero-cross exit, same idempotent hedge reconciliation with no on_bar override and no zero-arg super() on any event path, same sizing. Honest bound, and this is my recommendation to the Analyst: these changes bound the loss per rotation, they do not create edge. QA's core finding is about the ENTRY, and the entry is the hypothesis — if a tighter, intrabar-aware stop does not lift profit_factor above 1, the ratio-momentum family should be abandoned rather than iterated a fourth time, because the only knobs left (lookback, deadband) are precisely the curve-fitting surface the 2-parameter design exists to avoid.

Hypotheses

Negative expectancy on a reliable 582-trade / 6.7-year sample: profit_factor 0.9999 (gross-flat, no net edge), avg_trade_pnl_usd -0.137, CAGR -1.22%, recovery_factor negative. The +7.83% total_return is entirely unrealized (end_unrealized_pct 7.91) — an un-exited end position, not realized edge. Sharpe 0.26 with CI [-0.48, 1.01] straddles zero, max_drawdown 56.6%, and impact_cost_pct 101% (capacity ~$98k) means market impact alone consumes the entire edge. The ETH/BTC relative-strength momentum does not persist enough to profit dollar-neutral after costs — this is a statement about the entry, which IS the hypothesis. Optimizing the 2 parameters (lookback, deadband) cannot lift a gross-flat/PF<1 result to profitability. Not worth 2 hours of optimization. abandon_class=negative_expectancy.

Implementation

Dollar-neutral long/short rotation between ETHUSDT.BINANCE and BTCUSDT.BINANCE USD-M perpetuals on 1-DAY bars, driven by the momentum of the ETH/BTC ratio. The signal (unchanged) is the log-ratio change over mom_lookback days divided by the ratio's own daily volatility times sqrt(horizon) — a scale-free z in natural units every bar, built from closes only. At or above +deadband the strategy is long ETH / short BTC in equal dollars; at or below -deadband it is short ETH / long BTC; the position closes when the signal crosses back through zero or when the ratio has moved stop_ratio_pct (now 6%) against it since entry — checked against both the current close AND the worst-case intrabar ratio of the completed bar (ETH low vs BTC high for a long, ETH high vs BTC low for a short), so a relative reversal that blows through the cap intraday is acted on that same bar instead of a day later. ETH and BTC prices are stored in separate dicts keyed by UTC day index and the ratio series is rebuilt from the intersection of days present in both. The BTC leg is dollar-matched to the ETH leg and reconciled idempotently from both hooks; a hedge leg is never held alone or on the same side. Each leg is 35% of equity in notional at leverage 1.0. Exactly 2 tunables: mom_lookback and deadband.

Verification Results

CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.

Verification Results

Near-zero/negative edge on a measurable full-history sample (550 trades, PF 0.965, -22.4%, avg_trade_return_pct +0.061% below the two-leg fee) — the low-dispersion ETH/BTC pair the hypothesis itself flagged as weaker than SOL/ETH. Faithful implementation, so an edge finding for the analyst. Abandon at backtest-review per the developer's pre-registered condition (PF didn't clear 1); do not optimize.

Verification Results

57.8% max drawdown (CI to 83%, 1894-day duration) on a nominally market-neutral book: dollar-neutral only at entry, and 70% gross exposure compounds a losing edge against sustained ETH/BTC ratio trends between the 6% stops. Not a hedging bug — equal-notional reconciliation is correct — but a risk profile the Risk Officer should see.

Backtest Review

Faithfully implements the hypothesis: dollar-neutral ETH/BTC ratio-momentum rotation, market-neutral (benchmark_meaningful=false, so buy-hold is correctly not the yardstick)

Backtest Review

Reliable, measurable sample: 582 pair rotations over 6.7 years, metrics_reliable=true, entry pipeline healthy (291 long / 291 short, zero drops)

Backtest Review

Genuinely 2-parameter, low-overfit surface

Backtest Review

profit_factor 0.9999 — gross-flat, there is no net edge for optimization to tune toward

Backtest Review

Negative expectancy on a reliable sample: avg_trade_pnl_usd -0.137, CAGR -1.22%, recovery_factor negative

Backtest Review

The +7.83% headline is entirely unrealized (end_unrealized_pct 7.91) — an un-exited end position, not a realized edge

Backtest Review

max_drawdown 56.6% (CI to 80%); Sharpe 0.26 with CI [-0.48, 1.01] straddles zero — indistinguishable from no-skill

Backtest Review

impact_cost_pct 101% with capacity_usd ~$98k — market impact alone consumes the entire edge; viable only at toy scale

Backtest Review

regime_performance 'normal' tercile returns -56% at 60% DD — no structural relative-strength edge

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['deadband', 'leg_frac', 'max_days', 'vol_window', 'mom_lookback', 'size_precision', 'stop_ratio_pct', 'min_notional_btc', 'min_notional_eth'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - steady_downtrend: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - flat_ranging: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - volatility_spike: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - zero_volume: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000) - price_gap: TypeError: super(type, obj): obj must be an instance or subtype of type (bar timestamp: 1735689600000)

Iteration History

Verification failed (Layer 4 — QA review): - DECISIVELY NET-NEGATIVE -- the ETH/BTC ratio-momentum rotation has no edge, and the 'trade with the drift' thesis is falsified. On a measurable 28-trade / 362-day sample (metrics_reliable=true): profit_factor 0.737, Sharpe -0.473 (CI [-1.98, 1.18]), total_return -17.6%, expectancy -$637/trade, win_rate 0.464 with an INVERTED RR (avg_win $3837 < avg_loss $4514). Note avg_trade_return_pct reads +0.161% but that is MISLEADING here -- the dollar P&L is clearly negative (avg_trade_pnl_usd -$637, PF 0.737, -17.6% total), because the loss magnitudes outweigh the wins: the average %-of-notional is dragged positive by many small wins while a fat left tail (return_skew -0.95, kurtosis 11.3, largest_loss -$16,261 vs largest_win $9,880) drives the dollar result deeply negative. So this does NOT clear the fee floor in any economically meaningful sense -- it is a net loser. The relative-strength momentum of the ETH/BTC ratio does not persist enough to profit dollar-neutral: the ratio whipsaws and reverses hard (that -$16k tail is a relative-trend reversal blowing through the ratio stop), so long-the-stronger/short-the-weaker gets caught buying the ratio top / selling the ratio bottom. This is the ratio-momentum mirror of the session's single-name momentum failures -- momentum on the ETH/BTC spread is no more tradable than momentum on the alts themselves. - RATIO STOP IS NOT CONTAINING THE TAIL -- verify. The locked stop_ratio_pct is 0.12 (a ~12% adverse ratio move, ~8.4% of equity at 70% gross), but largest_loss is -$16,261 -- roughly double that cap. On DAILY bars the ratio stop is only checked at each close, so a relative-trend reversal that gaps the ratio well past 12% intraday realizes a much larger loss than the nominal cap; combined with max_drawdown 26.62 (CI [12.39, 45.03]) and cvar_95 3.60, the dollar-neutral construction is running materially hotter than its 'bounded ~8% per rotation' design claim. Not a blow-up (leverage 1.0, liquidated=false), but the risk-containment narrative does not hold on the realized tail.

Iteration History

Verification failed (Layer 4 — QA review): - THE RISK-CONTAINMENT FIX MADE IT DECISIVELY WORSE -- confirming no edge, and the developer's pre-committed abandon criterion is met. Tightening the stop (12% -> 6% cap) and adding the intrabar-aware check did not lift profit_factor above 1; it drove the result DEEPLY negative: total_return -17.6% (iter2) -> -30.2% (iter3), profit_factor 0.737 -> 0.674 (worse), Sharpe -0.972 (CI [-2.47, 0.67]), win_rate 0.443, avg_trade_return_pct -0.607%, and the trade count nearly tripled (28 -> 70). That is the decisive tell: tightening the stop on a signal with no directional edge just adds WHIPSAW -- the strategy is now stopped out into more frequent small losses (the return_skew -2.62 / kurtosis 26.6 and max_drawdown 37.97 confirm the tail was NOT contained, it was multiplied by churn). Across every measurement the mechanism is at or below breakeven and its sign moves with the pair AND with a stop change on the same pair: ETH/BTC PF 0.737 -> 0.674, SOL/ETH PF 1.06 -> 0.986. That is conclusive evidence of a near-zero-edge signal -- relative-strength momentum on a crypto ratio does not persist. The developer stated the test up front: 'if a tighter, intrabar-aware stop does not lift profit_factor above 1, the ratio-momentum family should be ABANDONED rather than iterated a fourth time.' PF is 0.674; the criterion is met. - IMPLAUSIBLE RISK-METRIC UNITS -- verify (unchanged, engine-side). max_drawdown 37.97 (CI [14.19, 62.09]), var_95 2.61, cvar_95 4.02 are >100% -- the session-wide normalization artifact. Note the developer's per-leg vs per-pair tail analysis is CORRECT and worth recording: leg-level largest_loss on a dollar-neutral pair is dominated by market beta that cancels between the legs, so those per-leg extremes measure beta, not the spread edge -- the pair-level figures (PF 0.674, total_return -30.2%) are the ones that matter, and they are decisively negative.
Strategy report

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