Python pozwala zbudować własny proces badania strategii: od kontroli danych do listy transakcji i raportu. Najważniejsze są zgodne jednostki oraz chronologia informacji. Szybki wykres kapitału nie wystarczy, jeśli program korzysta z przyszłej ceny albo pomija koszt wykonania.

Dobierz środowisko do pytania

Do pierwszego projektu wystarczą zapisane dane, narzędzie ich obróbki i jawny model transakcji. pandas oraz NumPy pomagają w obliczeniach. Backtrader udostępnia proces zdarzeniowy, a vectorbt wiele sposobów symulacji portfela, w tym funkcje zależne od stanu. Nie musisz instalować wszystkich bibliotek naraz.

Nie ma uniwersalnego zwycięzcy szybkości. Wynik zależy od liczby danych, parametrów i szczegółowości wykonania. Model wektorowy może uwzględniać koszty, a zdarzeniowy nadal może upraszczać rynek. Porównuj założenia, nie etykiety bibliotek.

MT5 także obsługuje strategie wieloinstrumentowe i rozbudowane raporty. Python wybierasz dla potrzebnych narzędzi i kontroli projektu, nie dlatego, że MetaTrader potrafi testować wyłącznie jedną parę. Różnice opisuje porównanie środowisk.

Zapisz dane razem z opisem

Dla każdego pliku zachowaj symbol, produkt, dostawcę, strefę czasu, stronę kwotowania, interwał i zakres pobrania. Sprawdź duplikaty, kolejność rekordów oraz brakujące okresy. Przerwa weekendowa na danym rynku nie jest automatycznie błędem; nie wypełniaj jej bezrefleksyjnie sztucznymi transakcjami.

Funkcja copy_rates_range pakietu MetaTrader5 zwraca świece z polami czasu, OHLC, wolumenów i spreadu. Nie dostarcza tym samym pełnej historycznej taryfy prowizji oraz swapu. Zakres zależy od dostępnej historii i ustawień terminala. Same daty podane w wywołaniu nie gwarantują otrzymania całego okresu.

Dokumentacja integracji Python wskazuje czas UTC dla otrzymywanych danych oraz argumentów czasowych. Stosuj obiekty dat z jawną strefą i dopiero później przeliczaj harmonogram sesji. Nie zastępuj czasu europejskiego stałym przesunięciem godzin bez kontroli zmiany czasu.

yfinance jest niezależnym narzędziem korzystającym z danych Yahoo i wskazuje ograniczenia ich wykorzystania. CCXT udostępnia dane giełd kryptowalut; brak świecy może wynikać z braku transakcji, a bieżąca świeca może być niepełna. Żadna z tych nazw sama nie potwierdza przydatności konkretnego zbioru do testu FX.

Ustal, kiedy informacja staje się dostępna

Znacznik świecy często oznacza jej otwarcie. Świeca H1 oznaczona 10:00 ma pełne OHLC dopiero po zakończeniu okresu. Użycie jej zamknięcia do wejścia o 10:00 jest błędem, nawet jeśli w tabeli oba zdarzenia mają tę samą datę.

Przy resamplingu jawnie ustaw granice i etykiety koszyków. W pandas parametry closed i label dotyczą różnych rzeczy: przypisania obserwacji do przedziału i jego oznaczenia. Sama zmiana etykiety nie sprawia, że wynik agregacji był wcześniej znany.

Dane makro łącz według czasu publikacji dostępnej wersji, a nie wyłącznie okresu, którego dotyczy wskaźnik. merge_asof z kierunkiem backward może dopasować wcześniejszy rekord, gdy dane są prawidłowo posortowane. Kierunek nearest może wybrać rekord późniejszy. Żaden wariant nie rozpozna za Ciebie późniejszej rewizji wartości.

Prześledź sygnał na kilku wierszach

Przykład do nauki: po zamknięciu świecy porównujesz Close z maksimum poprzednich 20 świec. Poniższy fragment zakłada uporządkowaną tabelę bars zawierającą zakończone świece i kolumny high oraz close. Nie jest kompletną strategią ani programem składającym zlecenia.

previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)

Pierwsze przesunięcie wyłącza bieżącą świecę z badanego maksimum. Drugie przenosi sygnał do wiersza kolejnej świecy, jeśli taki model wykonania przyjęto. Trzeba jeszcze opisać pozycję, wyjście, wolumen oraz faktyczną cenę wykonania. Kolejne wartości true nie oznaczają automatycznie prawa do dowolnego dokładania pozycji.

Własny przykład kontroli maksimum i sygnału
ElementWartośćZnaczenie
Maksimum poprzednich 20 świec119Próg znany przed zakończeniem bieżącej świecy
High bieżącej świecy121Nie należy do poprzednich 20
Close bieżącej świecy120,5Po zamknięciu przewyższa 119
SygnałTrueCena następnego wykonania pozostaje osobnym elementem

Gdyby do maksimum włączyć bieżące High 121, warunek 120,5 > 121 byłby fałszywy. To inna reguła niż wybicie poprzedniego zakresu. Dla poprawnych świec Close nie przekracza własnego High, dlatego ten szczegół potrafi usunąć oczekiwane sygnały.

