Vai al contenuto
Tutte le strategie

Strategie

Hyperliquid SOL Perp Funding-Extreme Contrarian — Long-Short, Single-Name: FADE Posizionamento Affollato Quando lo Z-Score Rolling del Funding Raggiunge un Estremo (Funding Molto Positivo = Long Sovra-Leveraggiati → SHORT; Molto Negativo = Short Capitolati → LONG), Confermato dalla Non-Conferma del Prezzo, Uscita su Reversione del Funding / Stop ATR / Time Stop (SOLUSDT.HYPERLIQUID, 4H, 3-Parametri)

Esito: Abbandonato

HyperliquidSolFundingExtremeContrarian

Il meccanismo si attiva correttamente e produce un campione adeguato (201 trade in 953 giorni) senza timeout — l'implementazione O(log n) del funding funziona come previsto

Ipotesi

Una strategia LONG-SHORT, single-instrument, guidata da POSITIONING, contrarian sul perpetual Hyperliquid SOL, costruita attorno a un segnale meccanico NON-OHLCV — perpetual FUNDING — ha percorso la via OPPOSITE verso la famiglia morta del cash-and-carry della factory. Questo non è NOT un carry delta-neutral (morto perché il P&L da funding era troppo piccolo rispetto al rumore della base) né NOT momentum di prezzo (i basket momentum HL sono 0/84). Invece, il funding viene usato come misura di……Mostra altroMostra meno

Una strategia LONG-SHORT, single-instrument, guidata da POSITIONING, contrarian sul perpetual Hyperliquid SOL, costruita attorno a un segnale meccanico NON-OHLCV — perpetual FUNDING — ha percorso la via OPPOSITE verso la famiglia morta del cash-and-carry della factory. Questo non è NOT un carry delta-neutral (morto perché il P&L da funding era troppo piccolo rispetto al rumore della base) né NOT momentum di prezzo (i basket momentum HL sono 0/84). Invece, il funding viene usato come misura di crowding/posizionamento per temporizzare un fade DIRECTIONAL: il risultato ben documentato secondo cui quando il funding del perp è estremamente positivo, i long sono sovra-leveraggiati e pagano per mantenere la posizione — uno stato che storicamente precede rendimenti forward del perp LOWER (rischio di squeeze/washout), e simmetricamente il funding estremamente negativo segna short capitolati che precedono rimbalzi. Scelta per riempire contemporaneamente tre bucket sotto-rappresentati: HYPERLIQUID (6.8% vs target 20%), long_short (14.2%), e un edge data-safe non-OHLCV che non è nel cimitero da overfit OHLCV. Single-name e 3-parametri deliberatamente, per mantenerla implementabile (i basket HL multi-instrument sono morti per timeout di codifica) e per resistere all'overfitting. IMPLEMENTATION NOTE: mantenere la baseline del funding come deque rolling aggiornata incrementalmente (O(1) per aggiornamento) — NEVER riscansionare l'intera serie di funding dentro on_bar (quel pattern ha causato i ripetuti timeout del sandbox 300).

L'iterazione 2 corregge l'unico fallimento Layer-2 (`FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given`, tutti e sei gli scenari). Il `_StrategyProxy` del Layer-2 riassocia ogni attributo callable della strategia a un wrapper semplice tramite `types.MethodType`, il che converte lo staticmethod `_bar_ts` a un argomento della classe base in un metodo bound — così `self._bar_ts(bar)` arriva con due argomenti. La correzione minima sostituisce quell'unica chiamata con un helper……Mostra altroMostra meno

L'iterazione 2 corregge l'unico fallimento Layer-2 (`FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given`, tutti e sei gli scenari). Il `_StrategyProxy` del Layer-2 riassocia ogni attributo callable della strategia a un wrapper semplice tramite `types.MethodType`, il che converte lo staticmethod `_bar_ts` a un argomento della classe base in un metodo bound — così `self._bar_ts(bar)` arriva con due argomenti. La correzione minima sostituisce quell'unica chiamata con un helper `_bar_timestamp_ns(bar)` a livello di modulo che legge `bar.ts_event` (ricadendo su `ts_init`) direttamente — comportamentalmente identico, immune alla riassociazione del proxy. Nient'altro è cambiato: import, struttura della classe, parsing del funding, logica del segnale, entrate, uscite e sizing sono byte-identici a previous_code che ha superato il Layer 1, quindi nessun controllo precedente può regredire. Nota: `_bar_interval_ns` viene comunque chiamato da `__init__`, che viene eseguito sull'istanza reale prima che il proxy riassoci qualsiasi cosa, quindi non ne è influenzato. Il leverage 2.0 viene consumato in `position_size` tramite `self.config.leverage` nel cap sul notional lordo.

