Jak zbudować bota tradingowego w Pythonie bez wynajdywania koła na nowo
Kiedy programista po raz pierwszy decyduje się spróbować handlu algorytmicznego, wszystko zwykle zaczyna się od stworzenia własnego skryptu. Skrypt pobiera świece przez REST API, oblicza kilka wskaźników i wysyła zlecenia. Mija miesiąc, a projekt zamienia się w nieporęczną konstrukcję obsługi błędów sieciowych, desynchronizacji gniazd i chaotycznych obejść dla kontroli zleceń.
Zamiast pisać wszystko od zera, bardziej sensowne jest skorzystanie z gotowego frameworka. Projekt VeighNa (dawniej znany jako VN.py) pojawił się w 2015 roku. Ma ponad 43 tysiące gwiazdek na GitHubie, a aktywny rozwój trwa do dziś.
Czym jest platforma
VeighNa to open-source'owy framework do handlu algorytmicznego w Pythonie. Wewnętrzna architektura opiera się na silniku zdarzeń. System nie musi uruchamiać nieskończonych pętli oczekiwania — reaguje na przychodzące ticki, zmiany statusu zleceń i sygnały timera systemowego.
Projekt ma ukierunkowanie instytucjonalne. W Chinach jest używany przez brokerów futures, firmy zarządzające aktywami i prywatne fundusze hedgingowe. To pozostawia pewien ślad w kodzie źródłowym.
Większość wbudowanych konektorów out-of-the-box jest dostosowana do chińskiego rynku finansowego (CTP, XTP, HTS). Niemniej jednak istnieje adapter dla Interactive Brokers do pracy z giełdami międzynarodowymi. Jeśli potrzebna giełda lub platforma kryptowalutowa nie znajduje się na liście, będziesz musiał napisać własną bramkę, dziedzicząc z klasy bazowej Gateway.
Moduły do rozwiązywania praktycznych zadań
Architektura systemu składa się z trzech głównych części: rdzenia, aplikacji tradingowych (apps) i adapterów danych.
Dla strategii dostępne są różne wyspecjalizowane silniki:
- CTA Strategy obsługuje standardowy handel trendowy i przeciwtrendowy na pojedynczych instrumentach.
- Spread Trading pomaga w implementacji handlu parami i arbitrażu przestrzennego.
- Option Master zawiera narzędzia do wyceny opcji, budowy krzywej zmienności i obliczania Greków.
- Portfolio Strategy koncentruje się na strategiach handlujących koszykiem aktywów jednocześnie.
Miłym akcentem jest obecność gotowych interfejsów do backtestingu. Aby przetestować pomysł na danych historycznych, niekoniecznie musisz otwierać Jupyter Notebook. System ma wbudowany interfejs graficzny oparty na PyQt, gdzie możesz uruchomić optymalizację parametrów i od razu zobaczyć wykres krzywej kapitału i drawdownu.
Do przechowywania historii wspierane są regularne relacyjne bazy danych jak SQLite i MySQL, a także wyspecjalizowane magazyny kolumnowe QuestDB i TDengine, zoptymalizowane pod kątem szybkiego wprowadzania i wyprowadzania szeregów czasowych.
Uczenie maszynowe w wersji 4.0
Czwarta generacja frameworka wprowadziła moduł vnpy.alpha. Deweloperzy szczerze przyznają, że zainspirował ich projekt Qlib firmy Microsoft.
Moduł zamyka cykl rozwoju strategii ML:
- Generowanie i przetwarzanie cech na podstawie zestawu wyrażeń czynnikowych Alpha158.
- Trenowanie modeli predykcyjnych przy użyciu LightGBM, Lasso lub wielowarstwowego perceptronu (MLP).
- Szybkie przejście od notatnika badawczego do wykonania na koncie rzeczywistym lub symulowanym.
Repozytorium zawiera gotowe Jupyter Notebooks z przykładami, więc zapoznanie się z potokiem przygotowania danych i treningu nie będzie trudne.
Jak wygląda kod
Uruchomienie terminala tradingowego z wymaganym zestawem modułów można wykonać dosłownie w kilkunastu linijkach. W przykładzie poniżej składamy aplikację z połączeniem bramki CTP i dwoma modułami: wykonawczym strategii CTA i testowaniem historycznym.
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
Po uruchomieniu otworzy się pełne okno pulpitu z tabelami zleceń, pozycjami, logami i wykresami świecowymi.
Czy warto stosować w produkcji
VeighNa to potężna platforma. Jeśli potrzebujesz tylko wysłać kilka zleceń na rynek spot raz dziennie przez REST API, framework może wydawać się przesadzony.
Jednak narzędzie z pewnością się przyda, jeśli szukasz sprawdzonej architektury do handlu sterowanego zdarzeniami, planujesz pisać własne konektory lub chcesz gotowy pulpit z zarządzaniem ryzykiem i możliwościami backtestingu. Najważniejsze to być przygotowanym na to, że część dokumentacji i komentarzy społeczności jest tłumaczona z chińskiego przez tłumacza.
Powiązane projekty