Strategies
Hyperliquid Cross-Sectional Funding-Carry, Dollar-Neutral Long-Short Basket (8 Liquid HL Perps, 4H Rebalance, LONG the Most-Negative-Funding Names + SHORT the Most-Positive-Funding Names, Harvest Funding on BOTH Legs, Low-Parameter)
Outcome: Abandoned
HyperliquidCrossSectionalFundingCarryDollarNeutralBasket4H
The iteration-3 framework fix genuinely works: the cross-section now resolves funding on all 8 legs (funding_events_available 56207) and the strategy trades (206 trades, 100 long / 106 short), so this is a real,…
Hypothesis
Implementation
Dollar-neutral, long/short cross-sectional FUNDING-CARRY basket on 8 liquid Hyperliquid perps (BTC/ETH/SOL/XRP/DOGE/AVAX/ADA/NEAR, 4H bars). Every ~week it ranks the universe by each name's own trailing 24h mean funding rate, goes LONG the 2 most-negative-funding names (shorts pay longs) and SHORT the 2 most-positive-funding names (longs pay shorts) in equal dollar notional, so net delta ~0 and the P&L is the funding cash flow harvested on BOTH tails minus fees. A dispersion gate keeps the book FLAT when the top-vs-bottom bucket funding spread is below 1.5e-5/hr (too small to clear the ~0.09%/leg round trip), and a leg is only traded when its rank BUCKET changes, so names that stay in the same bucket across rebalances pay no turnover. Funding lookups are O(log n) binary searches over per-leg arrays parsed once.
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSD.HYPERLIQUID-4-HOUR-LAST-EXTERNAL, Bars processed: 5982 Diagnostics: should_enter() returned a side 0 times over 5633 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.
Derive the rebalance trigger from bar.ts_event (e.g. floor(ts / (rebalance_bars * bar_ns)) changing, or a days-since-epoch modulus) so the schedule is timestamp-anchored and restart/parity-stable.
The ~weekly rebalance cadence is driven by an uptime-anchored bar counter (self._bars_since_rebalance, initialized to self._rebalance_bars so it fires on the first bar) rather than a schedule derived from the bar's timestamp (days-since-epoch % N, day-of-week). This is the checklist-20 pattern: on a live crash-restart it fires a rebalance on the first bar after every restart and the weekly phase is uptime-dependent, so parity replay cannot reproduce exact rotation bars. Severity is warning rather than critical here because (a) the strategy only trades a leg when its rank BUCKET changes and re-reads current positions via _safe_position, so a restart-triggered rebalance does NOT churn the whole book — only bucket-changed legs trade; and (b) the hypothesis specifies 'roughly weekly' re-ranking with no fixed calendar grid, so the carry edge does not depend on hitting specific rotation dates. In backtest the counter is fully deterministic and correct.
Backtest Review
- Sharpe
- -0.10
- Total return
- -15.32%
- Max drawdown
- 36.79%
- Trades
- 206
- Win rate
- 49.5%
- Profit factor
- 0.96
The iteration-3 framework fix genuinely works: the cross-section now resolves funding on all 8 legs (funding_events_available 56207) and the strategy trades (206 trades, 100 long / 106 short), so this is a real, measurable result rather than a zero-trade or timeout failure.
Construction is sound and genuinely market-neutral (benchmark_meaningful=false, dollar-neutral both-tails carry), and funding IS credited by the current engine — so the negative result is the mechanism's true economics, not an uncreditable-carry artifact.
Negative per-trade edge: avg_trade_return_pct = -0.072% (below zero, not merely below the 0.15% HL fee floor), expectancy -$43.43/trade, profit_factor 0.958 (< 1.0). The funding harvested does not cover the four-legged turnover cost.
Losing risk-adjusted profile: Sharpe -0.104 (CI [-1.28, 1.15] straddles zero), Sortino -0.115, total_return -15.3% (CAGR -3.6%) over ~2.6 years, negative in 2024 (-17.2%) and 2025 (-1.5%); only partial-2026 is positive, so the headline recovery is one recent regime.
36.8% max drawdown (CI to 71.9%) with a 932-day underwater span on a supposedly delta-neutral book, and negative Sharpe (-0.88) in the stressed vol tercile — the funding cross-section gets adversely selected exactly when it matters.
This is the L45/L73 family: cross-sectional / funding-gated multi-instrument perp baskets (multi_instrument 0/84, HYPERLIQUID 0/128) with no survivors; the negative expectancy is the recurring outcome.
Iteration History
Verification failed (Layer 1 — static analysis): - supplementary_data['hl_funding_rates'] is a LIST of row-dicts, but `series.items()` treats it as a dict — raises "'list' object has no attribute 'items'" at runtime. Iterate the list, or guard with isinstance(series, dict). Only funding_rates is a dict. (line 109)
Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSD.HYPERLIQUID-4-HOUR-LAST-EXTERNAL, Bars processed: 5971 Diagnostics: should_enter() returned a side 0 times over 5630 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.
Backtest and paper results are hypothetical. Trading involves risk of loss.