Torna al catalogo
Season 39 7 Episodi 29 min 2026

Zipline Backtesting Engine

v3.1 — Edizione 2026. Una guida completa del 2026 per padroneggiare il motore di backtesting e live-trading Zipline 3.1 per il trading algoritmico.

Trading Algoritmico Scienza dei Dati Analisi dei Dati
Zipline Backtesting Engine
In Riproduzione
Click play to start
0:00
0:00
1
Il motore di backtesting event-driven
Questo episodio introduce Zipline, un motore di backtesting event-driven in stile Pythonic. Gli ascoltatori scopriranno l'architettura sottostante che previene il look-ahead bias e comprenderanno le complesse dipendenze delle estensioni C necessarie per una solida installazione locale.
4m 11s
2
Il ciclo di vita dell'algoritmo e la gestione dello stato
Questo episodio copre il ciclo di vita principale di un algoritmo Zipline. Gli ascoltatori impareranno come gestire lo stato attraverso migliaia di eventi di trading utilizzando l'oggetto context e come inserire ordini semplici.
3m 54s
3
Market Data Bundles e data ingestion personalizzata
Questo episodio esplora i Market Data Bundles e la data ingestion. Gli ascoltatori impareranno come aggirare i massicci caricamenti di CSV precompilando i dati sui prezzi e costruendo pipeline di ingestion personalizzate.
4m 18s
4
L'Algorithm API e le interazioni con BarData
Questo episodio approfondisce l'Algorithm API, concentrandosi sull'oggetto BarData e sulle funzioni di scheduling. Gli ascoltatori impareranno come interrogare in modo sicuro lo storico point-in-time e automatizzare il ribilanciamento del portafoglio.
4m 25s
5
Trading Calendars personalizzati e mercati globali
Questo episodio spiega come configurare Trading Calendars personalizzati. Gli ascoltatori impareranno a definire gli orari delle borse, gestire le festività e costruire un calendario 24/7 per asset come le criptovalute.
3m 58s
6
Metriche di performance del rischio e valutazione personalizzata
Questo episodio si concentra sul tracciamento e sulla valutazione delle performance della strategia. Gli ascoltatori impareranno come interpretare il DataFrame delle performance e utilizzare gli hook nel ciclo di vita della simulazione per calcolare metriche di rischio personalizzate.
3m 51s
7
Estendere l'architettura di Zipline
Questo episodio finale copre l'architettura estensibile di Zipline. Gli ascoltatori impareranno come sostituire i componenti principali e registrare un blotter personalizzato per l'integrazione con il live trading.
4m 44s

Episodi

1

Il motore di backtesting event-driven

4m 11s