Fade contrarian su funding-extreme single-name a expectancy negativa — nessun edge da ottimizzare. PF 0.60, total_return -33.7%, Sharpe -0.42, expectancy -$156/trade, e avg_trade_return_pct -0.37% (negativo, sotto la soglia minima delle commissioni Hyperliquid di 0.15%, L22). In perdita in ogni anno (2024 -14.8%, 2025 -13.8%, 2026 -6.5%) con entrambe le gambe long e short con win rate sub-43% e avg_loss > avg_win — il fade contrarian è sistematicamente dalla parte sbagliata del movimento, e l'unico mese positivo è un singolo giorno outlier +10.77% (kurtosis 9.8). Il meccanismo è ben implementato (nessun timeout, funding accreditato) ma rientra in due famiglie a zero superstiti: mean-reversion/fade single-name (L55) e directional gated da supplementary(funding) single-perp (L73). Il gate di non-conferma del prezzo non ha aggiunto un edge reale. Il segno dell'edge per trade è negativo, cosa che nessuna calibrazione dei parametri può invertire. Non vale 2 ore di ottimizzazione. Pattern di fallimento: fade contrarian gated da funding single-perp fee_edge/no_edge.

Implementazione

Contrarian long-short single-name sul perp Hyperliquid SOL (barre 4H). Il funding viene usato come misura di crowding: uno z-score rolling del print hl_funding_rates rispetto alla propria distribuzione trailing viene restituito ogni barra come segnale continuo. Lo z estremo positivo (long affollati, che pagano troppo) viene fadato con SHORT; lo z estremo negativo (short capitolati) viene fadato con LONG, ma solo quando il prezzo non conferma la folla (chiusura che non fa un nuovo massimo/minimo su confirm_bars barre). Uscite su reversione del funding (|z| <= exit_z), uno stop ATR fissato all'entrata, o un time stop calendario misurato da position.ts_opened. Il sizing è risk-first: lo stop ATR costa ~risk_frac dell'equity, con un cap indipendente sul notional lordo.

Risultati di verifica

CLEAN RESTART 2026-09-04 — la cronologia dei verdetti e i record di apprendimento di questa run sono stati rimossi ed è stata riavviata dalla verifica. Il suo precedente abbandono derivava dalla pipeline, non dal mercato: l'harness Layer-2 associava in modo errato gli helper @staticmethod (risolto), QA emetteva verdetti di performance definitivi su uno smoke test non ottimizzato (rimosso — QA ora giudica solo la correttezza), e i timeout del sandbox derivavano dalla saturazione degli slot di backtest (risolto). L'ipotesi e il codice della strategia sono invariati. Verificare il codice sui suoi meriti; la performance verrà decisa in seguito dal backtest completo e dall'ottimizzatore.

Restringere _param_bounds ai 3 tunable principali (entry_z, exit_z, funding_lookback_prints); bloccare i parametri di rischio/plumbing come costanti.

L'ipotesi propone un design '3-parametri deliberatamente, per resistere all'overfitting', ma _param_bounds espone 11 parametri ottimizzabili. Il meccanismo è corretto, ma una ricerca walk-forward a 11 dimensioni contraddice la motivazione anti-overfit dichiarata e aumenta il rischio di PBO. Non bloccante.

Nessuna azione richiesta; annotato per l'analista.

I segnali sintetici Layer-2 sono tutti congelati a 0.0 (nessun funding iniettato), quindi il percorso di trading è stato esercitato solo dal sandbox (che ha tradato 65 volte su funding reale). Non fatale.

Revisione Backtest

Sharpe
-0,42
Rendimento totale
-33,71%
Drawdown massimo
40,24%
Operazioni totali
201
Tasso di successo
42,3%
Profit Factor
0,60

Il meccanismo si attiva correttamente e produce un campione adeguato (201 trade in 953 giorni) senza timeout — l'implementazione O(log n) del funding funziona come previsto

Single-instrument, singolo feed supplementary (hl_funding_rates), nessuna patologia di dati/verifica; il funding viene accreditato nel PnL

Expectancy negativa: profit_factor 0.60, total_return -33.7%, expectancy -$156/trade

avg_trade_return_pct -0.37% — negativo e ben al di sotto della soglia minima delle commissioni Hyperliquid di 0.15% (L22)

In perdita in tutti e tre gli anni (2024 -14.8%, 2025 -13.8%, 2026 -6.5%) — un'assenza di edge persistente, non decaduta

Entrambe le gambe perdono (win long 42%, win short 42%) con avg_loss > avg_win — il fade su funding-extreme è dalla parte sbagliata del movimento

L'unico mese positivo è un singolo giorno outlier +10.77% (kurtosis 9.8); il tape sottostante è uniformemente negativo

Fade directional gated da funding single-name — classi a zero superstiti mean-reversion (0/174) e directional gated da supplementary single-perp (L73)

Cronologia iterazioni

Verifica fallita (Layer 2 — scenari sintetici): Parametri usati: ['exit_z', 'entry_z', 'atr_bars', 'risk_frac', 'min_prints', 'confirm_bars', '_param_bounds', 'atr_stop_mult', 'max_hold_bars', 'max_lag_seconds', 'max_notional_frac', 'funding_lookback_prints'] Verificare che __init__ imposti tutti gli attributi da self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - steady_downtrend: TypeError:……Mostra altroMostra meno

Verifica fallita (Layer 2 — scenari sintetici): Parametri usati: ['exit_z', 'entry_z', 'atr_bars', 'risk_frac', 'min_prints', 'confirm_bars', '_param_bounds', 'atr_stop_mult', 'max_hold_bars', 'max_lag_seconds', 'max_notional_frac', 'funding_lookback_prints'] Verificare che __init__ imposti tutti gli attributi da self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - zero_volume: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000) - price_gap: TypeError: FactoryStrategy._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735690500000)

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.