Vai al contenuto
Tutte le strategie

Strategie

BTC Convergenza della base trimestrale cash-and-carry, neutrale al mercato (long BTCUSDT.BINANCE_SPOT + short sul future BTC USD-M DATED QUARTERLY con scadenza più vicina, mantenuto fino al regolamento per catturare la base di contango DETERMINISTICALLY-CONVERGENT — funding perp NOT, roll alla scadenza, 2 parametri)

Esito: Abbandonato

BtcQuarterlyBasisConvergenceCarryNeutral

Riepilogo esito

Questa strategia proponeva un vantaggio realmente diverso dai carry di funding perpetuo ormai esauriti della factory: un cash-and-carry delta-neutrale BTC che sfrutta la base dei futures trimestrali a scadenza, convergente in modo deterministico, mantenendoli fino al regolamento e rinnovandoli ogni trimestre con soli due parametri regolabili. Non ha mai prodotto un backtest: in 3 iterazioni l'esecuzione è fallita perché il motore non riusciva a ottenere lo storico dei funding per la gamba trimestrale 'BTCUSDT_230929.BINANCE', trattando il contratto a scadenza come un perpetuo e bloccando l'esecuzione per garantire l'accuratezza. Non essendo mai state raggiunte le fasi di backtest, revisione del backtest, ottimizzazione o analisi, la strategia è stata abbandonata a causa di una dipendenza dai dati e dall'infrastruttura, non per i suoi meriti economici. L'ipotesi aveva segnalato esplicitamente che la disponibilità dei dati sui contratti trimestrali era la dipendenza decisiva, ed è proprio lì che la pipeline si è fermata.

Ipotesi

Un cash-and-carry MARKET-NEUTRAL su BTC che sfrutta la base QUARTERLY-FUTURE, radicalmente diverso da ogni carry funding/perp fallito in questa fabbrica. I carry falliti (BTC/AVAX/BNB/ETH spot-perp, tutti fee_edge) si basavano sul funding PERP: un flusso di cassa esiguo (mediana ~1bp/8h), senza convergenza, che non supera mai il costo di andata e ritorno. Un future trimestrale DATED è diverso per natura: deve convergere allo spot AT SETTLEMENT (deterministico, contrattuale) e i trimestrali BTC vengono scambiati……Mostra altroMostra meno

Un cash-and-carry MARKET-NEUTRAL su BTC che sfrutta la base QUARTERLY-FUTURE, radicalmente diverso da ogni carry funding/perp fallito in questa fabbrica. I carry falliti (BTC/AVAX/BNB/ETH spot-perp, tutti fee_edge) si basavano sul funding PERP: un flusso di cassa esiguo (mediana ~1bp/8h), senza convergenza, che non supera mai il costo di andata e ritorno. Un future trimestrale DATED è diverso per natura: deve convergere allo spot AT SETTLEMENT (deterministico, contrattuale) e i trimestrali BTC vengono scambiati in CONTANGO persistenti, di solito 5-15% ANNUALIZED (circa 125-375 punti base su una detenzione di ~90 giorni): un ordine di grandezza sopra il costo di andata e ritorno delle due gambe, circa 0.30%, e supera ampiamente la soglia di L1 >20bps/ciclo, perché la base è un premio a termine, non un tick di funding. Struttura: LONG BTC spot + SHORT il future trimestrale BTC USD-M quotato con scadenza più vicina, a nozionale uguale (delta-neutral); mantieni le posizioni fino al regolamento, o quasi, per catturare la convergenza con un costo di andata e ritorno in entrata essenzialmente ONE e senza operazioni inutili in uscita (le gambe convergono da sole), poi passa al trimestrale successivo. Così eviti ALL i soliti fattori che hanno ucciso le strategie: FEE_EDGE — base molto superiore alle commissioni e detenzione fino al regolamento, circa 2 eseguiti per trimestre, rotazione quasi nulla; MULTI-REGIME — la base esiste e converge nei mercati rialzisti e ribassisti AND (non è un effetto beta di un singolo regime come nei timer solo long); OVERFIT — 2 parametri (soglia della base in entrata, tempistica del roll), nessuna superficie di selezione; inoltre non appartiene alla classe delle strategie di inversione abbandonate. Completa i gruppi sottorappresentati cross-venue (7.3%) e direzionali neutrali al mercato. CRITICAL DATA DEPENDENCY (segnalato affinché il processo fallisca subito, senza cicli inutili): servono dati kline storici per i contratti trimestrali DATED BTC USD-M nel catalogo. Prima di scrivere il codice, chi sviluppa deve verificare che esista la cronologia dei future trimestrali per la finestra di backtest BEFORE; se sono disponibili solo barre perp/spot, abbandona subito (non sostituire con il perp, perché si tornerebbe al carry funding fallito).