Questo episodio introduce Zipline, un motore di backtesting event-driven in stile Pythonic. Gli ascoltatori scopriranno l'architettura sottostante che previene il look-ahead bias e comprenderanno le complesse dipendenze delle estensioni C necessarie per una solida installazione locale.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 1 di 7. La maggior parte degli algoritmi di trading sembra brillante sulla carta, ma perde immediatamente soldi nei mercati live. Il colpevole più comune è il look-ahead bias. Il tuo codice sbircia per errore il prezzo di chiusura di domani per fare il trade di oggi. L'Event-Driven Backtesting Engine di Zipline 3.0 previene completamente questo problema. In un backtester vettoriale standard, carichi un enorme dataframe di prezzi storici e applichi le operazioni pandas su tutta la timeline in un colpo solo. È un approccio veloce, ma è profondamente sbagliato per simulare la realtà. Puoi facilmente scrivere della logica che fa scattare un ordine di acquisto oggi basato su una rolling average che include per errore i dati della settimana prossima. Zipline elimina questa possibilità forzandoti in uno stream event-driven rigoroso. Simula un vero e proprio exchange finanziario. Quando fai girare un backtest, l'engine agisce come un timekeeper rigoroso. Avanza nella history, tick by tick, o minuto per minuto. Ad ogni step, lancia un evento. Il tuo codice riceve solo i dati disponibili in quel preciso microsecondo. Ispezioni lo stato corrente, piazzi i tuoi ordini e poi aspetti che l'engine faccia avanzare l'orologio. Non puoi guardare avanti, perché i dati futuri non sono ancora arrivati in stream all'engine. Questa architettura garantisce che il tuo backtest rifletta i vincoli reali del live trading. Tuttavia, processare una timeline finanziaria evento per evento in puro Python crea un enorme bottleneck. Potresti trovarti a processare anni di dati di pricing al minuto su migliaia di singole azioni. Per rendere questo event loop computazionalmente fattibile, Zipline scarica pesantemente il lavoro sulle C-extensions. Il core engine si affida a routine precompilate per macinare i numeri abbastanza velocemente da essere utile. Questa dipendenza dalle C-extensions introduce un grosso punto di attrito. Fare il setup di un environment quantitativo robusto da zero è notoriamente difficile. Zipline non è un tool Python standalone. Richiede una profonda integrazione con librerie scientifiche a livello di sistema. Ad esempio, usa TA-Lib, una libreria standard per generare indicatori tecnici di mercato. Si appoggia anche a pacchetti che richiedono LAPACK e BLAS per calcoli pesanti di algebra lineare. Queste sono codebase C e Fortran complesse e legacy. Se provi a buildare questo environment usando un semplice comando pip install, andrai quasi certamente a sbattere contro un muro di errori di compilazione. Pip scarica il codice sorgente di queste dipendenze e prova a compilarle in locale. Questo richiede che il tuo sistema operativo abbia un compilatore C e un compilatore Fortran configurati correttamente, e i giusti file header di sistema già al loro posto. La maggior parte dei sistemi operativi di base non ha tutto questo out of the box. Ecco perché la documentazione di Zipline raccomanda esplicitamente di usare conda invece di pip. Conda non è solo un package manager Python. È un environment e binary manager a livello di sistema. Quando crei un environment conda e installi Zipline tramite il canale conda-forge, non stai compilando nulla dai sorgenti. Conda scarica i binari precompilati per il tuo specifico sistema operativo. Gestisce le C-extensions, TA-Lib e LAPACK senza problemi. L'albero delle dipendenze viene risolto per te, restituendo un environment stabile e pronto per lo sviluppo algoritmico. Ecco il punto chiave. Il rigoroso event loop che rende Zipline matematicamente onesto è esattamente ciò che lo costringe ad affidarsi a pesanti dipendenze C compilate per girare su larga scala. Capendo questa architettura, capisci perché l'installazione è complessa, e perché conda è l'unico modo sensato per buildare il tuo environment. Se vuoi aiutarci a portare avanti lo show, puoi supportarci cercando DevStoriesEU su Patreon. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
2

Il ciclo di vita dell'algoritmo e la gestione dello stato

3m 54s

