Skip to content
All strategies

Strategies

SOL-AVAX Stationarity-Gated Cointegration Pair Stat-Arb (Market-Neutral Long-Short, Binance USD-M Futures, 4H, ADF/Hurst Gate + De-Cointegration Stop, Pure OHLCV)

Outcome: Abandoned

SolAvaxStationarityGatedCointegrationPairStatArb4H

Outcome Summary

This strategy was the principled retry of a dead reversion idea, moving the SOL/AVAX cointegration pair trade to Binance 4H futures with a Hurst stationarity gate meant to only fade spreads that were actually mean-reverting and to stand aside otherwise. In practice the mechanism ran as designed — 276 balanced, market-neutral trades — but produced no edge net of costs: it lost 13.9% with a 0.18 Sharpe while commissions (183% of gross) and market impact (66%) swamped the tiny gross profit. Worse, it still took a 69.9% drawdown when the 2021 spread blew out, the precise tail the gate and de-cointegration stop were supposed to eliminate. The analyst abandoned it at the pre-optimization gate on iteration 2, judging that three tunables could neither create cointegration where the pair trends nor overcome costs that already exceeded gross PnL — a recurrence of the reversion-is-dead pattern on a non-stationary pair.

Hypothesis

A MARKET-NEUTRAL, two-leg statistical-arbitrage pair trade on SOLUSDT.BINANCE and AVAXUSDT.BINANCE USD-M perpetual futures (4H bars) whose CORE MECHANISM is a rolling STATIONARITY GATE: it fades the SOL/AVAX log-spread ONLY when a rolling statistical test confirms the spread is CURRENTLY mean-reverting (cointegrated), and stands aside the instant it is not. This is the analyst's explicit, repeated recommendation (re-target the cointegrated-pair idea from data-starved HL 15m to Binance 4H with >=12 months of data……Show moreShow less

A MARKET-NEUTRAL, two-leg statistical-arbitrage pair trade on SOLUSDT.BINANCE and AVAXUSDT.BINANCE USD-M perpetual futures (4H bars) whose CORE MECHANISM is a rolling STATIONARITY GATE: it fades the SOL/AVAX log-spread ONLY when a rolling statistical test confirms the spread is CURRENTLY mean-reverting (cointegrated), and stands aside the instant it is not. This is the analyst's explicit, repeated recommendation (re-target the cointegrated-pair idea from data-starved HL 15m to Binance 4H with >=12 months of data and ADF-verify the log-ratio), and it is the one genuinely-novel, non-redundant direction left after the momentum-basket factor was exhaustively covered. CRITICAL DISTINCTION from the dead naive ratio-MRs (ETH/BTC -62%, cross-sectional 2-day reversal -94%, every intraday fade): those assumed reversion from SECTOR ANALOGY and faded NON-STATIONARY spreads that simply trend -- the reversion-is-dead lesson applies to non-stationary spreads. This strategy NEVER assumes cointegration; it VERIFIES it every bar via a rolling stationarity test (ADF p-value on the spread, or a Hurst exponent < 0.5 / variance-ratio proxy if statsmodels is unavailable) and only trades the stationary windows. EVERY design choice respects this session's binding lessons: (1) FUTURES Binance (clean sizing, can short, no spot accounting bug) with >=12-month 4H data -- NOT Hyperliquid (whose 15m SOL/AVAX data was only ~2 months and killed the prior attempt). (2) PURE OHLCV -- spread, hedge ratio, z-score, and stationarity tests are all price-derived; immune to the funding-data-end-2024, supplementary-stream (0-for-7), and HL-data kills. (3) STATIONARITY GATE as the core, not a dressing -- the principled fix for why every ratio-MR died. (4) DE-COINTEGRATION STOP -- exit and stand aside the moment the spread fails the stationarity test or z blows out, containing the 'fade-a-trending-spread' tail that destroyed the prior pairs. (5) DYNAMIC HEDGE RATIO (rolling OLS) for true dollar/beta-neutrality. (6) NOT a momentum basket (distinct market-neutral pairs mechanism), NOT a supplementary-signal strategy, NOT spot. Intentionally minimal: 3 tunables (lookback, entry_z, stationarity_threshold).

Iteration 2 fix for the Layer-2 synthetic failure: `_hurst()` was a `@staticmethod` called as `self._hurst(spread)`. The Layer-2 `_StrategyProxy` re-binds strategy methods and strips the staticmethod decorator, so `self` was injected as a second positional arg into a single-arg function ('takes 1 positional argument but 2 were given'). Converting `_hurst` to a normal instance method `def _hurst(self, series)` resolves this — it now works whether called bound or unbound. No other logic touched: the OLS hedge ratio, log-spread z-score, Hurst stationarity gate, dollar-neutral entry, and de-cointegration/z-stop/time-stop exits (all of which passed Layer 1) are unchanged.

Pre-optimization gate: fundamentally losing money with terrible risk metrics that no parameter sweep can fix. The base config has NO edge net of costs — commission alone is 183% of gross PnL (commission_pct_of_gross 1.83) and market impact another 66% (impact_cost_pct 65.97), so total costs exceed gross profit; profit_factor is 1.006 with avg_loss (5204) > avg_win (5013), yielding total_return -13.9%, Sharpe 0.18, IR -0.70. The high turnover (69.3, driven by exit_z=0 mean-reversion churn) makes the cost……Show moreShow less