L’iterazione 3 risolve l’unico blocco Layer-3: il test rapido della sandbox ha superato 300s. Il mio lavoro per barra è già O(1) (un ciclo di dimensione fissa sulla catena trimestrale, senza scansioni ripetute dello storico né min()/sorted() sui dati a ogni barra), quindi la diagnosi generica di «lavoro per barra che cresce con lo storico» non era applicabile. Il costo reale proveniva da DATA VOLUME: l’intervallo spot 1-DAY copre 2017→2026 (circa 9 anni, verificati sull’intervallo del file di catalogo) e i……Mostra altroMostra meno

L’iterazione 3 risolve l’unico blocco Layer-3: il test rapido della sandbox ha superato 300s. Il mio lavoro per barra è già O(1) (un ciclo di dimensione fissa sulla catena trimestrale, senza scansioni ripetute dello storico né min()/sorted() sui dati a ogni barra), quindi la diagnosi generica di «lavoro per barra che cresce con lo storico» non era applicabile. Il costo reale proveniva da DATA VOLUME: l’intervallo spot 1-DAY copre 2017→2026 (circa 9 anni, verificati sull’intervallo del file di catalogo) e i trimestrali 11 a 4-HOUR aggiungevano circa 12k eventi barra. Il flusso combinato di più strumenti (circa 15k eventi su 12 gambe di strumenti, ciascuna con commissioni, analisi e gestione dei valori di riferimento) superava il limite. La modifica minima efficace lascia invariato tutto il codice della strategia (corretto per i crediti, roll convalidato) e riduce solo il volume dei dati tramite la configurazione: (1) riduci la catena da 11 a 8 contratti consecutivi (sempre circa 2 anni, 2023H2–2025H1, coprendo la ripresa ribassista 2023 e il rialzo 2024: più regimi, circa 8 convergenze, nettamente diagnostiche rispetto al fallimento dell’iter-2 con n=1); e (2) riduci la granularità degli extra trimestrali da 4-HOUR a 12-HOUR (2 barre/giorno → circa 360 per contratto invece di circa 1090). Così il volume di eventi scende da circa 15k a circa 6.1k (~2.4×) e gli strumenti da 12 a 9, una riduzione che dovrebbe portare l’esecuzione ben sotto 300s. La risoluzione 12-HOUR è molto più fine di quanto serva per un carry sulla base di circa 90 giorni e resta su un orizzonte temporale DIFFERENT rispetto a quello primario 1-DAY (evita così il vincolo di allineamento temporale che altrimenti bloccherebbe i contratti scaduti). Ho verificato che tutti i 8 contratti hanno barre 12-HOUR non vuote (nessun trimestre saltato senza avviso) e formano una catena consecutiva senza lacune da Sep23 a Jun25, così il roll resta continuo. Non sono cambiate la logica del codice, le importazioni o le due manopole regolabili: i Layer 1–2 e il comportamento del roll convalidato restano invariati; per rispettare il limite di performance sono cambiati solo l’elenco degli extra e il loro orizzonte temporale.

backtest_failed: RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco) Traceback (chiamate più recenti per ultime): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 190, in _run_backtest await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs) File "/opt/strategy-factory/src/agents/backtest_agent.py", line 406, in _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco)