Questo episodio copre il ciclo di vita principale di un algoritmo Zipline. Gli ascoltatori impareranno come gestire lo stato attraverso migliaia di eventi di trading utilizzando l'oggetto context e come inserire ordini semplici.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 2 di 7. Imposti un semplice contatore nella tua logica di trading usando una variabile globale Python e, a metà del backtest, si resetta o lancia un errore. Nel backtesting event-driven, le variabili globali standard sono una trappola. Per sopravvivere a migliaia di eventi di mercato simulati, ti serve un modo sicuro per tracciare lo state, ed è proprio qui che entrano in gioco l'Algorithm Lifecycle e lo State Management di Zipline. Ogni algoritmo Zipline richiede almeno due funzioni fondamentali: initialize e handle data. Zipline è un sistema event-driven. Passa attraverso i dati storici in ordine cronologico, scatenando un evento per ogni time slice. La funzione initialize viene eseguita esattamente una volta quando inizia il tuo backtest. Prende un singolo argomento chiamato context. Pensa a context come alla memoria persistente del tuo algoritmo. Sotto il cofano è un semplice dizionario Python, ma agisce come un namespace dedicato. Invece di dichiarare variabili globali standard, attacchi il tuo state direttamente a context. Se vuoi tracciare un asset specifico, come le azioni Apple, lo cerchi in initialize e lo assegni a context punto asset. Questo assicura che la reference sopravviva dal primo all'ultimo giorno del backtest. Poi c'è la funzione handle data. Questa viene chiamata ogni volta che c'è un nuovo evento di mercato, come una nuova barra di trading giornaliera. Prende due argomenti: context e data. Conosci già context. È lì che leggi lo state che hai impostato prima o aggiorni le variabili in esecuzione. Il secondo argomento, data, rappresenta l'ambiente di mercato attuale. È la tua lente sulla simulazione in quel preciso momento. Usi data per controllare se un asset è attualmente tradabile, per recuperare il suo prezzo corrente, o per richiedere una finestra storica di prezzi. Considera una strategia standard di crossover a doppia media mobile. Nella tua funzione initialize, definisci il tuo asset target e lo attacchi a context. All'interno di handle data, chiedi all'oggetto data gli ultimi trenta giorni di prezzi per calcolare una media mobile corta, e gli ultimi trecento giorni per una media mobile lunga. Confronti le due medie. Se la media corta incrocia al rialzo la media lunga, è un segnale di acquisto. Lo esegui chiamando la funzione order, passando il tuo context punto asset e un numero target di azioni. Il trading è solo metà del lavoro. Devi anche tracciare come performano i tuoi indicatori nel tempo. Zipline fornisce una funzione built-in chiamata record. Alla fine del tuo blocco handle data, chiami record e gli passi la tua media mobile corta, la media mobile lunga e il prezzo corrente. Zipline raccoglie questi valori registrati ad ogni step e li attacca al dataframe finale delle performance restituito alla fine del backtest. Quando il tuo codice è pronto, hai due modi per eseguirlo. Il primo è tramite la command line interface. Passi il tuo script Python al comando run di Zipline, specificando le tue date di inizio e fine, il tuo capitale iniziale e un file di output per i risultati delle performance. Questo è ideale per pipeline automatizzate o per l'esecuzione remota. Il secondo metodo è interattivo. Se usi i Jupyter Notebook, puoi usare il magic command built-in di Zipline. Digitando percento percento zipline in cima a una cella del notebook, definisci ed esegui l'algoritmo inline, passando le tue date e il capitale come argomenti al magic command. I risultati vengono iniettati direttamente in un dataframe locale, pronti per un'analisi immediata. Ecco il punto chiave. Zipline ti forza a dividere il tuo algoritmo in due oggetti distinti: context per lo state interno che controlli, e data per l'ambiente di mercato esterno. Rispetta questo confine, e il tuo state management rimarrà perfettamente sincronizzato attraverso migliaia di trade. Per questo episodio è tutto. Alla prossima!
3

Market Data Bundles e data ingestion personalizzata

4m 18s

