Salut, sunt Alex de la DEV STORIES DOT EU. Zipline Backtesting Engine, episodul 7 din 7. Petreci luni întregi perfecționând un algoritm într-un simulator, dar piața reală nu acceptă ordine de tranzacționare simulate. Zipline a fost conceput în principal pentru backtesting, dar arhitectura sa modulară înseamnă că poți ocoli complet simularea internă și poți ruta direct către un motor de execuție real. Extinderea arhitecturii Zipline face posibilă această tranziție.
Din start, Zipline funcționează ca o buclă închisă. Îi furnizezi date istorice despre prețuri, calculează semnale și îți potrivește ordinele intern cu comportamentul anterior al pieței. Sistemul îți izolează intenționat algoritmul de rețelele externe. Dar un sistem de tranzacționare modern trebuie în cele din urmă să comunice cu lumea exterioară. Ai nevoie de o modalitate de a înlocui componentele interne de simulare cu module personalizate care gestionează date live și capital real.
Zipline gestionează această cerință printr-un mecanism de extensie construit în jurul unui fișier de inițializare specific numit extension dot py. Acest fișier acționează ca un registru local pentru mediul tău. Când framework-ul Zipline pornește, caută imediat aici overrides definite de utilizator. Folosești acest fișier pentru a înregistra noi data bundles, modele de comisioane personalizate și motoare de execuție alternative.
Cea mai importantă componentă pe care trebuie să o schimbi pentru tranzacționarea live este Blotter-ul. Blotter-ul acționează ca sistem intern de gestionare a ordinelor. Urmărește ordinele deschise, le anulează atunci când primește instrucțiuni și procesează trade fills. Blotter-ul de simulare implicit pretinde că execută tranzacții pe baza volumului istoric și a algoritmilor de slippage. Pentru a tranzacționa live, trebuie să ocolești complet acest lucru.
Realizezi acest lucru scriind o clasă Blotter personalizată. În loc să simuleze execuția, metodele clasei tale efectuează apeluri de rețea către un API de broker real. Când algoritmul solicită o tranzacție, blotter-ul tău personalizat formatează acea solicitare într-un ordin live și o transmite către bursă.
Iată ideea principală. Nu modifici nicio linie din codul sursă original Zipline pentru a implementa acest lucru. Îți definești clasa personalizată de blotter în propriul spațiu de lucru. Apoi, deschizi extension dot py. Imporți funcția de înregistrare a blotter-ului din modulul de utilități Zipline. Îi transmiți acestei funcții un string unic pentru brokerul tău, împreună cu clasa ta personalizată de blotter. Asta înregistrează motorul tău de execuție la nivel global. În cele din urmă, când execuți scriptul de tranzacționare din linia de comandă sau dintr-un notebook, pur și simplu furnizezi numele de tip string al blotter-ului personalizat ca parametru de lansare. Framework-ul schimbă automat mecanismele interne. Exact același algoritm care a rulat în simulare tranzacționează acum capital real.
Suportul acestui nivel de modularitate necesită o fundație core extrem de stabilă. Zipline se bazează în mare măsură pe dataframes numerice rapide și stocare în baze de date relaționale pentru a muta informații între algoritm și blotter. Odată cu lansarea Zipline 3.0, arhitectura de bază a primit o actualizare structurală semnificativă pentru a moderniza această fundație.
Întreaga platformă a fost migrată pentru a suporta Pandas 2.0 și
SQLAlchemy 2.0. Actualizarea la Pandas 2.0 aduce o gestionare a memoriei substanțial mai bună și timpi de execuție mai rapizi pentru array-urile masive de time series pe care Zipline le procesează la fiecare tick. SQLAlchemy 2.0 modernizează complet modul în care motorul interacționează cu bazele de date SQL subiacente. Acesta impune path-uri de execuție a query-urilor mai stricte și mai explicite atunci când sistemul gestionează metadatele activelor și stochează rezultatele tranzacțiilor. Aceste îmbunătățiri fundamentale asigură că, indiferent dacă rulezi un backtest istoric masiv sau rutezi ordine live printr-o extensie personalizată de broker, motorul funcționează pe baza standardului modern al infrastructurii de date Python.
Prin separarea logicii de tranzacționare de mecanica de execuție, arhitectura garantează că algoritmul tău rămâne complet intact, în timp ce stratul de execuție subiacent se adaptează la realitate. Te încurajez insistent să explorezi documentația oficială și să încerci să îți scrii propriile extensii practic. Dacă ai idei despre ce ar trebui să acoperim în continuare, vizitează DEV STORIES DOT EU pentru a sugera subiecte pentru seria noastră viitoare. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, toate bune.