ETH Mean reversion della basis perp inter-exchange (Hyperliquid vs Binance, 4H, long-short)
Esito: Abbandonato
EthCrossVenuePerpBasisMeanReversionLS4H
Riepilogo esito
Questa strategia puntava, come previsto, sui bucket sottorappresentati Hyperliquid, cross-venue e long-short, con un trade di basis market-neutral su ETH tra Hyperliquid e Binance, vendendo le dislocazioni con z-score superiore a 2.0 in attesa della convergenza. Sul piano meccanico ha funzionato senza difetti: 446 trade market-neutral senza errori, beta quasi zero e nessun bug. Ha però perso denaro in tutti i mesi tranne uno e in tutti e tre gli anni, con Sharpe -9.85 e rendimento totale -24.9%; le commissioni hanno assorbito il 10.1% del lordo. La revisione del backtest dell’analista ha rilevato che la perdita è intrinseca: un round trip sulle due venue con quattro esecuzioni costa 0.2–0.4%, più di quanto converga la basis ETH di pochi bps. Allargare la soglia d’ingresso riduce soltanto i trade, senza creare edge. La strategia è stata abbandonata alla verifica pre-ottimizzazione dopo 5 iterazioni: il meccanismo è strutturalmente dominato dalle commissioni e non vale la pena ottimizzarlo.
Arbitraggio basis cross-venue market-neutral sui perpetual ETH tra Hyperliquid (ETHUSD.HYPERLIQUID) e i futures Binance USD-M (ETHUSDT.BINANCE). Le due venue hanno partecipanti diversi (HL è dominata da trader sofisticati e retail degen; Binance USD-M è il book perp più profondo al mondo) e cicli di funding diversi (HL ogni ora, Binance ogni 8h). Si creano così spread di prezzo temporanei tra exchange di 0.20–0.80%, che tornano a convergere entro 1–3 barre da quattro ore, mentre gli arbitraggisti cross-venue……Mostra altroMostra meno
Arbitraggio basis cross-venue market-neutral sui perpetual ETH tra Hyperliquid (ETHUSD.HYPERLIQUID) e i futures Binance USD-M (ETHUSDT.BINANCE). Le due venue hanno partecipanti diversi (HL è dominata da trader sofisticati e retail degen; Binance USD-M è il book perp più profondo al mondo) e cicli di funding diversi (HL ogni ora, Binance ogni 8h). Si creano così spread di prezzo temporanei tra exchange di 0.20–0.80%, che tornano a convergere entro 1–3 barre da quattro ore, mentre gli arbitraggisti cross-venue (market maker e trader di basis) colmano il divario. La strategia rileva quando lo spread percentuale (HL_close - BIN_close) / BIN_close supera una soglia z-score mobile di |z| > 2.0 su un lookback di 60 barre, quindi apre una posizione long sulla venue più economica e short su quella più cara, con lo stesso nozionale. Chiude la posizione quando lo z-score rientra sotto |z| < 0.3 o dopo uno stop temporale di 4 barre (16h). Non è NOT un pattern grafico classico, NOT un trade direzionale di momentum o inversione, né NOT carry sul funding: è pura mean reversion tra venue, generata da un meccanismo di arbitraggio strutturale. Punta contemporaneamente sulla venue HYPERLIQUID sottorappresentata (4.1% contro quota 20%), sull’ambito cross-venue (4.6% contro quota 15%) e sulla direzione long-short (9.2% contro target ~45%).
Correzione iterazione -5 (leverage_set_but_unused). Il filtro esamina il codice della strategia memorizzato per trovare un riferimento alla leva (config.leverage / self._lev / .leverage) e rifiuta la configurazione quando è dichiarata una leva >1 ma manca nel codice. Ho collegato chiaramente la leva al dimensionamento: position_size() ora legge direttamente `leverage = float(self.config.leverage)` e calcola `notional = equity * exposure_frac * leverage`; anche la gamba Hyperliquid speculare usa lo stesso nozionale scalato per la leva, quindi la leva 2x raddoppia il nozionale di entrambe le gambe (un effetto reale sul margine, non inerte). Questa è la modifica minima necessaria per superare il filtro mantenendo intatta tutta la logica del segnale già verificata (z-score dello spread, ingresso/uscita, gestione atomica delle due gambe) e gli import. La leva 2.0 è adatta perché la posizione è market-neutral (long e short con nozionale uguale), quindi 2x per gamba mantiene il rischio direzionale vicino a zero e rende l’edge della basis economicamente rilevante.
Mean reversion della basis cross-venue, dominata dalle commissioni e con edge negativo strutturale, impossibile da ottimizzare: non vale la pena. La basis perp Hyperliquid-Binance di ETH è di pochi bps fino a ~0.3%, ma un round trip market-neutral comporta FOUR esecuzioni taker (apertura e chiusura di entrambe le gambe), quindi il costo minimo di ~0.2-0.4% sulle due venue supera il valore della riconvergenza dello spread. Il backtest perde costantemente: Sharpe -9.85, Sortino -13.8, profit_factor 0.908, omega……Mostra altroMostra meno
Mean reversion della basis cross-venue, dominata dalle commissioni e con edge negativo strutturale, impossibile da ottimizzare: non vale la pena. La basis perp Hyperliquid-Binance di ETH è di pochi bps fino a ~0.3%, ma un round trip market-neutral comporta FOUR esecuzioni taker (apertura e chiusura di entrambe le gambe), quindi il costo minimo di ~0.2-0.4% sulle due venue supera il valore della riconvergenza dello spread. Il backtest perde costantemente: Sharpe -9.85, Sortino -13.8, profit_factor 0.908, omega 0.097, aspettativa -$103/trade, total_return -24.9%; tutti i mesi sono negativi tranne uno e tutti e tre gli anni (2024 -7.6%, 2025 -11.3%, 2026 -6.0%) sono negativi. Le commissioni sono il 10.1% del lordo ($45.9k + $23.4k di impatto). La configurazione attuale seleziona già le dislocazioni più ampie (z d’ingresso >2 su 60 barre), ma continua a perdere con un win rate del 48.4% e avg_win ~ avg_loss: aumentare entry_z o prolungare la detenzione riduce il numero di trade, ma non può portare una basis di pochi bps oltre il costo minimo di 4 esecuzioni. Non è un bug nel codice (la strategia funziona senza errori, è market-neutral e ha beta 0.002) e non c’è una strategia affine cross-venue promossa bloccata su un target non più valido: il meccanismo stesso è limitato dai costi. FAILURE PATTERN: la mean reversion della basis perp cross-venue su un asset principale (ETH HL contro Binance) è strutturalmente dominata dalle commissioni: lo spread inter-exchange negoziabile (pochi bps) è inferiore al costo di round trip sulle due venue, pari a 4 esecuzioni, e produce perdite costanti con PF<1, che non si possono invertire regolando la soglia z.
Implementazione
Mean reversion della basis cross-venue market-neutral sui perpetual ETH tra ETHUSDT.BINANCE (principale) e ETHUSD.HYPERLIQUID (gamba aggiuntiva), barre da 4H. Lo spread percentuale (HL-BIN)/BIN è convertito in z-score su una finestra mobile di 60 barre; quando |z|>2.0, la strategia apre una posizione long sulla venue più economica e short su quella più cara con lo stesso nozionale. Chiude entrambe le gambe alla riconvergenza (|z|<0.3) o dopo uno stop temporale di 4 barre (16h). Il nozionale per gamba = equity * exposure_frac * leverage, quindi la leva configurata di 2x raddoppia davvero l’esposizione lorda.
Risultati di verifica
Verifica non riuscita (leverage_set_but_unused): la configurazione imposta leva=2.0, ma la strategia non usa mai la leva nel dimensionamento. Dimensiona le posizioni in base a essa: nozionale = equity * frazione * leva / prezzo (leggi self.config.leverage), oppure imposta leva=1.0. Così com’è, la leva è inerte e il backtest è identico a 1x.
Revisione Backtest
Sharpe
-9,85
Rendimento totale
-24,94%
Drawdown massimo
27,95%
Operazioni totali
446
Tasso di successo
48,4%
Profit Factor
0,91
La strategia è solida sul piano meccanico e funziona senza errori: 446 trade market-neutral, SyncedBuffer con timestamp allineati, beta davvero basso (0.002) e correlazione col benchmark (0.03), nessuna liquidazione o bug
Punta come previsto sui bucket sottorappresentati Hyperliquid, cross-venue e long-short
Perdita strutturale costante: Sharpe -9.85, Sortino -13.8, profit_factor 0.908, omega 0.097, aspettativa -$103/trade, total_return -24.9%: tutti i mesi negativi tranne uno, tutti e tre gli anni negativi
Dominata dalle commissioni: un round trip di basis cross-venue comporta 4 esecuzioni taker (apertura e chiusura su Binance e sulle gambe HL); le commissioni sono il 10.1% del lordo ($45.9k di commissioni + $23.4k di impatto) e la basis ETH HL-Binance, di pochi bps, non copre questo costo minimo
Anche la selezione degli spread più ampi fallisce: con entry_z>2, il win rate è 48.4% e avg_win ~ avg_loss. Le dislocazioni più ampie non convergono in modo affidabilmente profittevole, quindi aumentare la soglia non può creare edge
Nessun bug nel codice e nessuna strategia affine cross-venue promossa: l’edge negativo è intrinseco al meccanismo, non un errore di implementazione correggibile
Analisi
La strategia perde perché negozia uno spread inferiore al costo del proprio round trip. Prima di ottimizzarla servono due modifiche: (1) aggiungere un filtro d’ingresso sensibile ai costi HARD: entrare solo quando lo spread percentuale RAW |(HL-BIN)/BIN| al momento del segnale supera una soglia che copra il costo del round trip sulle due gambe (BINANCE ~0.10% + HYPERLIQUID ~0.09% ≈ 0.20% per round trip; richiedere uno spread di almeno ~2x di quel valore, per esempio > 0.40%). Uno z-score di 2.0 su uno spread il……Mostra altroMostra meno
La strategia perde perché negozia uno spread inferiore al costo del proprio round trip. Prima di ottimizzarla servono due modifiche: (1) aggiungere un filtro d’ingresso sensibile ai costi HARD: entrare solo quando lo spread percentuale RAW |(HL-BIN)/BIN| al momento del segnale supera una soglia che copra il costo del round trip sulle due gambe (BINANCE ~0.10% + HYPERLIQUID ~0.09% ≈ 0.20% per round trip; richiedere uno spread di almeno ~2x di quel valore, per esempio > 0.40%). Uno z-score di 2.0 su uno spread il cui valore assoluto è di pochi bps non è negoziabile: applica il filtro alla dimensione assoluta dello spread, non solo allo z. (2) Misurare e verificare che lo spread sia REAL, e non un artefatto di disallineamento delle barre: registrare la distribuzione dello spread grezzo all’ingresso. Se gli ingressi avvengono con |spread| di appena 0.05-0.15% (da pochi bps fino a ~15bps), il premio 0.20-0.80% ipotizzato non esiste su questa coppia e il segnale è rumore temporale tra le venue. In tal caso, il meccanismo non può funzionare su ETH HL contro Binance, indipendentemente dalle soglie z, e va riformulato per una coppia di venue con una basis davvero più ampia e dalla convergenza più lenta, oppure abbandonato. Ridurre anche la rotazione: lo stop temporale a 4 barre impone uscite che pagano commissioni senza attendere la convergenza. Rifare il backtest; se la versione filtrata sui costi continua a mostrare profit_factor < 1.0, l’ipotesi è smentita e non si deve passare all’ottimizzazione di 2 ore.
Cronologia iterazioni
Verifica non riuscita (livello 2 — scenari sintetici): Parametri usati: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifica che __init__ imposti tutti gli attributi tramite self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp……Mostra altroMostra meno
Verifica non riuscita (livello 2 — scenari sintetici):
Parametri usati: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars']
Verifica che __init__ imposti tutti gli attributi tramite self.parameters.get().
- steady_uptrend: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- steady_downtrend: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- flat_ranging: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- volatility_spike: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- zero_volume: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- price_gap: TypeError: FactoryStrategy._bar_ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
Verifica non riuscita (livello 2 — scenari sintetici): Parametri usati: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifica che __init__ imposti tutti gli attributi tramite self.parameters.get(). - steady_uptrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000) - steady_downtrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti……Mostra altroMostra meno
Verifica non riuscita (livello 2 — scenari sintetici):
Parametri usati: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars']
Verifica che __init__ imposti tutti gli attributi tramite self.parameters.get().
- steady_uptrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- steady_downtrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- flat_ranging: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- volatility_spike: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- zero_volume: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
- price_gap: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() accetta 1 argomenti posizionali ma ne sono stati passati 2 (timestamp della barra: 1735689600000)
Riepilogo esito
La mean reversion della basis perp cross-venue su un asset principale liquido è limitata dalle commissioni: un round trip su due venue con quattro esecuzioni costa più dello spread di pochi bps che converge, e aumentare la soglia z non può creare un edge che il meccanismo non ha per struttura.
La revisione pre-ottimizzazione del backtest dell’analista ha dato il verdetto «abbandonare», giudicando l’edge negativo strutturale e non un bug. Un round trip sulle due venue comporta quattro esecuzioni taker e un costo minimo di ~0.2–0.4%, superiore allo spread inter-exchange ETH di pochi bps: la strategia è stata fermata prima dell’ottimizzazione in 3 fasi.
Arbitraggio basis market-neutral long-short che calcolava lo z-score dello spread di prezzo del perp ETH tra Hyperliquid e Binance USD-M e, quando |z| > 2.0, apriva una posizione long sulla venue più economica e short su quella più cara, aspettandosi che la dislocazione di 0.2–0.8% tornasse a convergere entro 1–3 barre da quattro ore.
Ha funzionato senza errori ed è rimasta market-neutral (beta 0.002, correlazione col benchmark 0.03) su 446 trade, ma ha perso costantemente: rendimento totale -24.9%, Sharpe -9.85, Sortino -13.8, profit factor 0.908, aspettativa -$103/trade, win rate 48.4% con avg_win ≈ avg_loss; commissioni pari al 10.1% del lordo ($45.9k di commissioni + $23.4k di impatto).
Stratmill è uno strumento di ricerca e paper trading, non una consulenza finanziaria né un broker. I risultati di backtest e paper trading sono ipotetici. Il trading comporta un rischio di perdita.