Skip to content

View translation

SolEthRatioMeanReversionPairs

Hypotheses

SOL/ETH Ratio Mean Reversion Pairs Trade on BINANCE Perps (Safe-Instrument Long-Short Market-Neutral, OHLCV-Only)

Hypotheses

Third-pair validation of the pairs-ratio mean-reversion mechanism class — deliberately using BINANCE perps SOLUSDT and ETHUSDT, which the data-infrastructure layer just explicitly confirmed as 'always safe' (verbatim from the system's failure-action message: 'BTCUSDT/ETHUSDT/SOLUSDT.BINANCE on a 1H/4H/1D timeframe is always safe'). The analyst's most recent refined heuristic requires 'replicating positive expectancy on a SECOND instrument with the same implementation' for mechanism-class validation. With ETH/BTC MR on HL (in pipeline V2) and SOL/BTC MR on BINANCE (in pipeline V4) already running, SOL/ETH on BINANCE adds a THIRD distinct pair to the validation stack — different from both because it ranks two top-3 ALTCOINS against each other rather than altcoin-vs-BTC. SOL and ETH have ~75% correlation but distinct narrative drivers: ETH = smart contract platform with DeFi/L2 dominance; SOL = high-throughput L1 with DePIN/memecoin culture. Their ratio mean-reverts over 30-60 day windows as narratives rotate. This hypothesis fills three under-represented portfolio buckets: (a) pairs scope (14.6% → reducing 78.6% single), (b) market-neutral direction (9.3% → reducing 90.7% long-only), (c) third-pair-validation evidence for the pairs-ratio mechanism class. CRITICAL DATA SAFETY: BOTH legs use the EXPLICITLY-SYSTEM-CONFIRMED-SAFE instrument set (SOLUSDT.BINANCE + ETHUSDT.BINANCE) at standard timeframes. NO supplementary data, NO funding rates, NO HL-native bars (which have refill issues), NO BINANCE_CM (just abandoned for missing history), NO BINANCE_SPOT (recent refill issues). This should be the cleanest Layer-3 verification path possible.

Hypotheses

Iteration 2 fix for the Layer-2 failure: _trim_dict was a @staticmethod (d, max_keep) but the synthetic-scenario harness invoked it as a bound method, passing self as a third argument ('takes 2 positional arguments but 3 were given'). The minimal, surgical change converts _trim_dict into a regular instance method 'def _trim_dict(self, d, max_keep)' — now the 3-argument bound call matches exactly, and the two existing call sites (self._trim_dict(self._sol_prices, ...) and self._trim_dict(self._eth_prices, ...)) are unchanged. No imports added, no signal/entry/exit logic touched, so every earlier-passing layer (Layer 1 static, and the synced-ratio mechanism) remains intact. All other code — the log-ratio z-score, dollar-neutral dual-leg execution, timestamp alignment, and signal-only Layer-2 fallback — is preserved verbatim.

Hypotheses

Dead premise -- the SOL/ETH ratio does not mean-revert tradeably. The strategy traded correctly as designed (160 dollar-neutral pairs entries fading the log(SOL/ETH) z-score) but LOSES money in every year: profit_factor 0.787 (<1), Sharpe -1.12, total_return -53.9%, expectancy negative, max_drawdown 55%, with an inverted payoff (avg_win $1,078 < avg_loss $1,193, win_rate 0.466) -- the spread diverges/trends more than it reverts. The Sharpe CI is entirely negative (-2.10 to -0.18) with probabilistic_sharpe 0.013, so the true Sharpe is near-certainly negative. The parameters (z_lookback, z_entry, z_exit) cannot convert a sub-1 profit factor that loses across all 7 years into an edge; the SOL/ETH pair is not a stationary mean-reverting spread (two ~75%-correlated alts with distinct narrative drivers trend apart as much as they converge). A secondary sizing flag (exposure_pct 101% vs ~30% intended gross, kurtosis 43.2) suggests a possible leg-netting discrepancy worth verifying, but the gross edge is negative regardless so it would not rescue the result. Not iterate (money-losing premise on a non-reverting spread). FAILURE PATTERN: pairs-ratio mean-reversion on crypto-major pairs has no validated edge -- this is the THIRD pair in the same 'validation stack' (after ETH/BTC and SOL/BTC) to lose money with a sub-1 profit factor, inverted payoff, and all-years-negative returns; alt-vs-alt and alt-vs-BTC ratios trend/de-cointegrate rather than reliably mean-revert, so the ratio-MR mechanism class does not replicate positive expectancy across pairs. The 'third-pair validation' the hypothesis sought is a negative result for the family.

Implementation

Dollar-neutral SOL/ETH pairs mean-reversion on BINANCE USD-M perps, 4H bars, OHLCV-only. It computes the z-score of log(SOL/ETH) over a rolling 120-bar window of timestamp-aligned closes and fades extremes: z>+2 shorts SOL / longs ETH; z<-2 longs SOL / shorts ETH. Exits when |z|<0.3, on a 120-bar time stop, or a 12% per-leg emergency stop. Both legs carry equal dollar notional (15% of equity each) for market-neutrality. The SOL leg runs through the base entry path; _submit_entry/_submit_exit are overridden to trade the ETH hedge opposite and to close it on exit.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['z_exit', 'z_entry', 'min_warmup', 'z_lookback', 'per_leg_pct', 'min_notional', 'max_hold_bars', 'emergency_stop_pct'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000) - steady_downtrend: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000) - flat_ranging: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000) - volatility_spike: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000) - zero_volume: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000) - price_gap: TypeError: SolEthRatioMeanReversionPairs._trim_dict() takes 2 positional arguments but 3 were given (bar timestamp: 1735689600000)