Questo episodio esplora i Market Data Bundles e la data ingestion. Gli ascoltatori impareranno come aggirare i massicci caricamenti di CSV precompilando i dati sui prezzi e costruendo pipeline di ingestion personalizzate.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 3 di 7. La tua logica di trading potrebbe essere completamente impeccabile, ma se carichi file CSV enormi in memoria ogni singola volta che esegui una simulazione, la tua velocità di iterazione subirà una brusca frenata. Il collo di bottiglia raramente è il tuo algoritmo. È la tua data pipeline. Zipline risolve questo problema usando i Market Data Bundles e la Custom Ingestion. Un data bundle è una raccolta di prezzi degli asset e metadati che è stata precompilata in un formato di storage altamente ottimizzato. Invece di fare il parsing di file di testo raw durante una run, Zipline legge da uno storage binario compresso e da un database locale veloce. Questa separazione tra il data processing e l'esecuzione della strategia rende i backtest eccezionalmente veloci. Puoi avviare questa compilazione da riga di comando usando il comando zipline ingest, seguito dal nome del bundle. Zipline include un bundle di default chiamato Quandl, che scarica da internet i dati storici giornalieri standard delle azioni e li scrive direttamente sul tuo disco locale. La maggior parte degli ambienti professionali si basa su dati proprietari. Per usare i tuoi dati, devi creare un custom bundle. Creare un custom bundle richiede la scrittura di una ingest function. Questa funzione agisce come un traduttore dedicato tra la tua sorgente di dati raw e il formato di storage interno di Zipline. Ecco il punto chiave. La ingest function non restituisce un dataset personalizzato. Invece, Zipline passa diversi oggetti writer alla tua funzione, e il tuo codice passa i dati raw a questi writer. La signature della ingest function richiede parametri specifici per gestire questo routing. Prende in input una configurazione dell'environment, il trading calendar, le sessioni di inizio e fine, e gli oggetti writer. I due oggetti fondamentali con cui interagirai sono l'asset database writer e il daily bar writer. L'asset database writer gestisce i tuoi metadati. Gli passi una tabella strutturata che contiene i tuoi simboli, le loro date di inizio e fine, e i nomi degli exchange. Il writer compila queste informazioni in un database locale, in modo che l'engine sappia esattamente quali asset esistono in una determinata trading session. Il daily bar writer elabora la vera e propria price action. Gli fornisci un iteratore che fa lo yield di blocchi di dati sui prezzi. Ogni blocco contiene un identificatore interno dell'asset abbinato a una tabella con i suoi dati di open, high, low, close e volume. Il writer prende questi blocchi e li comprime sul disco. Zipline offre un meccanismo built-in per gestire i file flat standard usando il CSV directory bundle, comunemente chiamato csvdir. Imposti i tuoi dati proprietari salvando i singoli file CSV in un'unica cartella, dando a ogni file il nome del suo ticker symbol. Successivamente, registri questa directory in uno specifico script di configurazione di Zipline chiamato extension file. La registrazione collega semplicemente il nome del tuo custom bundle alla ingest function sottostante, in modo che il tool da riga di comando sappia che esiste. Quando esegui zipline ingest con il tuo nuovo nome custom, il sistema punta la ingest function verso la tua cartella. Itera attraverso i file CSV, estrae i metadati, li passa all'asset database writer e inserisce le righe dei prezzi storici nel daily bar writer. Il parsing del testo, lento e costoso, avviene esattamente una volta. Dopo la ingestion, i tuoi dati proprietari vengono salvati in modo permanente nel formato ottimizzato, immediatamente accessibili per migliaia di iterazioni di backtest ad alta velocità. Il vero potere della custom ingestion è che disaccoppia rigorosamente la data preparation dall'esecuzione della tua strategia, garantendo che la logica di parsing lenta non inquini mai il tuo ambiente di test. Per oggi è tutto. Alla prossima!
4

L'Algorithm API e le interazioni con BarData

4m 25s