Implementazione

Strategia cash-and-carry BTC neutrale rispetto al mercato, che incassa il basis dei future trimestrali DATED e ROLLS lungo una sequenza di trimestrali consecutive. Primario = BTCUSDT.BINANCE_SPOT (1-DAY, continuo, governa il clock); strumenti aggiuntivi = otto future trimestrali datati consecutivi BTC USD-M (BTCUSDT_230929 … 250627) su barre 12-HOUR (un timeframe più ampio e diverso da quello primario, affinché i contratti scaduti o non ancora quotati non blocchino la barriera di allineamento sullo stesso……Mostra altroMostra meno

Strategia cash-and-carry BTC neutrale rispetto al mercato, che incassa il basis dei future trimestrali DATED e ROLLS lungo una sequenza di trimestrali consecutive. Primario = BTCUSDT.BINANCE_SPOT (1-DAY, continuo, governa il clock); strumenti aggiuntivi = otto future trimestrali datati consecutivi BTC USD-M (BTCUSDT_230929 … 250627) su barre 12-HOUR (un timeframe più ampio e diverso da quello primario, affinché i contratti scaduti o non ancora quotati non blocchino la barriera di allineamento sullo stesso timeframe e il flusso di eventi multi-strumento rimanga contenuto). A ogni barra spot individua il future trimestrale con scadenza più vicina e margine temporale per la convergenza (LIVE ≥ min_entry_days), calcola il basis annualizzato ((future − spot)/spot × 365/giorni alla scadenza) e, quando non ha posizioni aperte, avvia il carry se tale basis è ≥ entry_basis_annual: spot con uguale nozionale LONG (CASH sicuro BUY) + SHORT sul future trimestrale (BINANCE MARGIN), con delta neutro. HOLDS fino a roll_buffer_days prima del regolamento, CLOSES entrambe le gambe, quindi passa al successivo future trimestrale frontale attivo — circa 4 convergenze all’anno. Una protezione contro le gambe nude chiude entrambe le gambe se una sola è presente. La scadenza viene ricavata dal simbolo di ciascun contratto; il dimensionamento è lineare (nozionale/prezzo), indipendente dal percorso e soggetto a un limite massimo. Due parametri regolabili: entry_basis_annual, roll_buffer_days.

Risultati di verifica

Verifica non superata (Layer 3 — backtest sandbox): il test rapido ha superato il limite di tempo reale di 300s. Questo significa quasi sempre che il lavoro per barra cresce con la storia, per esempio riesaminando l’intera serie di funding/dati supplementari o ricreando una lista e chiamando min()/sorted() dentro calculate_signal()/on_bar() a ogni barra. Precalcola gli array ordinati di timestamp ONCE in __init__ e usa bisect, oppure memorizza i risultati in cache usando il timestamp come chiave, così il costo per barra è O(log n) invece di O(n).

Estendi extra_instruments alla catena trimestrale FULL BTC (~16-20 contratti dal 2020) usando barre trimestrali a granularità ampia 12H/1D, così da rientrare nel limite della sandbox e ottenere metrics_reliable=true, con diverse convergenze in ogni finestra walk-forward. Solo estensione della configurazione: la logica di roll gestisce già catene di lunghezza arbitraria.

Il conteggio delle convergenze è marginale (8) e metrics_reliable=false — al di sotto di ~16-20, il valore a cui puntavo in iter-1. Lo sviluppatore ha limitato la catena a 8 contratti per il budget di Layer-3. UNLIKE rispetto ai macro trend follower che hanno fallito, questa è una modifica della configurazione facilmente attuabile, non un limite intrinseco: si possono ottenere facilmente più convergenze elencando altri contratti trimestrali storici datati di BTC (fino a ~2020). È fondamentale che i dati forniscano riscontri diagnostici a sostegno del vantaggio anche con n=8: Sharpe CI [1.14, 46.66] presenta un limite inferiore pari a POSITIVE (esclude lo zero) e la distribuzione è regolare (asimmetria -0.56, curtosi 2.37) — in netto contrasto con i trend follower, i cui intervalli di confidenza comprendevano valori fortemente negativi. Il vantaggio della convergenza deterministica rende 8 eventi quasi indipendenti una prova concreta, non un colpo di fortuna.

Valuta soprattutto le convergenze walk-forward (catena estesa), non l’holdout di 15 giorni; avvisa l’operatore se il vincolo sull’holdout blocca carry validi mantenuti per un trimestre.

Nota sull’orizzonte (come per le strategie macro): detenzioni di circa 90 giorni significano che l’holdout di 15 giorni contiene circa 0 convergenze chiuse, quindi è strutturalmente difficile valutarlo con il vincolo sull’holdout. È meno limitante che per le strategie trend following, perché la catena estesa offre convergenze sufficienti per finestre walk-forward diagnostiche; l’operatore dovrebbe comunque tenere presente che le strategie con detenzione trimestrale richiedono un trattamento dell’holdout adeguato all’orizzonte.

Confermare la neutralità delta e il contributo della base di ciascun trimestre nel backtest completo con la catena estesa.

Due verifiche di coerenza degli analisti (nessuna è un difetto del codice): (1) exposure_pct 227% — per una coppia spot + future short delta-neutral a capital_frac 0.45/leg, il lordo previsto è circa 0.90x; 227% è probabilmente un artefatto del nozionale lordo/valutazione al prezzo corrente (beta 0.0105, max_dd 3.24%, perdite/profitti quasi simmetrici largest_win confermano che il portafoglio è IS neutrale), ma verifica che il dimensionamento non derivi lungo la catena estesa. (2) avg_loss ($13,905) supera leggermente avg_win ($12,384) a win_rate 0.5625: risultato netto positivo, ma alcune convergenze trimestrali sono sfavorevoli (backwardation/ampliamento del basis prima del roll); verifica che il vantaggio non dipenda da uno o due trimestri di contango elevato.

Nessuno nel codice: il roll è solido e riutilizzabile su una catena di lunghezza arbitraria.

CREDIT (nessun difetto): il ROLL è implementato correttamente secondo la mia richiesta iter-1: _candidate seleziona il trimestrale quotato con scadenza più vicina e margine temporale sufficiente (3 controllo _live di obsolescenza di giorni + _dte per contratto), mantiene la posizione fino a roll_buffer_days prima del regolamento, poi passa al trimestre frontale successivo; scadenza ricavata per contratto, protezione dalle gambe scoperte, gambe delta-neutral a nozionale uguale (con margine lineare USDT), spot solo BUY (CASH-safe), dimensionamento limitato e indipendente dal percorso, lavoro per barra O(1). L’orizzonte temporale trimestrale 12-HOUR (diverso da quello primario 1-DAY) evita correttamente il blocco di allineamento temporale causato da contratti scaduti/non quotati. Meccanismo convalidato: 8 convergenze pulite di 90 giorni, circa 4/anno, sostenibile al netto delle commissioni (1.06% commissioni).

Cronologia iterazioni

Verifica fallita (revisione 4 — QA): - Il design dichiarato nell’ipotesi, «rolled at expiry» ROLLING MULTI-QUARTER, è NOT implementato. Il titolo («Rolled at Expiry») e la descrizione («poi passa al trimestre successivo») specificano una serie a rotazione, ma il codice negozia un contratto SINGLE più vicino (BTCUSDT_241227) e si ferma dopo una sola convergenza: non c’è alcun roll. Ecco perché il backtest produce esattamente un’operazione. La logica del carry per contratto è corretta, ma manca il meccanismo di……Mostra altroMostra meno

Verifica fallita (revisione 4 — QA): - Il design dichiarato nell’ipotesi, «rolled at expiry» ROLLING MULTI-QUARTER, è NOT implementato. Il titolo («Rolled at Expiry») e la descrizione («poi passa al trimestre successivo») specificano una serie a rotazione, ma il codice negozia un contratto SINGLE più vicino (BTCUSDT_241227) e si ferma dopo una sola convergenza: non c’è alcun roll. Ecco perché il backtest produce esattamente un’operazione. La logica del carry per contratto è corretta, ma manca il meccanismo di rotazione che renderebbe la strategia ripetibile e misurabile. - UNMEASURABLE — il sandbox ha prodotto una sola convergenza (1 total_trades 2 = una coppia di leg), metrics_reliable=false («solo 1 rendimento giornaliero»), data_days 1, Sharpe/PSR/CI tutti null. Una singola operazione non è diagnostica (L16/L26): una cattura favorevole del basis in un mercato rialzista 2024-H2 non convalida la persistenza, e l’ottimizzazione in 3 fasi (sensibilità, finestre 3 walk-forward, holdout) non può essere eseguita con n=1. Questa è la conseguenza strutturale dell’assenza del roll: un carry mantenuto fino al regolamento ha circa 4 operazioni/anno, quindi un singolo contratto ne produce soltanto 1. - CREDIT (nessun difetto) + cautela sui dati per la versione con rotazione: l’implementazione a singolo contratto è CORRECT e il meccanismo è davvero innovativo e promettente: legge il vero DATED trimestrale (non il perp, quindi NOT il carry morto basato sul funding), calcola correttamente il basis annualizzato, usa leg delta-neutral con nozionale uguale (lineare con margine USDT, evitando la trappola COIN-M), leg spot solo BUY (CASH-safe), ricava la scadenza dal simbolo, protegge da leg scoperti e dimensiona le posizioni con un limite indipendente dal percorso; l’unica convergenza è stata positiva al netto dei costi (+1.80%), con commissioni pari a 0.64% del lordo: supera nettamente i costi e introduce il primo meccanismo di mercato neutrale davvero diverso dopo una serie di mean reversion fallite. Quando implementi la rotazione, verifica la copertura delle kline per ogni trimestre, così un contratto mancante non farà saltare trimestri senza segnalarlo.

RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco) Traceback (chiamate più recenti per ultime): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 190, in _run_backtest await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs) File "/opt/strategy-factory/src/agents/backtest_agent.py", line 406, in _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco)

