O 10:14 UTC prosta strategia wybicia kupiła kontrakt perpetual na kryptowalutę po tym, jak cena przebiła maksimum z 20 minut. Backtest wykazał realizację po 64 210 $. Ta liczba występowała w danych, sygnał miał prawidłowy znacznik czasu, a symulowane zlecenie nadeszło na następnej świecy. Prawie uznaliśmy wynik za wiarygodny.
Potem porównaliśmy identyfikatory instrumentów. Sygnał pochodził z kontraktu perpetual BTCUSDT. Realizacja dotyczyła odwrotnego kontraktu BTCUSD. Oba były notowane w pobliżu 64 210 $ i oba miały płynne rynki. Były to jednak różne arkusze zleceń, z różnymi cenami, krokami notowań, głębokością rynku i harmonogramami opłat. Backtest poskładał razem rynek, do którego żaden trader nie miał dostępu.
Sama strategia była całkiem zwyczajna: wejście po zamknięciu powyżej kroczącego maksimum, wyjście po zamknięciu poniżej kroczącego minimum, a wielkość każdej pozycji dostosowana do stałego ryzyka wyrażonego w dolarach. Problem wyszedł na jaw dopiero, gdy zadaliśmy dokładniejsze pytanie niż „ile był wart BTC?”. Zapytaliśmy: „ile jednostek tego konkretnego kontraktu mogło kupić to zlecenie w tamtej chwili?”
Zanim uruchomiliśmy strategię, wykres był już kompozytem
Nasz kanał danych badawczych ułatwiał porównywanie platform. Normalizował symbole i wyświetlał skonsolidowany szereg cen. Było to przydatne do obserwowania rynku, ale nie nadawało się jako odniesienie do realizacji zleceń. Kompozyt może pokazywać najlepszą cenę z różnych giełd, choć strategia może wysłać zlecenie tylko na jedną z nich.
W chwili wybicia maksimum skonsolidowanej świecy wynosiło 64 205 $. Ostatnia transakcja na wybranym kontrakcie odbyła się już po 64 218 $. Tymczasem w pamięci podręcznej nadal widniała oferta sprzedaży po 64 210 $ dla kontraktu odwrotnego. Symulator użył wybicia z jednego szeregu i atrakcyjnej ceny sprzedaży z innego. Każda z tych wartości była prawdziwa. Ich połączenie było fikcją.
| Dane wejściowe | Czego użył backtest | Czego wymagało zlecenie |
|---|---|---|
| Maksimum wybicia | Skonsolidowana cena BTC | Historia cen wybranego kontraktu |
| Cena odniesienia przy wejściu | Cena sprzedaży z pamięci podręcznej dla kontraktu odwrotnego | Aktualna cena sprzedaży dla handlowanego instrumentu |
| Wielkość realizacji | Zlecona wielkość pozycji | Dostępna ilość na każdym poziomie cenowym |
Jeden wiersz w tabeli danych rynkowych może wyglądać na kompletny, choć jego pola opisują różne rynki. Alias symbolu nie dowodzi, że dwa instrumenty korzystają z tego samego arkusza zleceń. Identyfikator kontraktu, platforma, waluta kwotowania i znacznik czasu muszą być przekazywane razem na każdym etapie, od generowania sygnału po realizację zlecenia.
Odtworzyliśmy realizację zlecenia na podstawie arkusza
Ponownie zasymulowaliśmy wejście, używając najlepszej ceny sprzedaży dla wybranego kontraktu perpetual oraz aktualizacji arkusza zleceń dostępnych w chwili podjęcia decyzji. Kwotowanie było aktualne, ale na najlepszym poziomie znajdowało się tylko 0.18 BTC. Nasze symulowane zlecenie opiewało na 0.50 BTC. Pozostałe 0.32 BTC musiałoby zostać zrealizowane po wyższych cenach sprzedaży.
Skorygowana cena wejścia była o 21 $ za BTC wyższa od ceny widniejącej w danych, jeszcze przed opłatami. Przy pojedynczej transakcji różnica jest niewielka. W całym teście strategia wypracowała jednak większość zysku brutto na kilku szybkich wybiciach. Odtworzenie tych wejść na podstawie właściwych arkuszy zmniejszyło wynik brutto o 31%; opłaty taker i wpływ na cenę obniżyły go jeszcze bardziej.
Znaleźliśmy też dwa przypadki, w których kwotowanie z najlepszą ofertą dotarło po chwili podjęcia decyzji o sygnale. Backtest łączący dane według najbliższego znacznika czasu może po cichu wybrać aktualizację z przyszłości. Teraz łączymy dane wstecz: kwotowanie musi być dostępne najpóźniej w chwili wysłania zlecenia, a jego wiek zapisujemy. Jeśli najnowsze użyteczne kwotowanie jest zbyt stare, symulator oznacza zlecenie jako niemożliwe do realizacji albo stosuje jawnie określoną regułę obsługi nieaktualnych danych.
Co składa się na cenę, po której można handlować
Cena zamknięcia świecy przydaje się do obliczania sygnału. Nie dowodzi jednak, że konkretne zlecenie mogło zostać po niej zrealizowane. W tym celu cena musi dotyczyć dokładnie tego instrumentu i tej platformy, być dostępna w chwili nadejścia zlecenia, a po przeciwnej stronie rynku musi być wystarczająca ilość. Jeśli dane nie pozwalają odpowiedzieć na te pytania, uczciwym wynikiem jest przedział cen lub brak realizacji, a nie wymyślona dokładna cena.
Zostawiliśmy skonsolidowany szereg do ogólnej obserwacji rynku, ale usunęliśmy go ze ścieżki realizacji zleceń. Sygnały odnoszą się teraz do historii cen wybranego kontraktu, a zlecenia odtwarzamy na podstawie jego arkusza, uwzględniając opłaty i wielkość pozycji po obliczeniu ceny realizacji. Trochę więcej pracy przy integracji danych i znacznie mniej imponująca krzywa kapitału.
Do wybicia rzeczywiście doszło. Backtest po prostu zapewnił mu lepszy rynek niż ten, który wybrała strategia.
← Wszystkie wpisy