Oddziel sygnał, transakcję i koszty

Ustal, po jakiej stronie kwotowania kupujesz i sprzedajesz. Jeśli ceny wykonania już uwzględniają Bid/Ask, dodatkowe odjęcie całego spreadu może naliczyć go ponownie. Prowizję modeluj według umowy; nie każdy rachunek pobiera ją w identyczny sposób po obu stronach.

W standardowym modelu Backtradera zlecenie Market wysłane po ocenie bieżącej świecy jest wykonywane po następnym dostępnym otwarciu. Zmiana ustawień lub modelu może zmienić tę chronologię. Przy stopie i celu osiągniętym w tej samej świecy sprawdź przyjętą kolejność.

Własny przykład rachunkowy: 40 wygranych po 2R i 60 strat po 1R daje 80R zysków, 60R strat oraz 20R netto przed kosztami. Profit factor to 1,33, a średnia 0,2R. Koszt 0,1R każdej ze stu transakcji obniża wynik do 10R; wartości R w tym przykładzie są jednakowe.

Losowy poślizg jednego pipsa nie jest uniwersalnie realistyczny. Uzasadnij rozkład i zależność od warunków, a przy losowaniu zapisz ziarno oraz wersje bibliotek. Finansowanie, margin i przeliczenia walutowe są osobnymi elementami modelu.

Przy wielu instrumentach zasymuluj wspólny kapitał, dostępny depozyt i kolejność równoczesnych żądań. Suma wyników osobnych testów nie pokaże zleceń odrzuconych z braku środków. Zdefiniuj również, czy sygnał zamyka przeciwną pozycję, odwraca ją czy jest ignorowany.

W raporcie zachowaj equity z pozycjami otwartymi, a do obliczenia obsunięcia włącz początkowy kapitał. Jeżeli pierwsze transakcje są stratne, rozpoczęcie pomiaru dopiero od pierwszego zamknięcia pominie część spadku. Wpłaty i wypłaty oddziel od wyniku strategii.

Po stopie ten sam sygnał może dać różne nowe wejścia

Hipotetyczne wartości warunku wejścia na kolejnych pięciu świecach to: true, true, true, false, true. Pierwsze wejście następuje na świecy 1, a stop zamyka je na świecy 2. Nie ma innych wyjść w tym ćwiczeniu. Zakładamy ocenę wejścia po obsłudze stopa.

Ta sama seria bool, dwa jawne automaty stanów
ŚwiecaWarunekWejście gdy płasko i trueWejście po ponownym false
1trueTakTak
2: stoptrueTakNie
3trueNie — pozycja otwartaNie
4falseNieUzbrojenie
5trueNie — pozycja otwartaTak

Oba warianty dają dwa wejścia, ale w innych chwilach: 1 i 2albo 1 i 5. Pierwszy wraca do pozycji natychmiast po stopie, drugi czeka na wyzerowanie warunku. Samo shift sygnału ani ograniczenie wolumenu nie wybiera tej polityki.

Zapisz w teście stan „płasko/pozycja” oraz „uzbrojony/oczekuje na false”, kolejność obsługi wyjścia i wejścia, a także oczekiwane identyfikatory świec. To pozwala odróżnić różnicę implementacji od świadomie innej strategii. Przykład nie wylicza wyniku finansowego ani nie zaleca któregoś wariantu; pokazuje brakującą regułę, której tabela true/false nie zawiera.

Zachowaj sprawdzian i możliwość odtworzenia

Podziel czas zgodnie z celem badania, zanim wybierzesz najlepszy wynik. Dwa parametry nie gwarantują braku dopasowania, jeśli sprawdzono wiele instrumentów, filtrów i podziałów. Prowadź rejestr prób, także tych odrzuconych.

Nie stosuj arbitralnej reguły, że spadek skuteczności o jedną trzecią dowodzi błędu albo że profit factor powyżej 3,5 jest niemożliwy. Sprawdź pojedyncze transakcje, koszty, zależności i wrażliwość wyniku. Raport może wskazać problem, ale próg sam nie wyjaśnia przyczyny.

Zapisz dane, wersje pakietów, kod, parametry, listę transakcji i ograniczenia. Ocenę chronologicznych aktualizacji rozwija walk-forward, a całość dokumentacji — plan walidacji. Do badania plików nie potrzebujesz rachunku rzeczywistego ani danych logowania.

Sprawdź, czy rozumiesz

Jedno krótkie ćwiczenie

Poprzednie 20 świec ma maksimum 119. Bieżąca świeca ma High 121 i Close 120,5. Czy Close wybija poprzedni zakres?

Sprawdź odpowiedź

Tak: 120,5 > 119. Włączenie bieżącego High do poprzedniego zakresu zmieniłoby regułę. Sygnał jest znany po zamknięciu, a wykonanie trzeba modelować oddzielnie.

Następny temat: Walk-forward: okna testu, przeciek danych i WFE →