SolEthBetaHedgedResidualMeanReversionPair
Hypotheses
SOL–ETH Beta-Hedged Residual Mean-Reversion — Market-Neutral Statistical Pairs Spread on Two Liquid L1 Perps (Both BINANCE USD-M, Trade Only ≥2σ Residual Dislocations, 4H Bars, 3-Parameter)
Hypotheses
A MARKET-NEUTRAL, LONG-SHORT statistical-arbitrage pair on two structurally-linked large-cap smart-contract L1s: SOLUSDT.BINANCE and ETHUSDT.BINANCE (both USD-M perps, both deeply liquid, correlation ~0.8). It abandons the funding-carry family entirely (that family just collided with an abandoned/overfit prior whose avg_trade_return_pct was 0.006% — the gap is structurally below fees). Instead it trades a DIFFERENT mechanism: the beta-hedged residual spread between the two assets mean-reverts after transient idiosyncratic dislocations. Each bar it estimates the hedge ratio β from a rolling regression of SOL log-returns on ETH log-returns, forms the residual spread = log(SOL) − β·log(ETH) − rolling_mean, and standardizes it to a z-score. When the residual stretches to an extreme (|z| ≥ 2), it takes the reverting side: SHORT the rich leg / LONG the cheap leg, sized so the two legs are beta-neutral (net directional beta ≈ 0), and exits as the residual reverts toward zero. This is not momentum/trend (0/213 dead class, L56), not funding/basis carry (dead, L57), not options, not a single-asset RSI/BBand reversion (crypto-noise-prone), and not a sub-fee microstructure fade — it is a low-frequency, dislocation-gated relative-value trade whose per-event capture is multiples of the fee. It fills the under-represented long-short (14% vs ≤55% ceiling on long-only) and pairs scope buckets. Exactly 3 tunable parameters: entry z-threshold, exit z-threshold, and the rolling lookback for β/mean/σ.
Hypotheses
Iteration 3 addresses the Layer-4 fee-viability/no-edge verdict with three targeted changes to WHICH dislocations get traded and how much of each is kept, leaving all previously-passing structure (imports, signal math, leg sizing, hedge execution, O(1) rolling moments) untouched. (1) Reversion confirmation: entries now require the residual to be stretched AND already turning back toward zero (z falling while z >= +entry_z, rising while z <= -entry_z). The prior build entered on the bare threshold crossing, i.e. straight into still-widening excursions -- the systematically adverse half of the crossing distribution and the most likely source of the negative pre-fee expectancy the developer's full-history test found; waiting for the roll-over is a genuinely different conditional sample of the same mechanism, not a re-tuning inside the box that was already shown to be uniformly negative. (2) Full-reversion target: exit_z default 0.50 -> 0.25 raises the captured fraction of each excursion from ~75% to ~90% against a fixed 4-fill round trip, directly lifting avg_trade_return_pct off the 0.084% it printed. (3) An explicit fee-floor gate: expected capture is computed in the units fees are charged in, (|z| - exit_z)*sd_residual/(1+beta) as a fraction of GROSS notional, and entries below 0.30% -- 3x the ~0.10%-of-gross taker round trip -- are refused, so a nominally 2-sigma but arithmetically sub-fee dislocation is never opened. lookback default drops 120 -> 90 bars to target dislocations that revert inside the 20-bar hold cap rather than slow regime drift. The tunable surface is unchanged (entry_z, exit_z, lookback with identical declared _param_bounds); min_capture_frac, stop_z, max_hold_bars and gross_exposure remain locked risk constants. Venue stays BINANCE USD-M because the strategy shorts one leg; leverage stays 1.0 (and is read from config in sizing) since a market-neutral book with residual-divergence risk should not be amplified. Honest caveat, stated once as required: the QA is right that the level-residual mechanism was negative pre-fee across the prior box, so the confirmation filter is the load-bearing bet here -- if entering only on confirmed roll-overs does not flip expectancy positive pre-fee, this hypothesis family should be abandoned rather than iterated further.
Hypotheses
Decisive no-edge / losing pairs mean-reversion, negative in every one of 6 years (2021 -7.7% through 2025 -10.2%, 2026 -0.6%) with rolling Sharpe negative across essentially the whole history — this is absence of edge, not regime decay. profit_factor 0.79 means the SOL-ETH beta-hedged residual loses GROSS before the ~0.10% round-trip is even applied; avg_trade_return_pct is -0.827% (opposite sign to the 0.15% floor), total_return -50.97%, Sharpe -0.49 (CI [-1.16, 0.16]), max_drawdown 53.4%, IR -0.82. The trades faithfully implement the hypothesis (beta 0.009, 262 dislocation-gated ~3-day pair trades), so this is a genuine mechanism verdict. Critically it is already a second attempt: the docstring's reversion-confirmation + full-reversion-target + explicit fee-floor gate were the targeted fixes for the prior build's sub-floor +0.084% capture, and they drove per-trade expectancy negative instead — iteration has moved it the wrong way, so no further tuning of the 3 params rescues a book that loses gross every year. Abandon at BACKTEST_REVIEW rather than spend the optimization budget. Failure pattern: pairs_residual_reversion_no_edge (L55 mean-reversion PF<1.15).
Implementation
Market-neutral SOL/ETH statistical pair on BINANCE USD-M 4H bars. Every aligned bar it estimates the hedge ratio beta from a rolling regression of SOL log-returns on ETH log-returns, forms the residual log(SOL) - beta*log(ETH), and standardizes it to a z-score returned continuously as the signal. It shorts the rich leg / longs the cheap leg when the residual is stretched beyond entry_z AND has already started rolling back toward zero, sizing the two legs to equal-and-opposite beta-weighted USD notional (net delta ~0, gross pinned at equity*gross_exposure regardless of beta). Exits on full reversion (|z| <= exit_z), residual blow-out (|z| >= 4), residual sign flip, or a 20-bar (~3.3 day) hold cap. Both legs are always submitted and closed in the same event, with a per-bar reconciliation net that flattens orphan hedges and re-hedges a naked primary leg.
Verification Results
Verification failed (Layer 4 — QA review):
- No-edge / fee-viability failure, already decisively established by the developer's own full-history test (checklist #7, L6/L7). Both iterations disclose that on the full SOL/ETH 4H history (2020-09 to 2026-08, 12,911 aligned bars) the beta-hedged residual does NOT revert at this horizon and EVERY configuration inside the declared bounds is negative PRE-fee — the developer explicitly frames the run as 'a clean falsification test of the hypothesis's mechanism rather than a tuning candidate.' The 362-day sandbox corroborates a dead signal: Sharpe -0.078 (sharpe_ci [-1.67, 1.57], straddling zero), total_return +0.195% (flat over a year), profit_factor 1.005, win_rate 0.456, and avg_trade_return_pct +0.084% — below the 0.15% viability floor and, on a 4-taker-fill (~0.20% round-trip) two-leg BINANCE USD-M pair, net expectancy indistinguishable from zero. Because the mechanism is negative pre-fee across the entire parameter box, there is no configuration for the optimizer to find.
Verification Results
At BACKTEST_REVIEW, evaluate on the FULL history before committing optimization budget, and check the pre-fee expectancy of the confirmation-filtered entries specifically.
Verification Results
Edge is marginal and not yet statistically distinguishable from zero — a BACKTEST_REVIEW / significance concern for the analyst, not a QA block. Sandbox Sharpe is only 0.136 with sharpe_ci [-1.60, 1.65] straddling zero, total_return +1.63% over 362 days, PF 1.06, on 44 trades. After the optimizer's best-of-N deflation this base is very unlikely to clear the DSR 0.95 gate; the analyst should treat it as a fragile candidate.
Verification Results
The analyst should explicitly reproduce the full-history pre-fee expectancy under the new confirmation+fee-gate logic. If it is not clearly positive pre-fee, abandon the family (do not iterate again); if it is, proceed to walk-forward where OOS/holdout/PBO test the overfitting directly.
Verification Results
Sandbox-window overfitting risk. This is the 3rd iteration of the same SOL/ETH mechanism, each evaluated against the same ~1-year sandbox. Iteration 2's own full-history dry run (2020-2026) was reported NEGATIVE pre-fee across the entire parameter box. The confirmation filter + exit_z=0.25 + fee-gate combination is the developer's 'load-bearing bet' and plausibly a genuinely different conditional sample — but a marginal +1.63% on the single window iterated against could also be curve-fit to that window.
Backtest Review
Genuinely market-neutral by construction (realized beta 0.009), no liquidation, both legs on the same bar
Backtest Review
Trades match the hypothesis: 262 dislocation-gated pair trades, ~3-day holds, clean beta-hedged sizing — this is a real mechanism verdict, not an implementation artifact
Backtest Review
Negative in EVERY year of a 6-year sample (2021 -7.7%, 2022 -9.1%, 2023 -8.8%, 2024 -12.1%, 2025 -10.2%) — there was never an edge, not decay
Backtest Review
profit_factor 0.79 (<1.0) means it loses GROSS, before fees; avg_trade_return_pct -0.827% is negative, the opposite of the >0.15% floor the iteration targeted
Backtest Review
Sharpe -0.49 with CI [-1.16, 0.16], max_drawdown 53.4%, information_ratio -0.82, expectancy -$155/trade
Backtest Review
This is already the second attempt: the reversion-confirmation, full-reversion-target and fee-floor-gate fixes designed to lift the prior +0.084% capture instead drove per-trade return negative — iteration has moved it the wrong way
Outcome Summary
SolEthBetaHedgedResidualMeanReversionPair abandoned the dead funding-carry family for a different mechanism — the beta-hedged residual spread between two correlated L1 perps, traded only on confirmed ≥2σ dislocations above an explicit fee-floor gate, beta-neutral by construction. The mechanism was implemented cleanly (realized beta 0.009, 262 gated ~3-day pair trades, no liquidation), so the verdict was genuine — and it was decisively negative: profit factor 0.79 (losing gross before fees), avg trade -0.827%, total return -50.97%, Sharpe -0.49, 53.4% drawdown, and losses in every one of six years. Worse, this was already a second attempt whose reversion-confirmation and fee-floor fixes had pushed the prior build's thin +0.084% capture negative rather than positive. The analyst abandoned it at backtest review as a no-edge (not decayed) losing pairs reversion that no further tuning could save; it never reached optimization, analysis, or risk review.
Outcome Summary
Faithful market-neutral construction and disciplined dislocation/fee gating cannot manufacture an edge that isn't there — the SOL-ETH beta-hedged residual has no mean-reversion premium (loses gross every year for six years), and when targeted fixes aimed at a thin sub-floor capture instead flip per-trade expectancy negative, that is proof the mechanism is absent, not mistuned, and iteration should stop.
Outcome Summary
The analyst abandoned it at backtest review as a decisive no-edge (not decayed) losing pairs mean-reversion — negative every year with a profit factor below 1.0 meaning it loses gross before the round-trip fee — and critically it was already a second attempt: the reversion-confirmation, full-reversion-target, and explicit fee-floor-gate fixes designed to lift the prior build's sub-floor +0.084% capture instead drove per-trade expectancy negative, so iteration moved it the wrong way and no further tuning of 3 params could rescue a book that loses gross every year (L55, pairs_residual_reversion_no_edge, PF<1.15).
Outcome Summary
A market-neutral, long-short statistical-arbitrage pair on two structurally-linked large-cap L1 perps (SOLUSDT and ETHUSDT, both BINANCE USD-M, 4H bars) that traded the beta-hedged residual mean-reversion: each bar estimating the hedge ratio β from a rolling regression of SOL on ETH log-returns, forming the standardized residual spread, and — only on ≥2σ dislocations already turning back, above a 0.30%-of-gross fee-floor gate — shorting the rich leg and buying the cheap leg beta-neutral, exiting on full reversion, a stop, or a max hold, with 3 tunable parameters.
Outcome Summary
The backtest (12917 4H bars, 2020-2026) was decisively losing: total_return -50.97% over 262 trades, profit factor 0.79 (loses gross before fees), avg_trade_return_pct -0.827% (opposite sign to the 0.15% floor), Sharpe -0.49 (CI [-1.16, 0.16]), max drawdown 53.4%, information ratio -0.82, expectancy -$155/trade, and negative in every one of six years (2021 -7.7% through 2025 -10.2%). It was, however, genuinely market-neutral by construction (realized beta 0.009) with no liquidation and faithful, dislocation-gated ~3-day pair trades.
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['exit_z', 'stop_z', 'entry_z', 'beta_max', 'beta_min', 'lookback', 'min_notional', '_param_bounds', 'max_hold_bars', 'gross_exposure', 'min_notional_hedge']
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: 1735689600000)
- steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
- flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
- volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
- zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
- price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735689600000)
Backtest and paper results are hypothetical. Trading involves risk of loss.