Backtest Review

Implemented and trades as designed: 160 dollar-neutral SOL/ETH pairs entries, clean entry_diag (160 signaled = 160 submitted, 0 dropped), metrics_reliable=true, genuinely market-neutral (beta -0.006); fills pairs/market-neutral portfolio buckets

Backtest Review

No edge / money-losing: profit_factor 0.787 (<1), Sharpe -1.12, Sortino -1.04, total_return -53.9%, expectancy -135.5 (negative), max_drawdown 55%

Backtest Review

Inverted payoff (avg_win $1,078 < avg_loss $1,193, win_rate 0.466) -- the ratio diverges more than it reverts; negative in all 7 years; Sharpe CI entirely negative (-2.10 to -0.18), probabilistic_sharpe 0.013

Backtest Review

Possible secondary sizing/netting issue: exposure_pct 101% vs ~30% intended gross, kurtosis 43.2 -- but the gross edge is negative regardless

Backtest Review

~0.5+ (pre-opt)

Backtest Review

1 of 7 (trivially)

Backtest Review

majority

Backtest Review

negative (-135.5)

Outcome Summary

SolEthRatioMeanReversionPairs was the third deliberate test of the pairs-ratio mean-reversion mechanism — a dollar-neutral SOL/ETH log-ratio z-score fade, carefully routed through the system-confirmed-safe BINANCE 4H path to guarantee a clean Layer-3 verification. The data engineering succeeded (160 clean, genuinely market-neutral trades), but the premise failed: the SOL/ETH ratio trended apart as narratives rotated rather than reverting, yielding the inverted-payoff signature (avg_win < avg_loss), profit_factor 0.787, Sharpe −1.12, a −53.9% return, and losses in all 7 years, with a probabilistic_sharpe of 0.013 making the negative edge near-certain. The analyst abandoned it at backtest review without optimizing — a non-stationary spread can't be tuned into mean-reversion, and a secondary 101%-exposure sizing flag was moot against a negative gross edge. Most decisively, this completes the validation stack as a refutation: three pairs in a row (ETH/BTC, SOL/BTC, SOL/ETH) all lost money, so the ratio-MR family does not replicate positive expectancy across pairs and the third-pair test the hypothesis intended as confirmation instead disproved the class.

Outcome Summary

Pairs-ratio mean-reversion on crypto-major pairs has no validated edge — this is the third pair in the same validation stack (after ETH/BTC and SOL/BTC) to lose money with a sub-1 profit factor, inverted payoff, and all-years-negative returns — so alt-vs-alt and alt-vs-BTC ratios trend/de-cointegrate rather than reliably revert, and the 'third-pair validation' the hypothesis sought is in fact a negative result that refutes the mechanism class.

Outcome Summary

The analyst issued an abandon verdict at backtest review on a dead-premise basis: the SOL/ETH ratio does not mean-revert tradeably — two ~75%-correlated alts with distinct narrative drivers trend/de-cointegrate as much as they converge — producing an inverted payoff, a sub-1 profit factor, and losses every year, with the true Sharpe near-certainly negative; the z-score parameters cannot convert a non-reverting spread into an edge, and while a possible leg-netting discrepancy (101% gross exposure) is worth verifying, the gross edge is negative regardless so fixing it would not rescue the result.

Outcome Summary

A dollar-neutral, OHLCV-only pairs trade on two top-3 altcoins — SOLUSDT (primary) and ETHUSDT (hedge) on BINANCE 4H perps — fading the z-score of the log(SOL/ETH) price ratio over a rolling 120-bar window (short SOL/long ETH when SOL is rich, the reverse when cheap), exiting on reversion inside ±z_exit, a time stop, or a per-leg emergency stop, deliberately chosen as a system-confirmed-safe instrument set to be a clean third-pair validation of the pairs-ratio mean-reversion mechanism class.

Outcome Summary

It traded as designed with a clean, genuinely market-neutral profile (160 dollar-neutral entries, beta −0.006, metrics_reliable=true) but lost money systematically: profit_factor 0.787, Sharpe −1.12, Sortino −1.04, total_return −53.9%, expectancy −135.5, max drawdown 55%, negative in all 7 years. The payoff was inverted (avg_win $1,078 < avg_loss $1,193, win_rate 0.466, kurtosis 43.2), the Sharpe CI was entirely negative (−2.10 to −0.18) with probabilistic_sharpe 0.013, and a sizing flag appeared (exposure_pct 101% vs ~30% intended gross).
Strategy report

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