Skip to content

View translation

SolCrossVenueBasisMeanReversionHlBinanceNeutral5M

Hypotheses

SOL Perp Cross-Venue Basis Mean Reversion: Hyperliquid vs Binance USD-M (5-Minute Market-Neutral Spread Trade)

Hypotheses

Market-neutral long-short spread trade between SOL perpetual futures on Hyperliquid (SOLUSD.HYPERLIQUID) and Binance USD-M (SOLUSDT.BINANCE). Both venues' perps reference the same underlying SOL spot price and converge to the same funding-anchored value every 8 hours, so the inter-venue basis is structurally mean-reverting (mechanically different from the failed ETH/BTC ratio mean-reversion — that was a ratio between two distinct assets with regime-driven trends; this is a basis between two contracts on the SAME asset). Temporary divergences arise from one-sided order flow, brief venue-specific liquidity gaps, or one venue lagging during fast moves. The strategy fades these divergences when persistent: when one venue's mid-price exceeds the other by >= 35 bps for 2 consecutive 5-minute bars, short the richer venue and long the cheaper venue in equal notional. Closes on basis compression to <= 10 bps. Simultaneously fills 4 portfolio quota gaps: HYPERLIQUID (4.1% -> 20% target), cross-venue (6.3% -> 15% target), short-horizon 1m-15m (1.4% -> 10% target), long-short (12.3% vs long-only at 87.7%). OHLCV-only — no supplementary data dependency (avoids the data-coverage blocker that abandoned 13+ recent supp-data hypotheses).

Hypotheses

Iteration-5 fix for the reported Layer-3 failure ('No trades produced — should_enter() returned a side 0 times over 9,214 evaluated bars'). I measured the basis on the actual catalog data rather than re-guessing thresholds: on aligned SOL HL-vs-Binance closes |basis| has p50 1.4 bps, p99 10.9, p99.9 14.1 and MAX 23.1 bps, so iteration 4's 25 bps / 2-consecutive-bar band is mathematically unreachable (0.000% of bars) — as is the hypothesis's 35 bps design threshold, which simply does not occur on this pair. Fix 1: entry_bps 25 -> 14, exit_bps 10 -> 2, persist_bars 2 -> 1, min_hold 2 -> 1, max_hold 144 -> 48, cooldown 24 -> 12. Fix 2: bar interval 5-MINUTE -> 15-MINUTE on BOTH legs, for two independent reasons. Edge: at 5m the >=10 bps prints are mostly stale-last-trade noise that never converges (measured gross capture ~7-10 bps vs ~16-26 bps for the same thresholds on 15m closes); and one 15m bar spans three 5m bars, so a single 15m qualifying close is STRICTER than the hypothesis's 'two consecutive 5-minute bars', not looser. Wall clock: Layer 3 feeds every catalog bar of both legs — ~640k at 5m, which is where iteration 3 timed out at 300s with only ~3 trades — versus ~220k at 15m, giving ~3x headroom, and 15m is still inside the hypothesis's 1m-15m short-horizon quota bucket. Only defaults and the bar interval changed; imports, class structure, signal/entry/exit logic and equal-notional sizing are byte-identical to v4, so Layers 1-2 stay green. Honest assessment the analyst should weigh: a round trip is 4 taker fills (2 x 0.050% Binance + 2 x 0.045% Hyperliquid = ~19 bps of leg notional), while the measured gross capture at entry=14 is ~26 bps over ~13 round trips — a net ~7 bps (0.07%) per trade, below the 0.15% viability floor, and positive only in the extreme tail of a distribution whose p99.9 is 14 bps. I believe this mechanism is fee-dead on this pair at taker execution; I implemented it as specified so the verdict can be made on measured numbers instead of a fifth zero-trade loop.

Hypotheses

Fee-dead, capacity-dead cross-venue basis mean-reversion — not worth 2 hours of optimization, and the developer's own docstring already pre-registered this conclusion. The result is negative-expectancy: profit_factor 0.72, Sharpe -0.96 with CI [-1.38, -0.75] fully below zero, total_return -1.85%, expectancy -$72.91/trade over 50 trades, avg_loss ($596) nearly double avg_win ($338). avg_trade_return_pct 0.146% is below the 0.15% floor, and the developer measured the honest net edge at ~7 bps against a ~19 bps 4-fill round trip (commission 25.6% of gross) — the 'edge' exists only in the extreme tail of a basis distribution whose p99.9 is 14 bps. It is also capacity-dead: impact_cost_pct 365% (impact over 3x gross PnL) with capacity_usd just $7,496, untradeable at real size. And it is unmeasurable across regimes: Hyperliquid SOL 15m data only exists from 2026-03-16 (~5.5 months), so the computable basis is 2026-only (annual_returns {2026: -1.82}) with 50 trades — the holdout and walk-forward OOS would sit in one recent regime. A same-asset cross-venue perp basis on SOL is a few bps, structurally too small to clear a 4-leg round trip; the L57/L44 cross-venue basis family. No tuning of entry_bps/exit_bps lifts a ~7 bps gross edge above a ~19 bps cost, and capacity stays toy-scale regardless. Failure pattern: fee_edge/no_edge cross-venue basis reversion, capacity-dead, single-regime history.

