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
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
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
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.