Ciągły szereg kontraktów futures łączy kolejne wygasające kontrakty w jedną historię. Możesz wykorzystać ją do badania sygnałów, ale bezpośrednie obliczanie zysków i strat z transakcji (P&L) na podstawie zmian cen może tworzyć fikcyjne zyski i straty przy każdym rolowaniu. Szereg nie informuje, który kontrakt był w twoim posiadaniu.
Przyjrzyjmy się wyjątkowo bezlitosnemu przykładowi: ropie WTI z NYMEX z 20 kwietnia 2020 r. Kontrakt majowy rozliczono po ujemnej cenie $37.63 za baryłkę. Czerwcowy po dodatniej cenie $20.43. Obie ceny były rzeczywiste. Rzeczywista była też różnica $58.06. Jednak zmiana kontraktu z majowego na czerwcowy na wykresie nie przyniosła długiej pozycji takiego zysku.
Rozłóżmy to sklejenie na części. To historyczne ceny rozliczeniowe; poniższe przykłady hipotetycznych rozliczeń wykorzystują je, by pokazać arytmetykę, a nie twierdzić, że zlecenie mogło zostać po tych cenach zrealizowane.
CLK20 i CLM20: identyfikatory, które zniknęły z wykresu
| Pole | Kontrakt majowy | Kontrakt czerwcowy |
|---|---|---|
| Identyfikator kontraktu | CLK20 | CLM20 |
| Miesiąc dostawy | maj 2020 | czerwiec 2020 |
| Cena rozliczeniowa z 20 kwietnia, dolary za baryłkę | −37.63 | 20.43 |
| Wielkość kontraktu | 1,000 baryłek | 1,000 baryłek |
Kod miesiąca ma większe znaczenie niż prefiks tickera. K oznacza maj, M — czerwiec. Te kontrakty wiązały się z różnymi zobowiązaniami dostawy i miały różne ceny. Termin wygaśnięcia majowego kontraktu zbliżał się w warunkach nadzwyczajnej presji związanej z pojemnością magazynową. Czerwcowy kontrakt dawał kolejny miesiąc.
Symbol ciągły od dostawcy danych ukrywa tę różnicę pod przyjemnie zwięzłą postacią. Lubię zwięzłe symbole, dopóki nie są jedynym identyfikatorem w dzienniku transakcji. Potem debugowanie zaczyna przypominać wykopaliska archeologiczne, tylko z gorszą kawą.
Nie istnieje też jedna uniwersalna historia ciągłych kontraktów. Dostawca może rolować kontrakty na określoną liczbę dni roboczych przed wygaśnięciem, przy przecięciu wolumenów albo według innego harmonogramu. W wielu szeregach kontrakty majowe zastąpiono już przed 20 kwietnia. Celowo sklejamy w tym przykładzie te dwie ceny rozliczeniowe, by uwidocznić błąd; nie twierdzimy, że tak rolował kontrakty którykolwiek konkretny dostawca.
1,000 baryłek: mnożnik, który kryje się za każdą ceną
Standardowy kontrakt futures NYMEX WTI obejmuje 1,000 baryłek. Ruch o $1 zmienia więc wartość długiej pozycji w 1 kontrakcie o $1,000. Tick o wartości $0.01 to $10.
Dla niezmienionej pozycji w 1 kontrakcie podstawowe obliczenie wygląda tak:
gross_pnl = contracts × 1,000 × (ending_price − starting_price)
To obliczenie nadal działa dla cen poniżej zera. Procentowe stopy zwrotu oparte na kwotowanej cenie kontraktu futures stają się znacznie mniej użyteczne: przejście przez zero może sprawić, że będą nieokreślone albo odwrócić ich pozorne znaczenie. Stopy zwrotu strategii powinny wynikać z kapitału własnego rachunku i przyjętej metody ujmowania przepływów pieniężnych. Kwotowana cena baryłki nie jest kapitałem zaangażowanym w strategię.
$58.06: nieciągłość w miejscu sklejenia
Załóżmy, że naiwny silnik widzi cenę rozliczeniową kontraktu majowego, a potem czerwcowego, i stosuje ten wzór tak, jakby instrument się nie zmienił:
invented_pnl = 1 × 1,000 × (20.43 − (−37.63))
= $58,060
W tym porównaniu nic nie zmieniło się w czasie. To ceny dwóch kontraktów z tej samej sesji. Silnik pomylił różnicę cen między kontraktami z zyskiem z okresu utrzymywania pozycji.
Przy rzeczywistym dziennym sklejaniu cena starego kontraktu z wczoraj i nowego z dzisiaj obejmują też zwykłe ruchy rynkowe. Przez to błąd trudniej zauważyć. Zarejestrowana zmiana łączy ruch starego kontraktu z różnicą cen między kontraktami w chwili zmiany.
Odjęcie $58,060 jako rzekomego gotówkowego „kosztu rolowania” również nie naprawi modelu. Kontrakty futures nie są kupowane za pełną kwotę ich kwotowanej wartości nominalnej. Zamknięcie jednego kontraktu i otwarcie drugiego powoduje zmianę pozycji, zrealizowany lub rozliczony P&L, opłaty, skutki realizacji zleceń i wymogi dotyczące depozytu zabezpieczającego. Różnica poziomów cen tych kontraktów nie jest automatycznie obciążeniem gotówkowym.
+58.06: korekta wsteczna zapisana w historii
Jedna z popularnych metod tworzenia ciągłego szeregu dodaje różnicę cen przy rolowaniu do wcześniejszych cen. Zgodnie z tą metodą −37.63 dla kontraktu majowego zmienia się w 20.43, więc cena łączy się z czerwcową bez skoku. Wcześniejsze obserwacje w tym samym historycznym segmencie również rosną o 58.06.
| Metoda tworzenia | Zmiana w miejscu sklejenia | Wpływ na badania |
|---|---|---|
| Bez korekty | Różnica $58.06 pozostaje | Wskaźniki mogą odczytać zmianę kontraktu jako ruch rynkowy |
| Addytywna korekta wsteczna | Dodaj 58.06 do starszego segmentu | Zmiany wartości w dolarach w obrębie segmentu pozostają niezmienione; historyczne poziomy i zmiany procentowe ulegają przesunięciu |
| Korekta wsteczna przez mnożenie | Pomnóż starszy segment przez 20.43 / −37.63, czyli w przybliżeniu −0.543 | Ujemny mnożnik odwraca znak zmian cen w obrębie segmentu |
Dlatego nie uznam określenia „korekta przez mnożenie” za kompletną specyfikację danych. Metoda, która działa rozsądnie przy cenach wyłącznie dodatnich, wymaga jawnego opisu postępowania dla cen zerowych i ujemnych.
Korekta addytywna również ma swoje konsekwencje. Sygnał kupna poniżej bezwzględnego progu $30 może się zmienić, gdy późniejsze rolowania przepiszą wcześniejsze poziomy. Sygnał oparty na różnicy między szybką i wolną średnią kroczącą może być niezmienny względem wspólnego przesunięcia addytywnego, o ile obie średnie zostaną przesunięte o tę samą wartość. Okna obejmujące granicę korekty wymagają osobnej analizy.
Wynik badania zachowuj razem z metodą korekty, harmonogramem rolowania i wersją danych. W przypadku sygnałów wrażliwych na skorygowane poziomy odtwórz historię dostępną w dniu każdej decyzji. Aktualny plik danych może zawierać korekty z rolowania, które jeszcze się nie odbyło.
Dwa wiersze zleceń, których brakuje na wykresie ciągłym
Oto celowo uproszczona księga. Załóżmy, że pozycję w 1 kontrakcie majowym wyceniono przed rolowaniem na −30.00. Przyjmijmy, że sprzedaż majowego kontraktu i kupno czerwcowego nastąpiły po podanych wyżej historycznych cenach rozliczeniowych, a następnie czerwcowy kontrakt wyceniono na 21.00. Przyjęte ceny realizacji służą wyłącznie ilustracji rozliczeń.
| Zdarzenie w księdze | Obliczenie | Zysk/strata brutto |
|---|---|---|
| Zamknięcie długiej pozycji w 1 majowym kontrakcie po −37.63 | 1,000 × (−37.63 − (−30.00)) | −$7,630 |
| Otwarcie długiej pozycji w 1 czerwcowym kontrakcie po 20.43 | Brak zmiany ceny przy otwarciu pozycji | $0 |
| Wycena czerwcowego kontraktu na 21.00 | 1,000 × (21.00 − 20.43) | +$570 |
| Razem | Przed kosztami realizacji i opłatami | −$7,060 |
Różnica $58.06 nigdzie nie występuje jako samodzielny przychód ani koszt. Codzienny depozyt zmienny określa, kiedy P&L z kontraktów futures trafia na rachunek gotówkowy; nie tworzy drugiej kopii tego P&L.
Rzeczywiste rolowanie może być zrealizowane zleceniem na spread kalendarzowy, a nie dwoma niezależnymi zleceniami. Symulator powinien odwzorowywać przyjęty mechanizm, wraz z realizacją zleceń i opłatami, a jednocześnie zachowywać informacje o poszczególnych pozycjach w kontraktach.
Moje kryterium akceptacji jest proste: każdy dolar P&L z handlu kontraktami futures musi dać się powiązać z konkretnym kontraktem, ilością, mnożnikiem i dwiema cenami tego samego kontraktu. Potrzebuję też znacznika czasu decyzji o rolowaniu i danych, na których ją oparto. Reguła oparta na wolumenie, która korzysta z wolumenu za dzisiejszą zakończoną sesję, nie może po cichu dokonywać transakcji wcześniej tego samego dnia.
Pokazuj linię ciągłą dla kontekstu. Pod nią nanieś kontrakty faktycznie utrzymywane w portfelu i zaznacz każdą zmianę. Jeśli krzywa kapitału skacze przy zmianie kontraktu, w pierwszej kolejności sprawdzam te dwa wiersze zleceń.
← Wszystkie wpisy