Riepilogo esito

L’ipotesi indicava la disponibilità di dati/kline storici per i trimestrali con scadenza come dipendenza da verificare subito, e si è rivelata decisiva: prima di poter valutare un carry sulla base trimestrale, occorre soddisfare il requisito del framework di backtest relativo ai dati di funding per la gamba futures, oppure aggirarlo tramite SF_DISABLE_ONDEMAND_FUNDING.

È stata abbandonata dopo 3 iterazioni, quando il backtest è fallito con un RuntimeError: i dati di funding non erano disponibili per la gamba 'BTCUSDT_230929.BINANCE' — il motore trattava il trimestrale con scadenza come un perp che richiede lo storico funding, bloccando il backtest per accuratezza.

Un cash-and-carry BTC neutrale rispetto al mercato che acquista spot BTCUSDT e vende allo scoperto il future trimestrale USD-M con scadenza più vicina, mantenendolo fino al regolamento per catturare la base contango che converge in modo deterministico (~5-15% annualizzato), invece del funding scarso dei perpetui.

Non esistono metriche di performance: il backtest non è mai stato completato, quindi non ci sono rendimento, Sharpe o numero di operazioni; la fase di ottimizzazione non è mai iniziata.

Motivo abbandono

backtest_failed: RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco) Traceback (chiamate più recenti per ultime): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 190, in _run_backtest await self._ensure_funding_for_perp_legs(instrument_id, extra_instrs) File "/opt/strategy-factory/src/agents/backtest_agent.py", line 406, in _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: dati di funding non disponibili per la gamba perp 'BTCUSDT_230929.BINANCE' — raccolta su richiesta non riuscita o la piattaforma non dispone dello storico funding (backtest bloccato per accuratezza; imposta SF_DISABLE_ONDEMAND_FUNDING=1 per aggirare il blocco)

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.