Questo episodio approfondisce l'Algorithm API, concentrandosi sull'oggetto BarData e sulle funzioni di scheduling. Gli ascoltatori impareranno come interrogare in modo sicuro lo storico point-in-time e automatizzare il ribilanciamento del portafoglio.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 4 di 7. Gli split azionari e i dividendi possono invalidare istantaneamente la tua price history. Se un'azione subisce uno split due a uno, un loop di backtesting ingenuo penserà che il prezzo sia appena crollato del cinquanta percento. Puoi evitare questo problema usando l'Algorithm API e le interazioni di BarData, che gestiscono automaticamente gli aggiustamenti point-in-time. In Zipline, il core della logica del tuo algoritmo interagisce con un oggetto tipicamente chiamato data, che è un'istanza di BarData. Viene passato ai tuoi event handler, come il tuo data handler principale o le tue scheduled function. Il suo compito principale è servire i dati di pricing e volume esattamente come apparivano in quel preciso momento della simulazione, prevenendo completamente il look-ahead bias. Quando chiami data dot current, gli passi un asset e un field, come price o volume. Ti restituisce il valore più recente disponibile in quel preciso minuto o giorno della simulazione. Quando hai bisogno di una lookback window per calcolare una media mobile o la volatilità storica, chiami data dot history. Gli passi l'asset, il field, il numero di barre e la frequenza, come un giorno o un minuto. Ecco il punto chiave. Sia current che history aggiustano automaticamente i dati restituiti per le corporate action, ma solo fino al tempo di simulazione corrente. Le tue medie mobili non si distorceranno in modo anomalo in una data ex-dividend, perché i prezzi storici sono aggiustati per allinearsi perfettamente con il price frame corrente. Ottieni una time series matematicamente continua senza dover gestire tu stesso i moltiplicatori delle corporate action. Prima di agire su quei dati di prezzo, devi verificare se l'asset è effettivamente tradabile in quel preciso momento. Passare il tuo asset a data dot can trade controlla se l'exchange è aperto per quell'asset e se è attivamente listato. Se un'azione è stata delistata ieri, o non ha ancora tenuto la sua Initial Public Offering, questo restituisce false. Poi, hai data dot is stale. Se un asset è altamente illiquido e non è stato scambiato durante la barra corrente, Zipline farà un forward-fill dell'ultimo prezzo noto per prevenire errori di missing data. Tuttavia, se esegui una strategia di mean-reversion su prezzi in forward-fill, stai facendo trading su dati fantasma. Data dot is stale restituisce true se il prezzo che vedi è riportato da un periodo precedente anziché da un nuovo trade. Controllare sia la tradability che la staleness prima di piazzare un ordine previene un'enorme classe di errori di simulazione. Questo copre gli input, passando all'execution timing. Di default, Zipline chiama il tuo data handler principale a ogni singola barra di simulazione. Se esegui una strategia minute-level, eseguire una logica di rebalance complessa ogni sessanta secondi rallenterà il tuo backtest fino a fermarlo e innescherà transaction cost irrealistici. La soluzione è il metodo schedule function. Lo usi all'interno della fase di initialization del tuo algoritmo per registrare una specifica custom function da eseguire su una timetable precisa. Prende tre argomenti principali. Primo, la funzione che vuoi eseguire. Secondo, una date rule. Terzo, una time rule. Supponi di voler eseguire un portfolio rebalance esattamente trenta minuti prima della chiusura del mercato. Passi la tua funzione di rebalance come primo argomento. Per la date rule, usi il metodo helper date rules dot every day. Per la time rule, usi time rules dot market close, passando trenta minuti come argomento di offset. Ora, invece di attivarsi centinaia di volte al giorno, la tua logica di rebalance gira esattamente una volta, proprio quando la sessione di trading sta per terminare. La separazione tra l'oggetto BarData per l'accesso sicuro ai dati e la scheduling API per l'execution timing garantisce che la logica core del tuo algoritmo giri solo quando dovrebbe, usando prezzi che esistevano effettivamente in quel preciso momento. Vorrei prendermi un momento per ringraziarti per l'ascolto: ci aiuta tantissimo. Buona giornata!
5

Trading Calendars personalizzati e mercati globali

3m 58s

