We wtorek rano nasza strategia podążania za trendem na kontraktach futures na ropę miała długą pozycję w wygasającym kontrakcie. Sygnał robił dokładnie to, o co go poprosiliśmy: utrzymywał pozycję, dopóki trend pozostawał wzrostowy. Backtest pokazywał niewielki zysk. Na rachunku demo widzieliśmy sprzedaż, zakup kolejnego kontraktu, dwie prowizje i gorszą cenę wejścia, niż sugerował wykres.
Z sygnałem nie działo się nic tajemniczego. Backtest traktował „cenę futures” jak jedną, nieprzerwaną serię. Na rachunku trzeba było zamknąć jeden kontrakt i otworzyć kolejny — w dwóch różnych arkuszach zleceń i po dwóch różnych cenach.
Rozbieżność wykryliśmy podczas przeglądu pozycji utrzymywanej w okresie rolowania. Strategia korzystała z płynnego kontraktu najbliższej serii i utrzymywała go do chwili, gdy reguła kalendarzowa przenosiła pozycję na kolejny miesiąc. Ta reguła była rozsądna. Sposób księgowania już nie.
Nasza seria ciągła była korygowana wstecznie, aby usunąć różnicę między kontraktami. Dzięki temu wykres nadawał się do obliczania trendu. Oznaczało to jednak, że seria nie zawierała żadnej rzeczywistej ceny, po której można było zamknąć stary kontrakt lub otworzyć nowy. Backtest wyceniał transakcję podczas rolowania na podstawie skorygowanego poziomu, a potem wznawiał handel tak, jakby pozycja po prostu trwała dalej.
Do generowania sygnału seria ciągła może być użytecznym pomiarem. Przy realizacji zlecenia jest fikcją. Rolowanie to dwie transakcje, a spread między kontraktami jest elementem struktury rynku, nie kosmetycznym skokiem, który można wygładzić.
Odtworzyliśmy to zdarzenie z użyciem dwóch notowanych kontraktów. Na stary kontrakt najlepszy bid wynosił 79.98, a ask 80.00. Na kolejny kontrakt bid wynosił 80.42, a ask 80.45. Długą pozycję musieliśmy zamknąć, sprzedając stary kontrakt po bidzie, a następnie kupując nowy po asku. Spread kalendarzowy między tymi cenami wykonania wynosił 44 centy.
Ta wartość nie oznaczała automatycznie straty 44 centów. Kontrakty dotyczyły różnych miesięcy dostawy, a spread odzwierciedlał koszt utrzymania, przechowywania i finansowania oraz oczekiwania dotyczące podaży. Pozycja utrzymywana przez okres rolowania zachowuje ekspozycję na dalszą zmianę ceny nowego kontraktu; nie oznacza to, że całość kwotowanego spreadu płaci się jako prowizję. Strategia musi jednak zrealizować wyjście ze starego kontraktu i otworzyć pozycję w nowym. Jeśli w obliczeniu stopy zwrotu porówna te ceny tak, jakby dotyczyły tego samego instrumentu, może wygenerować lub wymazać P&L.
W symulacji rozdzieliliśmy te zadania. Seria ciągła nadal generowała sygnał trendu. Do wyceny i zleceń używaliśmy cen właściwych dla każdego kontraktu. Przy rolowaniu symulator wysyłał zlecenie zamknięcia wygasającej serii i zlecenie otwarcia kolejnej, naliczał prowizje dla każdego kontraktu oraz uwzględniał spread i dostępną głębokość każdego arkusza.
Pierwsza symulacja nadal nie zgadzała się z rachunkiem demo. Obie realizacje zsynchronizowaliśmy z tym samym znacznikiem czasu, choć zlecenia były składane po kolei. Zlecenie zamknięcia starej serii zostało zrealizowane, ale ask nowej serii zmienił się, zanim zlecenie kupna dotarło do arkusza. Jeśli giełda na to pozwala, rolowanie można wykonać jako spread kalendarzowy albo jako dwie nogi, utrzymując między nimi ekspozycję. To różne założenia dotyczące realizacji. W porównaniu odtworzyliśmy rzeczywistą sekwencję zleceń z rachunku demo.
Potem zauważyliśmy, że sama reguła kalendarzowa nie była wystarczająco precyzyjna. „Roluj pięć dni przed wygaśnięciem” brzmi konkretnie, dopóki święto nie przesunie kalendarza sesji, płynność nie przeniesie się wcześniej lub konwencja wygaśnięcia dla danego kontraktu nie okaże się inna. W jednym miejscu liczyliśmy dni kalendarzowe, a w drugim sesje. Strategia na rachunku demo rolowała pozycję na piątej sesji przed ostatnim dniem obrotu, a backtest robił to pięć dni kalendarzowych wcześniej.
Data rolowania to reguła handlowa. Zapisz kalendarz giełdy i zdarzenie, które uruchamia rolowanie, bo prędzej czy później backtest i rachunek nie będą zgodne co do tego, który kontrakt posiadasz.
Zmieniliśmy instrukcję rolowania tak, by wskazywała ostatni dzień obrotu danym kontraktem, liczyła sesje według kalendarza jego giełdy i wymagała sprawdzenia minimalnej płynności przed przeniesieniem pozycji. Ten próg był praktycznym zabezpieczeniem, a nie obietnicą lepszej realizacji: wolumen i liczba otwartych pozycji nie są doskonałymi wskaźnikami tego, co da się zrealizować naszym zleceniem. Rejestrowaliśmy wybrany kontrakt i ceny obu nóg, aby każde odtworzenie wyjaśniało przebieg zmiany pozycji.
Po tych zmianach historyczna stopa zwrotu strategii spadła. Różnica nie wynikała z jednej ogromnej straty na rolowaniu. Złożyło się na nią wiele drobnych korekt: właściwy kontrakt, właściwa sesja, rzeczywiste prowizje za obie nogi oraz ceny wyjścia i wejścia z odpowiednich arkuszy. Jedno rolowanie przy wyjątkowo małej płynności było szczególnie kosztowne, więc pozostawiliśmy je widoczne zamiast uśredniać jego wpływ.
Jeśli w backteście futures korzystasz z wykresu ciągłego, zastanów się, do czego ten wykres może służyć. Może dostarczyć spójnych danych wejściowych dla sygnału. Nie może zastąpić kontraktu, który można było kupić lub sprzedać. Dla każdej pozycji utrzymywanej do wygaśnięcia dokumentacja badawcza powinna wskazywać stary kontrakt, nowy kontrakt, czynnik uruchamiający rolowanie, model realizacji i dwa wynikające z niego przepływy pieniężne.
Ta wtorkowa transakcja nie była skutkiem wyrafinowanego błędu. To była linia na wykresie, która wyglądała na zyskowną, bo pomijała moment, w którym rachunek musiał zmienić posiadany kontrakt. Gdy uwzględniliśmy ten moment w symulacji, wynik stał się mniej pochlebny i znacznie bardziej użyteczny.
← Wszystkie wpisy