Implementation

Market-neutral SOL perp basis mean-reversion between Hyperliquid (SOLUSD.HYPERLIQUID) and Binance USD-M (SOLUSDT.BINANCE) on timestamp-aligned 15-minute closes. Each aligned bar it computes basis_bps = (hl_close - bn_close) / bn_close * 10,000 and returns it as the continuous signal. When |basis| >= entry_bps it shorts the richer venue and longs the cheaper one in EQUAL USD notional (dollar- and delta-neutral by construction: N = equity * per_leg_pct * leverage on each leg, qty = N/price per venue). It closes both legs when the basis compresses to <= exit_bps, or on the max_hold time stop, with a min-hold and a re-entry cooldown to bound churn. All per-bar work is O(1) (timestamp-keyed dict lookup, insertion-order eviction, no scans or sorts), and the base class's cross-leg alignment barrier guarantees both legs' prices are contemporaneous before any signal is computed.

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.

Backtest Review

Delta-neutral, no liquidation, tiny drawdown (1.85%); the iteration-5 fix did produce a measurable sample (50 trades) instead of a zero-trade loop

Backtest Review

Genuinely same-asset basis (mechanically sounder than the ETH/BTC ratio), OHLCV-only

Backtest Review

Negative expectancy: profit_factor 0.72, Sharpe -0.96 (CI [-1.38,-0.75] fully below zero), expectancy -$72.91/trade, avg_loss ~2x avg_win

Backtest Review

avg_trade_return_pct 0.146% below the fee floor; developer measured net edge ~7 bps vs a ~19 bps 4-fill round trip; commission 25.6% of gross

Backtest Review

Capacity-dead: impact_cost_pct 365% (impact >3x gross), capacity_usd $7,496 — untradeable at real size

Backtest Review

HL SOL 15m data only from 2026-03-16 (~5.5 months, single regime); annual_returns {2026: -1.82}, 50 trades — unmeasurable across regimes

Backtest Review

Developer pre-flagged 'very likely fee-dead on this pair'; L57/L44 cross-venue basis family

Iteration History

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: SOLUSDT.BINANCE-5-MINUTE-LAST-EXTERNAL, Bars processed: 101952 Diagnostics: should_enter() returned a side 0 times over 8033 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Iteration History

Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).

Iteration History

Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: SOLUSDT.BINANCE-5-MINUTE-LAST-EXTERNAL, Bars processed: 607884 Diagnostics: should_enter() returned a side 0 times over 9214 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.

Iteration History

Verification failed (Layer 4 — QA review): - Fee/edge viability failure on a two-legged spread (checklist #7, L6). A round trip is 4 taker fills ~ 19 bps of leg notional (2 x 0.050% Binance + 2 x 0.045% Hyperliquid); the developer's measured gross basis capture at entry=14 is ~26 bps, i.e. net ~7 bps (0.07%) per trade — below the 0.15% viability floor. The Layer-3 backtest confirms it is net-negative: total_return -1.50%, Sharpe -1.78, profit_factor 0.395, avg_trade_return_pct +0.125% (below floor), probabilistic_sharpe 0.0002, return_skew -9.1 / kurtosis 124 (a single -$1,220 loss dominates 28 trades). A spread whose gross edge (~26 bps) barely exceeds the round-trip cost (~19 bps) and nets negative is the L6 two-legged fee-dead pattern. - Uninvestable capacity. capacity_usd is $1,547 and impact_cost_pct is 804% (total_impact_usd $3,417 folded into returns). The SOL Hyperliquid perp is too thin in the catalog for any deployable size — market impact alone is ~8x the notional return — so even if the sign were positive the strategy could not hold meaningful capital. This is a structural liquidity ceiling on the HL leg, not a tuning issue. - The hypothesis cannot be tested as specified. Its design threshold is 35 bps on 5-minute bars, but the developer measured the actual aligned basis: |basis| p99.9 = 14.1 bps and MAX = 23.1 bps, so 35 bps (and the iteration-4 25 bps band) occurs on 0.000% of bars — the premised dislocation magnitude does not exist on this pair. To produce any trades the strategy was re-specified to 14 bps on 15-MINUTE bars (config bar_type SOLUSDT.BINANCE-15-MINUTE, a mismatch with the hypothesis's '5-Minute' title and the 35 bps / 10 bps thresholds). The re-specified band sits in the extreme tail of the distribution where the 4-fill fee dominates, so the mechanism's core premise (persistent, tradeable inter-venue dislocations) is falsified on SOL HL-vs-Binance.
Strategy report

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