Questo episodio spiega come configurare Trading Calendars personalizzati. Gli ascoltatori impareranno a definire gli orari delle borse, gestire le festività e costruire un calendario 24/7 per asset come le criptovalute.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 5 di 7. Il tuo algoritmo individua un segnale di uscita perfetto e lancia un ordine di vendita massiccio. Il problema è che è sabato. Se il tuo backtesting engine non sa che l'exchange è chiuso, quell'ordine o viene eseguito in un mercato fantasma o fa crashare l'intera simulazione. I Custom Trading Calendar mappano la realtà degli orari dei mercati globali per prevenire esattamente questo scenario. Un trading calendar in Zipline è la fonte di verità assoluta per le sessioni di mercato. Stabilisce quando è possibile fare data ingestion e quando gli ordini possono essere elaborati. Di default, Zipline presuppone un orario standard per le azioni statunitensi. Se vuoi fare trading su azioni internazionali, futures o asset alternativi, devi definire le regole specifiche di quegli exchange. Lo fai creando una classe custom che eredita dalla base class Trading Calendar di Zipline. Devi solo configurare alcune property specifiche per stabilire i limiti della giornata di trading. Per prima cosa, imposti l'open time. Questo definisce l'ora e il minuto esatti in cui il mercato inizia ad accettare ordini. Secondo, imposti il close time, che segna l'ultimo minuto della sessione di trading. Terzo, definisci le regular holidays. Si tratta di una collection di date specifiche in cui l'exchange è completamente chiuso, come ad esempio le festività nazionali. Zipline non esegue tutti questi calcoli di date da zero. Utilizza ampiamente la libreria pandas, in particolare le classi Holiday Calendar e Custom Business Day. Quando fornisci la tua lista di regular holidays, stai essenzialmente popolando un oggetto Holiday Calendar di pandas. Zipline combina questa logica di pandas con i tuoi open e close time definiti per generare un enorme index precalcolato di ogni singolo minuto di trading valido per l'intera durata del tuo backtest. Questo calcolo preliminare è fondamentale. Significa che il tuo algoritmo non deve valutare complessi calcoli di date a ogni singolo tick della simulazione. Interroga semplicemente un array altamente ottimizzato. Questa è la parte che conta. Non tutti i mercati dormono. Se stai simulando trade di criptovalute, le assunzioni standard sui fine settimana rovineranno l'allineamento dei tuoi dati. Devi costruire un calendar continuo, ventiquattro sette. Vediamo come costruirne uno, che chiameremo TFS Exchange Calendar. Definisci la tua nuova classe ed erediti dalla base class standard. Per l'open time, specifichi la mezzanotte. Per il close time, specifichi le undici e cinquantanove di sera, ottenendo così un ciclo giornaliero completo. Poiché gli exchange di criptovalute non osservano le festività tradizionali, imposti la property regular holidays in modo che restituisca una lista vuota. L'ultimo passaggio è sistemare la schedule settimanale. I trading calendar tradizionali usano un oggetto Custom Business Day di pandas configurato rigorosamente dal lunedì al venerdì. Per il tuo calendar TFS, fai l'override di questa property weekmask per includere esplicitamente sabato e domenica. Una volta completata la classe, la registri nell'ambiente Zipline usando un identificatore string custom. Da quel momento in poi, sia i tuoi bundle di data ingestion che i tuoi algoritmi di trading riconosceranno la schedule continua. Gli ordini verranno elaborati in sequenza senza saltare i fine settimana e i dati a livello di minuto saranno mappati perfettamente ai timestamp reali. Se le regole del tuo calendar sono configurate male, i tuoi dati di prezzo si disallineeranno e le tue metriche di performance saranno completamente fittizie. I limiti temporali dettano ogni azione in un event-driven engine, e i trading calendar sono esattamente il modo in cui imponi quei limiti. Questo è tutto per questo episodio. Grazie per aver ascoltato, e continua a sviluppare!
6

Metriche di performance del rischio e valutazione personalizzata

3m 51s

