22 września 2026 · kontrakty futures

Twój wykres ciągłych kontraktów futures pokazuje kontrakt, którym nikt nie mógł handlować

Twój wykres ciągłych kontraktów futures pokazuje kontrakt, którym nikt nie mógł handlować

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

PoleKontrakt majowyKontrakt czerwcowy
Identyfikator kontraktuCLK20CLM20
Miesiąc dostawymaj 2020czerwiec 2020
Cena rozliczeniowa z 20 kwietnia, dolary za baryłkę−37.6320.43
Wielkość kontraktu1,000 baryłek1,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 tworzeniaZmiana w miejscu sklejeniaWpływ na badania
Bez korektyRóżnica $58.06 pozostajeWskaźniki mogą odczytać zmianę kontraktu jako ruch rynkowy
Addytywna korekta wstecznaDodaj 58.06 do starszego segmentuZmiany wartości w dolarach w obrębie segmentu pozostają niezmienione; historyczne poziomy i zmiany procentowe ulegają przesunięciu
Korekta wsteczna przez mnożeniePomnóż starszy segment przez 20.43 / −37.63, czyli w przybliżeniu −0.543Ujemny 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ędzeObliczenieZysk/strata brutto
Zamknięcie długiej pozycji w 1 majowym kontrakcie po −37.631,000 × (−37.63 − (−30.00))−$7,630
Otwarcie długiej pozycji w 1 czerwcowym kontrakcie po 20.43Brak zmiany ceny przy otwarciu pozycji$0
Wycena czerwcowego kontraktu na 21.001,000 × (21.00 − 20.43)+$570
RazemPrzed 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ń.

kontrakty futures ciągłetesty historycznerolowanie kontraktów futuresdane rynkowerozliczanie P&L
← Wszystkie wpisy