Strategies
SOL Perp-Index Premium Overshoot Fade, Long-Short (Single-Instrument BINANCE USD-M Perp vs its INDEX, DEEP mark/index Klines, Fade the Perp Back Toward Spot Index When the Basis Dislocates > 0.35% During a Fast Move — Mechanical Convergence ENFORCED by Funding + Arbitrage, a Non-Price Basis Signal — Fast Snapback Hold, Hard Widen-Stop, 2-Parameter)
Outcome: Abandoned
SolPerpIndexPremiumOvershootFadeLS5m
The premium_index (mark-vs-index basis) feed is a genuine non-price signal and is wired correctly (346 funding events / deep series, 6792 entries submitted), so this is not a data/plumbing defect.
Hypothesis
Account liquidated in the first month (total_return -100%, max_drawdown 100%) with negative net expectancy (avg_trade_return_pct -0.147%, profit_factor 6.4e-05, expectancy -$45/trade). The basis-fade has a catastrophic left tail (avg_loss $59.8 vs avg_win $0.01, largest_loss -$2463, skew -12.3, kurtosis 177) — fading transient perp-index overshoots gets run over precisely during the fast moves the thesis targets, and the widen-stop does not cap the tail. L73 single-perp supplementary-gated + L55 single-name fade family (zero survivors); no threshold tuning turns a liquidating, negative-expectancy fade into an edge. Not worth 2 hours of optimization.
Implementation
Long-short, single-instrument fade of the SOLUSDT.BINANCE USD-M perp against its spot index on 5-MINUTE bars. The decision variable is the published mark-vs-index premium (premium_index / premiumIndexKlines close = (perp_mark - index)/index), read as-of each bar close by O(log n) bisection over a numpy array parsed once at construction. When the perp trades >= +0.15% RICH to its index the strategy SHORTS the perp; when it is >= 0.15% CHEAP it goes LONG; it exits when the basis converges back inside 0.03%, on a hard widen-stop if the dislocation grows another 0.15% against the fade, on a 1.2% adverse price move, or after a 30-minute (6-bar) intraday time cap. Convergence is mechanically enforced by funding pulling the perp toward the index TWAP plus cross-market arbitrage, so this is not a hopeful price reversion and the signal is not price geometry.
Verification Results
Verification failed (Layer 1 — config): config.instrument_id and config.bar_type are REQUIRED (got instrument_id=None, bar_type=None). Set both to the hypothesis's instrument, e.g. instrument_id='BTCUSDT.BINANCE', bar_type='BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL'.
Let the optimizer sweep basis_entry; confirm ≥100 trades AND avg_trade_return_pct > 0.15%.
Hypothesis headline threshold is 0.35% but code fires at 0.15%; documented recalibration to the measured SOL premium distribution. Structure matches (entry/convergence-exit/widen-stop/time-cap), so allowed magnitude change, not a mismatch.
No fix required; treat the convergence premise as unproven until the full backtest shows positive net expectancy.
Single-leg basis fade with no index hedge — PnL realized only on the perp, so index-driven convergence pays little. Inherent to the single-instrument hypothesis, not a code defect, but weakens the 'mechanically-enforced convergence' claim.
Backtest Review
- Sharpe
- -3.36
- Total return
- -100.00%
- Max drawdown
- 100.00%
- Trades
- 6792
- Win rate
- 24.7%
- Profit factor
- 0.00
The premium_index (mark-vs-index basis) feed is a genuine non-price signal and is wired correctly (346 funding events / deep series, 6792 entries submitted), so this is not a data/plumbing defect.
The account was LIQUIDATED on 2020-10-10: total_return -100%, max_drawdown 100.0%, calmar/recovery -1.0. The backtest never even reached 2021 — equity went to zero in the first month of trading.
Negative expectancy net of costs: avg_trade_return_pct -0.147% (below zero, not just below the 0.15% fee floor), profit_factor 0.0000639, expectancy -$45.0/trade over 6792 trades.
Catastrophic left-tail asymmetry: avg_win $0.01 vs avg_loss $59.8, largest_win $1.21 vs largest_loss -$2463, return_skew -12.3, kurtosis 177, tail_ratio 0.0001, omega 0.0. The fade collects tiny convergence wins and eats enormous losses when the basis keeps widening — the widen-stop/price backstop does not cap the tail.
Decisively bad risk-adjusted metrics: Sharpe -3.36 (CI [-6.59, -2.76], entirely below zero), Sortino -3.35, PSR 0.0, information_ratio -8.34, alpha -41.6.
This is the L73 single-perp supplementary-gated (premium/basis) directional family (zero survivors) combined with the L55 single-name fade signature — fading intraday basis excursions on a single alt gets adversely selected during exactly the fast moves the thesis targets.
Iteration History
Verification failed (Layer 3 — sandbox backtest): 'SolPerpIndexPremiumOvershootFadeLS1m' object has no attribute 'subscribe_mark_price_updates' Bar type used: SOLUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, Bars processed: 0 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).
sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (69 days of SOLUSDT.BINANCE-5-MINUTE-LAST-EXTERNAL). 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.