Questo episodio si concentra sul tracciamento e sulla valutazione delle performance della strategia. Gli ascoltatori impareranno come interpretare il DataFrame delle performance e utilizzare gli hook nel ciclo di vita della simulazione per calcolare metriche di rischio personalizzate.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 6 di 7. Calcolare metriche di rischio complesse a ogni tick può rallentare drasticamente il tuo backtest. Vuoi che le tue simulazioni siano veloci, ma devi anche sapere esattamente come si comporta la tua strategia sotto stress. In realtà, puoi disabilitare il tracking di default durante il debug o scrivere custom tracker altamente ottimizzati. Questo episodio parla di Risk Performance Metrics e Custom Evaluation. Zipline raggruppa i suoi calcoli built-in di rischio e performance in una struttura chiamata Metric Set. Il set di default genera automaticamente statistiche standard come beta, Sharpe ratio e total returns. Quando la tua simulazione finisce, Zipline impacchetta tutti questi calcoli nel performance DataFrame. Ogni metrica tracciata diventa una colonna e ogni riga rappresenta un time step nella tua simulazione. Se non ti servono tutte queste metriche di default, puoi passare un Metric Set ridotto quando avvii l'engine, risparmiando un sacco di tempo di elaborazione. Quando le metriche di default non catturano il tuo modello di rischio specifico, definisci una custom metric. Lo fai creando una subclass del base metric object di Zipline. Scrivere una custom metric significa inserire un hook direttamente nel clock interno della simulazione. Controlli esattamente quando viene eseguita la tua logica implementando tre metodi di lifecycle specifici: start of simulation, end of session e end of bar. Start of simulation è dove inizializzi le variabili e imposti lo state iniziale. End of session gira una volta alla chiusura della giornata di trading. End of bar viene eseguito dopo ogni singolo aggiornamento di prezzo, il che è fondamentale per le strategie minute-level. Ogni volta che uno di questi time-based hook si attiva, Zipline gli passa due argomenti richiesti: il ledger e il packet. Il ledger contiene lo state matematico live della tua simulazione. Include il valore corrente del tuo portafoglio, i saldi di cassa e tutte le posizioni aperte. Devi trattare il ledger come dati read-only. Il packet, d'altra parte, è un dictionary vuoto che rappresenta il data payload per quello specifico time step. Tu scrivi nel packet. Qualsiasi key-value pair che assegni al dictionary del packet diventa immediatamente una colonna nel tuo performance DataFrame finale. Vediamo come tracciare il maximum intraday drawdown usando l'hook end of bar. Per prima cosa, definisci la tua classe custom metric. Nel metodo start of simulation, crei due variabili: una per tracciare il valore di portafoglio più alto visto finora e un'altra per il maximum drawdown corrente. Entrambe partono da zero. Ecco il punto chiave. Poiché i cali intraday sono invisibili se controlli solo i prezzi di chiusura giornalieri, devi eseguire la tua logica all'interno del metodo end of bar. All'interno di questo metodo, leggi il valore corrente del portafoglio dall'argomento ledger. Se il valore corrente è superiore al valore più alto registrato, aggiorni l'high water mark. Se è inferiore, calcoli la percentuale di calo. Se questo calo supera il tuo maximum drawdown registrato, aggiorni la variabile maximum drawdown. Infine, prendi la tua variabile maximum drawdown e la assegni a una key nell'argomento packet. Scrivendo nel packet alla fine di ogni bar, il tuo performance DataFrame finale conterrà un record granulare, minuto per minuto, del peggior calo intraday vissuto. Le custom metric sono fondamentalmente solo degli observer che leggono il ledger della simulazione e scrivono nell'output packet, dandoti il controllo totale su cosa viene misurato e quando. Questo è tutto per questo episodio. Grazie per l'ascolto e continua a sviluppare!
7

Estendere l'architettura di Zipline

4m 44s