Pre-optimization gate: fundamentally losing money with terrible risk metrics that no parameter sweep can fix. The base config has NO edge net of costs — commission alone is 183% of gross PnL (commission_pct_of_gross 1.83) and market impact another 66% (impact_cost_pct 65.97), so total costs exceed gross profit; profit_factor is 1.006 with avg_loss (5204) > avg_win (5013), yielding total_return -13.9%, Sharpe 0.18, IR -0.70. The high turnover (69.3, driven by exit_z=0 mean-reversion churn) makes the cost domination structural, not tunable. Worse, the strategy suffers a 69.9% max drawdown despite being market-neutral: the Hurst stationarity gate and de-cointegration stop did NOT contain the 2021 SOL/AVAX spread blowout (annual -33.6%, single days +39.6%/-19.5%), which is the precise 'fade-a-trending-spread' tail the hypothesis was designed to eliminate. Capacity is only ~$230K. The 3 tunables (lookback, entry_z, stationarity_threshold) cannot manufacture cointegration where the pair de-cointegrates, and cannot lift a strategy whose costs already exceed gross PnL — this is the reversion-is-dead pattern recurring on a non-stationary pair. Not worth 2 hours of optimization.

Implementation

Market-neutral SOL/AVAX cointegration pair stat-arb on Binance USD-M 4H bars. Fits a rolling OLS hedge ratio on log prices, computes the log-spread z-score, and fades it ONLY when a rolling Hurst-exponent stationarity gate (Hurst < threshold => mean-reverting) confirms the spread is currently cointegrated. Enters dollar-neutral (short rich / long cheap leg), exits on reversion, de-cointegration (gate fails), z-blowout, or time stop. Pure OHLCV, no leverage.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['exit_z', 'z_stop', 'entry_z', 'leg_frac', 'lookback', 'min_notional', 'time_stop_bars', 'sol_size_precision', 'avax_size_precision', 'stationarity_threshold'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - steady_downtrend: TypeError:……Show moreShow less

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['exit_z', 'z_stop', 'entry_z', 'leg_frac', 'lookback', 'min_notional', 'time_stop_bars', 'sol_size_precision', 'avax_size_precision', 'stationarity_threshold'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - steady_downtrend: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - flat_ranging: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - volatility_spike: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - zero_volume: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000) - price_gap: TypeError: SolAvaxStationarityGatedCointegrationPairStatArb4H._hurst() takes 1 positional argument but 2 were given (bar timestamp: 1735700400000)

Backtest Review

Sharpe
0.18
Total return
-13.95%
Max drawdown
69.89%
Trades
276
Win rate
51.1%
Profit factor
1.01

Mechanism functions as designed: 276 trades, balanced 138 long / 138 short, genuinely market-neutral (portfolio beta 0.07, benchmark_correlation 0.20)

Pure OHLCV, differentiated pairs stat-arb, adequate trade sample for optimization

benchmark_meaningful=false correctly flags this as market-neutral; judged on absolute metrics

No edge net of costs: commission_pct_of_gross=1.83 (commission alone is 183% of gross PnL) and impact_cost_pct=65.97% — trading costs EXCEED gross profit; turnover 69.3 makes this structural

profit_factor 1.006 with avg_loss (5204) > avg_win (5013) at 51% win rate — expectancy is negative net; total_return -13.9%, Sharpe 0.18, IR -0.70, negative alpha

70% max drawdown on a supposedly market-neutral strategy — the Hurst gate + de-cointegration stop failed to contain the 2021 spread blowout (annual -33.6%), the exact tail the hypothesis claimed to fix

capacity_usd ~$230K — deployable only at toy scale even if a Sharpe were found

3 tunables cannot create cointegration that isn't there nor overcome costs that already exceed gross PnL

Outcome Summary

A stationarity gate cannot manufacture cointegration in a pair that de-cointegrates, and high-turnover mean-reversion churn (here driven by exit_z=0) can make trading costs structurally exceed gross PnL — so cost and drawdown viability must be established before betting on the gate.

It was abandoned at the pre-optimization BACKTEST_REVIEW gate: trading costs already exceeded gross profit and the Hurst gate plus de-cointegration stop failed to contain the 2021 SOL/AVAX spread blowout — the exact trending-spread tail the design claimed to fix — so no parameter sweep was judged capable of rescuing it and optimization was never reached.

A market-neutral SOL/AVAX cointegration pair stat-arb on Binance USD-M 4H futures that fades the log-spread only when a rolling Hurst-based stationarity gate confirms the spread is currently mean-reverting, with a dynamic OLS hedge ratio, a de-cointegration stop, and just three tunables (lookback, entry_z, stationarity_threshold), using pure OHLCV.

Over ~926 days the base backtest lost money: total return -13.9%, Sharpe 0.18 (CI low -0.81), information ratio -0.70, profit factor 1.006 across 276 balanced trades (138 long / 138 short) at a 51% win rate, with avg loss ($5,204) exceeding avg win ($5,013). It was genuinely market-neutral (beta 0.07, benchmark correlation 0.20) but suffered a 69.9% max drawdown, and commissions alone were 183% of gross PnL with market impact another 66%, on turnover of 69.3 and ~$230K capacity.

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