Strategies
Cross-Sectional Funding-Rate Carry, Dollar-Neutral Market-Neutral Basket Across Liquid Binance USD-M Perps (Short High-Funding / Long Low-Funding, Hysteresis-Gated Rebalance, Funding-Cash-Flow Edge, Pure Funding-Rate Signal — NOT Price Momentum)
Outcome: Abandoned
CrossSectionalFundingCarryNeutralBasket8H
Genuinely different mechanism (pure funding-rate cross-section, not price); funding IS credited by the engine so the carry is real
Hypothesis
Implementation
Dollar-neutral cross-sectional funding-rate carry across six liquid Binance USD-M majors (BTC/ETH/SOL/BNB/XRP/DOGE) on 8-HOUR bars aligned to the funding cycle. Every third bar the universe is ranked by smoothed recent funding (mean of the last 3 prints per leg, read from per-instrument funding series); the richest-funding legs are SHORTED and the cheapest/most-negative-funding legs are held LONG in equal dollar notional per side, so the book is delta-stripped and earns the funding spread as a mechanical cash flow rather than price direction. A narrow entry band (30% rank fraction) and wider exit band (45%) provide hysteresis so the book does not churn on minor funding reshuffles. Exposure is hard-bounded: sizing references min(current equity, initial equity), gross is capped at 1x that reference, measured gross above 1.5x the cap flattens the book, drift beyond 10% of target is trimmed every rebalance, and any leg down 35% is closed with a 9-bar cooldown.
Verification Results
Backtest Review
- Sharpe
- 0.33
- Total return
- 77.83%
- Max drawdown
- 31.40%
- Trades
- 2000
- Win rate
- 49.6%
- Profit factor
- 1.16
Genuinely different mechanism (pure funding-rate cross-section, not price); funding IS credited by the engine so the carry is real
Well-measured (2000 trades over 6.5 years); iteration-6 exposure caps stopped the prior 19x blowup
avg_trade_return_pct 0.232% nominally clears fees (commission 3.9% of gross)
Not significant: Sharpe 0.328 with CI [-0.408, 1.078] straddling zero, PSR 0.786, PF 1.16
Edge is a 2021-2022 funding-dispersion artifact that decayed: 2024 +0.4%, 2025 +2.4%, 2026 -1.5% — the last-20% holdout is flat-to-negative (the very funding-carry decay the hypothesis claimed to avoid)
'Delta-neutral' book carries end_unrealized_pct -146.5 (legs deeply underwater at end); +41%/+24% single days at ~1x gross and kurtosis 13.2 show leg divergence, not neutrality
max_drawdown 31.4% with CI to 88.7%; L45/L52/L57 market-neutral cross-sectional funding-carry basket (0/84 / near-zero survival)
Iteration History
Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['min_notional', 'min_universe', 'exit_quantile', 'entry_quantile', 'gross_exposure', 'rebalance_band', 'rebalance_bars', 'min_funding_spread', 'funding_lookback_events'] 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: 1735690140000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690140000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690140000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690140000) - zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690140000) - price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690140000)
Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSDT.BINANCE-8-HOUR-LAST-EXTERNAL, Bars processed: 7107 Diagnostics: should_enter() returned a side 0 times over 6306 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.
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).
Backtest and paper results are hypothetical. Trading involves risk of loss.