Questo episodio finale copre l'architettura estensibile di Zipline. Gli ascoltatori impareranno come sostituire i componenti principali e registrare un blotter personalizzato per l'integrazione con il live trading.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Zipline Backtesting Engine, episodio 7 di 7. Trascorri mesi a perfezionare un algoritmo in un simulatore, ma il mercato reale non accetta ordini di trading simulati. Zipline è stato progettato principalmente per il backtesting, ma la sua architettura modulare ti permette di bypassare completamente la simulazione interna e di instradare direttamente verso un execution engine reale. Estendere l'architettura di Zipline rende possibile questa transizione. Di base, Zipline funziona come un circuito chiuso. Gli dai in pasto dati storici sui prezzi, lui calcola i segnali ed esegue internamente il match dei tuoi ordini con il comportamento passato del mercato. Il sistema isola intenzionalmente il tuo algoritmo dalle reti esterne. Ma un moderno sistema di trading prima o poi deve comunicare con il mondo esterno. Hai bisogno di un modo per sostituire i componenti di simulazione interni con moduli custom che gestiscano dati live e capitale reale. Zipline gestisce questo requisito tramite un meccanismo di estensione basato su uno specifico file di inizializzazione chiamato extension punto py. Questo file funge da registry locale per il tuo ambiente. Quando il framework Zipline si avvia, cerca immediatamente qui gli override definiti dall'utente. Usi questo file per registrare nuovi data bundle, modelli di commissione custom ed execution engine alternativi. Il componente più critico che devi sostituire per il live trading è il Blotter. Il Blotter funge da sistema interno di gestione degli ordini. Traccia gli ordini aperti, li annulla quando richiesto ed elabora i trade fill. Il blotter di simulazione di default simula l'esecuzione dei trade basandosi su algoritmi di volume storico e slippage. Per fare live trading, devi bypassarlo completamente. Ottieni questo risultato scrivendo una classe Blotter custom. Invece di simulare l'esecuzione, i metodi della tua classe effettuano chiamate di rete all'API di un vero broker. Quando l'algoritmo richiede un trade, il tuo blotter custom formatta quella richiesta in un ordine live e lo trasmette all'exchange. Ecco il punto chiave. Non devi modificare una singola riga del codice sorgente originale di Zipline per implementare tutto questo. Definisci la tua classe blotter custom nel tuo workspace. Poi, apri extension punto py. Importi la funzione di registrazione del blotter dal modulo utilities di Zipline. Passi a questa funzione una string univoca come nome per il tuo broker, insieme alla tua classe blotter custom. Questo registra il tuo execution engine a livello globale. Infine, quando esegui il tuo script di trading dalla riga di comando o da un notebook, ti basta fornire la string del nome del tuo blotter custom come parametro di lancio. Il framework sostituisce automaticamente i meccanismi interni. Lo stesso identico algoritmo che girava in simulazione ora fa trading con capitale live. Supportare questo livello di modularità richiede delle fondamenta core estremamente stabili. Zipline si affida pesantemente a dataframe numerici veloci e allo storage su database relazionali per spostare le informazioni tra l'algoritmo e il blotter. Con la release di Zipline 3.0, l'architettura core ha ricevuto un significativo aggiornamento strutturale per modernizzare queste fondamenta. L'intera piattaforma è stata migrata per supportare Pandas 2.0 e SQLAlchemy 2.0. L'upgrade a Pandas 2.0 porta una gestione della memoria nettamente migliore e tempi di esecuzione più rapidi per gli enormi array di time series che Zipline elabora a ogni tick. SQLAlchemy 2.0 modernizza completamente il modo in cui l'engine interagisce con i database SQL sottostanti. Impone query execution path più rigorosi ed espliciti quando il sistema gestisce i metadati degli asset e memorizza i risultati di trading. Questi upgrade fondamentali garantiscono che, sia che tu stia eseguendo un massiccio backtest storico, sia che tu stia instradando ordini live tramite un'estensione broker custom, l'engine operi sugli standard moderni dell'infrastruttura dati Python. Separando la logica di trading dalle meccaniche di esecuzione, l'architettura garantisce che il tuo algoritmo rimanga completamente intatto mentre l'execution layer sottostante si adatta alla realtà. Ti incoraggio vivamente a esplorare la documentazione ufficiale e a provare a scrivere le tue estensioni hands-on. Se hai idee su cosa dovremmo trattare in futuro, visita DEV STORIES DOT EU per suggerire argomenti per le nostre prossime serie. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.