SolEthRelativeMomentumRotationLS
Hypotheses
SOL-vs-ETH Relative-Momentum Rotation, Dollar-Neutral Long-Short (Two-Instrument SOLUSDT.BINANCE + ETHUSDT.BINANCE Perps, Daily Bars — Long the Stronger / Short the Weaker on SOL/ETH Ratio MOMENTUM, Deadband-Gated, Higher-Dispersion Pair for Fee Viability, Pure OHLCV, 2-Parameter)
Hypotheses
A MARKET-NEUTRAL (dollar-neutral) LONG-SHORT, two-instrument, pure-OHLCV relative-momentum strategy that rotates between two HIGH-BETA alt majors — SOL and ETH — based on the MOMENTUM of the SOL/ETH ratio: long SOL / short ETH dollar-neutral when SOL is trending stronger, flip to long ETH / short SOL when ETH leads. It is the fee-viable evolution of my ETH/BTC relative-momentum idea: ETH and BTC are too correlated, so their ratio swings are small and a relative-value trade risks fee_edge (the ETH/BTC reversion version died at ~0.01%/trade). SOL/ETH is a much HIGHER-DISPERSION pair — SOL's beta and idiosyncratic swings make the SOL/ETH ratio move 15-40% across regimes — so each relative-momentum leg captures a large move that clears the two-leg fee comfortably. It is built on the session's exhaustive evidence: single-name directional edge is absent on alts and all supplementary confirms fail on coverage/edge, so this is a market-NEUTRAL relative bet using ONLY pure OHLCV (the only reliably measurable, coverage-complete data) that hedges out the crypto beta which makes single-name direction so fragile. It trades WITH the ratio's regime drift (SOL-outperformance vs ETH-outperformance cycles), the momentum sign — NOT reversion (which died fighting the drift) — and is NOT the L32-banned 8-major cross-sectional rotation (it is a minimal 2-asset construction with a distinct thesis). DELIBERATELY 2-PARAMETER (momentum lookback + deadband) to resist overfit. Daily bars with a deadband keep turnover low for fees yet frequent enough (~40-80 rotations over multi-year history) to be measurable. It fills the under-target LONG-SHORT (13.3%), market-neutral, and pairs-scope buckets.
Hypotheses
I split QA's two findings deliberately, because only one of them is fixable in code. Finding 2 is a real mechanism defect and I fixed it: risk was controlled by a FIXED 15% ratio move measured only from entry, while winners exited on the momentum z crossing ZERO. That is asymmetric in P&L even though it looks symmetric in signal space — a decaying trend hands back nearly its whole excursion before z reaches zero, while a hard relative reversal runs the full 15% and gaps past it on a daily close. That is exactly the reported RR 0.71 (avg_win $2978 < avg_loss $4215) and the largest_loss of -$12,208 overshooting the '~9% of equity' design claim. Two locked changes address it: (a) the stop is now measured in HORIZON-SIGMAS of the ratio — the same unit the signal is normalized by — at 1.5 sigma, with the old 15% retained only as an absolute ceiling for a vol explosion, so risk is regime-consistent and materially tighter than 15% in ordinary regimes; and (b) a TRAILING ratio stop closes the position on a 1.0-sigma retrace from the best ratio reached since entry, which converts 'give back the whole move' into 'give back one sigma' while the loss side stays capped — the direct fix for the inverted reward:risk. Both the entry ratio and the best-so-far ratio are re-derived from the day-keyed stores using the position's own ts_opened with a bounded scan, so they are restart-safe rather than in-memory only. A welcome side effect is that shorter holds should lift the rotation count from ~30 toward ~45-60 on the same window, which addresses part of the sample-size complaint through the same change rather than a new knob. Neither stop_sigma nor trail_sigma is tunable, so the surface stays at exactly 2 parameters. Finding 1 I am not going to pretend to fix, and I want that on the record: QA is right that the identical mechanism was PF 0.737 on ETH/BTC and PF 1.06 here, that a Sharpe CI of [-1.49, 1.85] on 30 trades is indistinguishable from no edge, and that a sign flipping with the pair is the signature of a near-zero-edge signal. Repairing the geometry changes the expectancy arithmetic materially — a 60% hit rate at RR 0.71 is barely breakeven, the same hit rate at RR >= 1 is not — and the tighter stop removes the single -12% rotation that dominates the current dollar result, but it cannot manufacture relative-strength persistence that is not there. If this comes back with a CI still straddling zero, the honest conclusion is that ratio-momentum rotation has no robust edge and the family should be abandoned; I will NOT test a third pair, because picking the pair that happens to work is precisely the pair-window luck QA identified. Everything else is untouched: same imports, same class, same day-keyed alignment and continuous z signal with its sub-deadband warmup fallback, same entry thresholds, same idempotent dollar-matched hedge reconciliation with no on_bar override and no zero-arg super() on any event path (the iteration-2 Layer-2 fix), same per-symbol step and minimum-notional handling, same sizing.
Hypotheses
Measured-but-insignificant market-neutral relative-momentum rotation whose result hits the developer's own pre-registered abandon condition — not worth 2 hours of optimization. On the full ~117-rotation sample the Sharpe is 0.62 with bootstrap CI [-0.164, 1.383] straddling zero and PSR 0.927 (<0.95), i.e. not distinguishable from no-edge before the ~225-trial deflation, and PF is a thin 1.22 at a 49.6% win rate (barely breakeven). The developer explicitly pre-committed: 'if this iteration still comes back with a CI straddling zero, the honest conclusion is that ratio-momentum rotation has no robust edge and the family should be ABANDONED. I will not test a third pair.' The iteration-3 stop/trail fixes improved the payoff geometry mechanically but, as the developer honestly warned, cannot manufacture relative-strength persistence that isn't there — the same mechanism was PF 0.737 on ETH/BTC, so the lift to 1.22 is pair-window selection, not edge. The 177% return is outlier-carried (2023 alone +69.4%, with a +47.7% single day; 2024 and 2026 negative, kurtosis 5.7), and this is the near-zero-survivor market-neutral pairs class (L45/L52, market_neutral ~0.01) with max DD 24.3% (CI to 66%) above the promotion floor; benchmark_meaningful is correctly false. No parameter tuning conjures a signal a full-sample CI already shows isn't significant, and shopping a third pair is disallowed by the developer's own reasoning. Failure pattern: no_edge market-neutral relative-momentum pairs, CI straddles zero (L45/L52).
Implementation
Dollar-neutral long/short rotation between SOLUSDT.BINANCE and ETHUSDT.BINANCE USD-M perpetuals on 1-DAY bars, driven by the momentum of the SOL/ETH ratio. The signal is the log-ratio change over mom_lookback days divided by one horizon-sigma of ratio movement (daily ratio-change stdev x sqrt(horizon)) — a scale-free z in natural units every bar. At or above +deadband: long SOL / short ETH in equal dollars; at or below -deadband: the mirror. Risk is now measured in the same horizon-sigma unit as the signal: the position closes on a trail_sigma (1.0) retrace of the ratio from the best level reached since entry, on stop_sigma (1.5) of adverse ratio movement from entry (both capped by an absolute 15% ceiling), or when the momentum z crosses back through zero. SOL and ETH closes are stored in separate dicts keyed by UTC day index and the ratio series is rebuilt from the intersection of days present in both, so the legs can never silently misalign; the entry and best-so-far ratios are re-derived from those stores using the position's own ts_opened, so both stops survive a restart. The ETH leg is dollar-matched to the SOL leg and reconciled idempotently from both leg hooks; a hedge leg is never held alone or on the same side. Each leg is 30% of equity in notional at leverage 1.0, floor-rounded to each symbol's own step (SOL whole units, ETH 0.001). 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
Marginal risk-adjusted edge: Sharpe 0.62, CI [-0.18, 1.42] includes zero on 117 rotations. Mechanism now fee-viable and reward/risk-repaired, but ratio relative-strength persistence is weak (identical mechanism was PF 0.737 on ETH/BTC vs 1.25 here — pair-window sensitivity). Not a code fault. Weight OOS/holdout heavily; abandon per the developer's pre-registered criterion if the holdout Sharpe isn't clearly positive. Don't chase a third pair.
Verification Results
Dollar-neutral (equal-dollar) sizing is faithful to the hypothesis as written but is not beta-neutral: SOL's higher beta leaves residual net crypto-beta, so 'hedges out the crypto beta' is only partly true. Code correctly implements the specified dollar-neutral sizing (thesis note, not a sizing bug). Analyst should confirm the edge is relative-strength alpha, not residual alt-beta timing.
Backtest Review
avg_trade_return_pct 1.86% clears the two-leg fee comfortably — the higher-dispersion pair choice did solve the fee-viability problem that killed ETH/BTC
Backtest Review
234 trades (~117 rotations) is a measured sample, so the null result is trustworthy rather than noise
Backtest Review
Clean 2-parameter dollar-neutral construction with proper data alignment; no code/execution defects
Backtest Review
Sharpe 0.62 with bootstrap CI [-0.164, 1.383] straddling zero and PSR 0.927 (<0.95) — not distinguishable from no-edge on the full sample, before deflation
Backtest Review
PF only 1.22, win_rate 49.6% — barely-breakeven expectancy; the same mechanism was PF 0.737 on ETH/BTC, so the improvement is pair selection, not edge
Backtest Review
Outlier-carried: 2023 alone +69.4% (2023-11-21 +47.7% single day), 2024 -2.4% and 2026 -4.8% negative; kurtosis 5.7
Backtest Review
Market-neutral relative-momentum pairs is a near-zero-survivor class (L45/L52); max DD 24.3% with CI to 66% is above the promotion floor
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['deadband', 'leg_frac', 'max_days', 'vol_window', 'mom_lookback', 'min_notionals', 'stop_ratio_pct', 'size_precisions', 'hedge_instrument_id']
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):
- MARGINAL, FRAGILE, AND ALMOST CERTAINLY PAIR-WINDOW LUCK -- the IDENTICAL mechanism was a decisive loser on the sister pair. This is byte-for-byte the same ratio-momentum-rotation construction as the ETH/BTC version reviewed immediately prior (PF 0.737, Sharpe -0.473, -17.6% -- a clear net loser), just pointed at SOL/ETH. On SOL/ETH it lands marginally positive: total_return +2.06%, profit_factor 1.060 (razor-thin), Sharpe 0.163 with a CI of [-1.49, 1.85] that straddles zero (statistically indistinguishable from no edge), win_rate 0.60, on 30 trades. That a mechanism goes PF 0.737 on one crypto pair and PF 1.06 on another is the signature of a NEAR-ZERO-EDGE signal whose sign flips with the pair and the window -- relative-strength momentum does not persist reliably enough to be a robust edge; the SOL/ETH +2% is consistent with a lucky window, not a demonstrated edge. The payoff is also fragile: RR is INVERTED (avg_win $2978 < avg_loss $4215, 0.71) with a fat tail (largest_loss -$12,208 vs largest_win $7,901), so the thin positive expectancy leans entirely on the 60% win rate holding -- at n=30 with one -12% rotation, a single additional bad rotation flips it negative. NOTE the avg_trade_return_pct of 1.279% is a notional-weighting artifact, NOT a robust edge: it does not reconcile with the +2% total (30 x 1.279% of 60% gross would be ~+23% of equity), because a few larger losers drag the dollar result to marginal while the per-trade %-of-notional average stays high -- the same masking seen on the ETH/BTC sibling.
- RATIO STOP NOT CONTAINING THE TAIL + HOT/CORRELATED EXPOSURE -- verify if pursued. The locked 15% ratio stop (~9% of equity at 60% gross) is exceeded by largest_loss -$12,208 (~12%), because the daily-close stop gaps on a hard relative reversal; combined with max_drawdown 15.09 (CI [10.65, 42.07]), var_95 2.50, cvar_95 3.50, and capacity_usd $11.7M / impact 9.2%, the dollar-neutral pair runs hotter and lower-capacity than its 'bounded ~9% per rotation' design claim. Not a blow-up (leverage 1.0, liquidated=false).
Iteration History
Verification failed (Layer 4 — QA review):
- NO ROBUST EDGE -- CONFIRMED, and the developer's pre-committed abandon criterion is met. The iteration-3 geometry fix (vol-scaled hard stop + trailing ratio stop) did NOT rescue the strategy and did NOT even repair the defect it targeted: the result went from marginally positive (iter2: PF 1.06, +2.06%) to marginally negative (iter3: PF 0.986, total_return -1.65%, Sharpe 0.054 with CI [-1.56, 1.78] straddling zero, expectancy -$22/trade), and the RR is STILL inverted (avg_win $2868 < avg_loss $3273) with the tail essentially unchanged (largest_loss -$11,599 vs the prior -$12,208 -- the 1.0-sigma trailing stop still gaps on the daily close). The decisive evidence is the sign instability: the IDENTICAL mechanism is now PF 0.737 (ETH/BTC), PF 1.06 (SOL/ETH iter2), and PF 0.986 (SOL/ETH iter3) -- it flips sign not only with the pair but with a geometry tweak on the SAME pair. That is the definitive signature of a near-zero-edge signal: ratio-momentum rotation has no persistent relative-strength edge to capture, exactly as the developer conceded ('if this comes back with a CI still straddling zero, the honest conclusion is that ratio-momentum rotation has no robust edge and the family should be ABANDONED'). The avg_trade_return_pct 0.9395% is again a notional-weighting artifact masking a net loss (PF 0.986), not a real edge.
- TAIL STILL NOT CONTAINED -- the geometry fix underdelivered. Despite the vol-scaled + trailing stops, largest_loss is -$11,599 (~12%), max_drawdown 19.55 (CI [10.71, 42.63]), var_95 2.53, cvar_95 3.54 -- essentially the same tail as iter2, because a daily-close ratio stop (hard or trailing) gaps on a hard relative reversal regardless of whether the level is a fixed 15% or 1.5 horizon-sigmas. This corroborates the no-edge finding (the fix that was supposed to lift RR above 1 did not), and the >100% drawdown/VaR remain the session-wide normalization artifact. Moot given the abandon.
Backtest and paper results are hypothetical. Trading involves risk of loss.