Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Jak działa pulpit nawigacyjny GEX open-source

Analiza sposobu obliczania ekspozycji na gammę w narzędziach open-source. Wyjaśnienie formuły dla ceny wykonania, konwencji dealerów oraz ograniczeń interpretacji danych.

Pulpit nawigacyjny GEX typu open-source przekształca migawkę łańcucha opcji w profil ekspozycji na gammę: kwotę w USD przy każdej cenie wykonania, szacującą zmianę popytu na hedging opcyjny przy ruchu instrumentu bazowego o jeden procent. Obliczenie to stanowi jedną linię kodu. Leżące u jego podstaw założenie, że animatorzy rynku utrzymują każdą opcję call jako długą, a każdą opcję put jako krótką, nie jest weryfikowane w żadnym punkcie łańcucha, a ta luka jest źródłem większości błędnych interpretacji tego wskaźnika. Jeśli zapoznali się Państwo z tym, co mierzy ekspozycja na gammę, kolejnym pytaniem jest sposób wygenerowania tej wartości.

Jak obliczana jest ekspozycja na gammę?

Zacznijmy od pojedynczego kontraktu. Gamma to tempo, w jakim delta opcji zmienia się przy ruchu instrumentu bazowego o jeden dolar, w przeliczeniu na akcję. Standardowa opcja na akcje w USA obejmuje sto akcji, zatem gamma kontraktu w ujęciu akcyjnym to cytowana wartość gammy pomnożona przez ten mnożnik.

Panel analityczny przelicza tę wartość na dolary oraz na ruch procentowy. Na wynik dla danego kursu wykonania (strike) składa się pięć elementów:

  • gamma: gamma na akcję dla kontraktu, odczytana z migawki łańcucha opcji lub obliczona lokalnie na podstawie zmienności implikowanej
  • open_interest: liczba kontraktów pozostających w obrocie dla danego kursu wykonania i terminu wygaśnięcia
  • 100: mnożnik kontraktu
  • spot * spot: przelicznik zmiany delty na zmianę wartości nominalnej w dolarach przy bieżącej cenie instrumentu bazowego
  • 0.01: przeskalowanie wyniku z ruchu o jeden dolar na ruch o jeden procent

Wartość dla danego kursu wykonania to gex = gamma * open_interest * 100 * spot * spot * 0.01. Sumując te wartości dla wszystkich kursów wykonania w łańcuchu, przyjmując wartości dodatnie dla opcji call i ujemne dla opcji put, otrzymujemy główny wskaźnik. Wszystkie pozostałe elementy prezentowane na panelu – słupki dla poszczególnych kursów wykonania, profil skumulowany, poziom zmiany znaku (flip level) oraz podział według terminów wygaśnięcia – stanowią jedynie inne ujęcie tej samej sumy.

Jak wygląda profil GEX w podziale na ceny wykonania?

Poniższy panel przedstawia profil dla SPY dla wszystkich cen wykonania mieszczących się w przedziale 1,5% od kursu zamknięcia instrumentu bazowego, dla kontraktów wygasających w ciągu trzydziestu dni.

ZapytanieEkspozycja gamma SPY według ceny wykonania, ostatnia sesja, kontrakty z terminem zapadalności do 30 dni
Dokładny kod SQL dla każdej liczby
SELECT
    concat('$', toString(round(k)))                                         AS strike,
    round(sumIf(gex, side = 'call') / 1e6, 1)                               AS call_gex_musd,
    round(-sumIf(gex, side = 'put') / 1e6, 1)                               AS put_gex_musd,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e6, 1)  AS net_gex_musd,
    any(snapshot_label)                                                     AS snapshot_label
FROM
(
    SELECT
        toFloat64(strike_price)                                AS k,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex,
        formatDateTime(date, '%b %e, %Y')                      AS snapshot_label
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 30
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.015
)
GROUP BY k
ORDER BY k
Run this yourself

Istotna jest tutaj jedna zamiana, którą stosuje wiele darmowych pulpitów nawigacyjnych bez wyraźnego zaznaczenia. Dane stojące za tymi panelami uwzględniają greki dla poszczególnych kontraktów oraz wolumen obrotu, a nie otwarte pozycje (open interest), dlatego każda cena wykonania jest ważona wolumenem kontraktów zawartych w trakcie sesji. Wartości te oznaczają różne zjawiska: wolumen odzwierciedla transakcje z danego dnia, natomiast open interest wskazuje pozycje pozostające otwarte na koniec sesji. Kształt krzywej jest najważniejszą lekcją, a jej poziom uległby zmianie przy zastosowaniu kolumny z rzeczywistym open interest. Różnicę tę warto dokładnie przeanalizować w wolumen opcji a otwarte pozycje.

Przedział obejmuje 23 cen wykonania, rozciągających się od $758 do $780, wycenionych na dzień Aug 6, 2026. Przy najniższej widocznej cenie wykonania, podpisane saldo netto wynosi -653.1 miliona dolarów na każdy jeden procent ruchu. Przy najwyższej cenie wynosi ono 849.4 miliona. Należy zwrócić uwagę na nierównomierny rozkład słupków pomiędzy poszczególnymi cenami wykonania. Okrągłe liczby oraz terminy wygaśnięcia o wysokim wolumenie kumulują się, podczas gdy wartości dla cen pośrednich są znikome.

Czy konwencja zapisu u dealera jest mierzona czy przyjmowana?

W łańcuchu opcji nie ma zapisu dotyczącego tego, która strona zajmuje daną pozycję w kontrakcie. Łańcuch zawiera informacje o cenach wykonania, terminach wygaśnięcia, grekach oraz liczbie otwartych kontraktów. Nie zawiera on informacji o tym, czy market maker, który kwestionował te instrumenty, zakończył dzień z pozycją długą czy krótką, a żaden publiczny kanał danych nie uzupełnia tych informacji.

Standardowa konstrukcja wypełnia tę lukę za pomocą konwencji: przyjmuje się, że dealerzy posiadają długą pozycję w każdej opcji call i krótką w każdej opcji put. Opcje call są zatem dodawane do sumy, a opcje put odejmowane. Ten jeden wybór ustala znak głównego wskaźnika, a każdy odczyt oparty na tym znaku dziedziczy go. Zmiana konwencji sprawia, że dodatni odczyt gamma staje się ujemnym przy tych samych danych.

Konwencja ta ma swoje uzasadnienie. Przepływ zleceń od inwestorów indywidualnych skłania się ku sprzedaży opcji call w ramach strategii covered call oraz sprzedaży opcji put zabezpieczonych gotówką, a także ku kupowaniu opcji put w celach ochronnych, co pozostawia dealera po drugiej stronie w przybliżeniu w założonym kierunku. Pozostaje to założeniem dotyczącym własności, stosowanym jednolicie do cen wykonania, w przypadku których często jest ono błędne, w tym do cen wykonania, które właśnie wypełnił duży instytucjonalny nabywca opcji call. Pulpit nawigacyjny, który wyświetla liczbę bez podania konwencji, ukrywa swój najważniejszy parametr wejściowy.

Gdzie koncentruje się gamma w podziale na terminy wygaśnięcia?

Wskaźnik GEX bez filtra terminów wygaśnięcia sumuje kontrakty wygasające dzisiaj po południu z tymi wygasającymi w przyszłym kwartale, traktując je jako jedną wielkość. Gamma koncentruje się w krótkim terminie, który roluje się podczas każdej sesji.

ZapytanieSkorygowana ekspozycja gamma SPY według daty wygaśnięcia, najbliższe trzy tygodnie
Dokładny kod SQL dla każdej liczby
SELECT
    formatDateTime(expiry_date, '%b %e')                                    AS expiry,
    round(sumIf(gex, side = 'call') / 1e9, 2)                               AS call_gex_bn,
    round(-sumIf(gex, side = 'put') / 1e9, 2)                               AS put_gex_bn,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e9, 2)  AS net_gex_bn
FROM
(
    SELECT
        expiration_date                                        AS expiry_date,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 21
)
GROUP BY expiry_date
ORDER BY expiry_date
Run this yourself

Wśród 11 terminów wygaśnięcia przypadających w ciągu trzech tygodni, najbliższy z nich, Aug 7, wykazuje po stronie opcji call wartość 20.57 miliarda USD na każdy jeden procent ruchu kursu, przy saldzie netto wynoszącym -5.1 miliarda USD. Dalszy koniec panelu stanowi jedynie ułamek tej wartości. Wartościowy wykres typu dashboard powinien zawierać informację o zastosowanym filtrze terminów wygaśnięcia bezpośrednio na swojej powierzchni.

Poziom zerowej gammy, często nazywany punktem zwrotnym (flip), to cena instrumentu bazowego, przy której zagregowany profil przecina zero. Prawidłowe wyznaczenie tego poziomu wymaga wyceny łańcucha opcji dla siatki hipotetycznych cen spot i ponownego obliczenia gammy każdego kontraktu dla każdego z tych punktów, ponieważ sama gamma zmienia się wraz z ruchem kursu spot. Wiele projektów pomija ponowną wycenę i interpoluje punkt przecięcia bezpośrednio z bieżącego profilu cen wykonania. To uproszczenie jest mniej kosztowne, ale prowadzi do uzyskania innej ceny. Przed zacytowaniem poziomu flip należy sprawdzić, którą metodę implementuje dany projekt.

Jak bardzo profil zmienia się z dnia na dzień?

Open interest nie jest statyczną wartością. Kontrakty wygasają, wprowadzane są nowe ceny wykonania, a pozycje są otwierane i zamykane podczas każdej sesji.

ZapytanieŁączna wartość gamma opcji call i put SPY względem wartości netto, ostatnie 60 dni kalendarzowych
Dokładny kod SQL dla każdej liczby
SELECT
    toString(d)                                                             AS session_date,
    formatDateTime(d, '%b %e')                                              AS session_label,
    round(sumIf(gex, side = 'call') / 1e9, 2)                               AS call_gex_bn,
    round(-sumIf(gex, side = 'put') / 1e9, 2)                               AS put_gex_bn,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e9, 2)  AS net_gex_bn
FROM
(
    SELECT
        date                                                   AS d,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date >= today() - 60
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 45
)
GROUP BY d
ORDER BY d
Run this yourself

Dwie kwestie wyróżniają się w trakcie 41 sesji ujętych w zestawieniu. Wartości brutto po obu stronach są wysokie, a wartość netto stanowi różnicę między nimi: w dniu Aug 6, ostatniej sesji w panelu, strona call wyniosła 29.2 mld USD wobec strony put na poziomie -34.53 mld USD, co dało wynik netto rzędu -5.32 mld USD. Niewielka zmiana po którejkolwiek ze stron brutto znacząco wpływa na wynik netto. Linia ta jest również daleka od stabilności. Wartość netto wyniosła -4.9 mld USD w dniu Jun 9, a panel pokazuje, jak duże są wahania między sesjami. Wykres GEX bez oznaczenia czasowego ma charakter wyłącznie dekoracyjny.

Czym GEX różni się od max pain?

Obie wartości analizują ten sam łańcuch opcji, lecz stawiają odmienne pytania. GEX przypisuje każdemu kursowi wykonania wagę wynikającą z gammy i określa, jak duże zapotrzebowanie na hedging wygenerowałby ruch o jeden procent. Max pain całkowicie pomija gammę i koncentruje się na kwestii rozliczenia: przy jakim kursie łączna wartość opcji będących w pieniądzu (in the money) należna posiadaczom byłaby najniższa w momencie wygaśnięcia. Poniższy panel tworzy tę krzywą na podstawie tego samego migawkowego obrazu rynku dla kontraktów wygasających w ciągu tygodnia.

ZapytanieTen sam łańcuch opcji, inne ujęcie: wartość ITM w zależności od ceny rozliczenia
Dokładny kod SQL dla każdej liczby
WITH chain AS
(
    SELECT
        toFloat64(strike_price)                                             AS k,
        if(lower(option_type) LIKE 'c%', 'call', 'put')                     AS side,
        sum(toFloat64(volume))                                              AS contracts,
        min(abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1)) AS moneyness
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 7
    GROUP BY k, side
)
SELECT
    concat('$', toString(round(sk)))          AS settle_price,
    round(sum(multiIf(
        side = 'call' AND sk > k, (sk - k) * contracts * 100,
        side = 'put'  AND sk < k, (k - sk) * contracts * 100,
        0)) / 1e9, 2)                         AS itm_value_bn
FROM (SELECT DISTINCT k AS sk FROM chain WHERE moneyness <= 0.015) AS grid
CROSS JOIN chain
GROUP BY sk
ORDER BY sk
Run this yourself

Krzywa obejmuje 23 potencjalnych kursów rozliczenia. Przy $758 łączna wartość opcji będących w pieniądzu wynosi 0.86 mld USD, a przy $780 osiąga 0.7 mld USD. Punktem minimalnym krzywej jest kurs wykonania typu max pain. Może on znajdować się o kilka dolarów od kursu wykonania o największej ekspozycji na gammę w tym samym momencie, przy czym żaden z tych punktów nie stanowi prognozy kursu, po którym rozliczy się instrument bazowy.

Czego potrzeba do uruchomienia open-source'owego pulpitu GEX?

Większość tych projektów to niewielkie pakiety w języku Python z nałożoną warstwą wizualizacji danych. Wymagania wobec użytkownika są krótkie:

  • migawka łańcucha opcji zawierająca cenę wykonania (strike), datę wygaśnięcia, typ opcji, otwarte pozycje (open interest) oraz wartość gamma dostarczoną przez dostawcę lub zmienność implikowaną niezbędną do jej obliczenia
  • cena spot instrumentu bazowego zarejestrowana w tym samym momencie co łańcuch
  • znacznik czasu, przechowywany wraz z danymi wyjściowymi, a nie przyjmowany domyślnie
  • filtr dat wygaśnięcia dobrany zgodnie z własnymi założeniami
  • klucz dostępu do danych rynkowych

Instalację należy przeprowadzać z otagowanej wersji (release), a nie z domyślnej gałęzi (branch). git clone --branch <tag> --depth 1 <repo-url> zapewnia kompilację zatwierdzoną przez autora, podczas gdy main dostarcza kod w postaci, w jakiej został wypchnięty do repozytorium danego ranka. Należy pracować wewnątrz środowiska wirtualnego: python3 -m venv .venv, aktywować je, a następnie pip install -r requirements.txt. W pierwszej kolejności należy zapoznać się z linią requires-python w pliku pyproject.toml projektu. Pakiet przypisany do starszego interpretera może powodować trudne do zdiagnozowania błędy w nowszych wersjach.

Dane rynkowe to element, który rzadko jest darmowy. Migawka zawierająca zarówno otwarte pozycje, jak i greki dla każdego kontraktu w łańcuchu, stanowi płatne uprawnienie u większości dostawców według stanu na sierpień dwa tysiące dwudziestego szóstego roku. Darmowe punkty końcowe (endpoints) zazwyczaj zwracają kwotowania bez danych o otwartych pozycjach lub z danymi publikowanymi dopiero następnego ranka. Profil zbudowany na wczorajszych danych o otwartych pozycjach jest nieaktualny dokładnie w tym miejscu, w którym obliczenia są najbardziej wrażliwe.

Czego nie może wiedzieć panel GEX

Rzeczywisty stan portfela dealerów nie jest publikowany. Firmy raportują pozycje w ujęciu zagregowanym i z opóźnieniem, a szczegółowe dane na poziomie poszczególnych cen wykonania nigdy nie pojawiają się w publicznych kanałach informacyjnych. Panel GEX modeluje popyt na zabezpieczenia w oparciu o założenia dotyczące własności i pozostaje modelem, niezależnie od tego, jak precyzyjne wydają się obliczenia.

Cztery czynniki pozostają poza zasięgiem jakiegokolwiek modelu opartego na łańcuchu opcji:

  • kto faktycznie zajmuje każdą ze stron transakcji na danej cenie wykonania
  • pozycje otwarte poza rynkiem regulowanym
  • polityka zabezpieczania poszczególnych desków, w tym tych, które zabezpieczają się według harmonogramu, a nie w sposób ciągły
  • czy dany wolumen otwartych pozycji (open interest) wynika z otwierania, czy zamykania transakcji

Żaden z tych faktów nie czyni wskaźnika bezużytecznym. Oznacza to jednak, że liczba ta opiera się na określonym założeniu, które powinno być prezentowane wraz z wykresem. Ta sama dyscyplina obowiązuje w analizie greków na poziomie portfela, gdzie ważenie delty portfela współczynnikiem beta czyni założenie stojące za wartością zagregowaną jawnym, zamiast je ukrywać.

Jak obliczono te panele

Każdy panel odczytuje dzienne wartości greków dla kontraktów na SPY z ostatniej dostępnej sesji, przefiltrowane pod kątem zbieżnych dopasowań zmienności implikowanej oraz kontraktów, na których odnotowano transakcje. Każda cena wykonania jest ważona wolumenem kontraktów z danej sesji zamiast wartością open interest, której ten zestaw danych nie zawiera. Wartość gamma w ujęciu pieniężnym (gamma dollars) obliczana jest według powyższego wzoru, przy czym jako kurs spot przyjmuje się cenę zamknięcia instrumentu bazowego. Panel "max pain" całkowicie pomija greki i wykorzystuje jedynie ceny wykonania, strony transakcji oraz liczbę kontraktów.

Najczęściej zadawane pytania

Czym jest GEX w handlu opcjami?

GEX, czyli ekspozycja na gammę (gamma exposure), szacuje, jak bardzo zmieni się popyt na hedging opcyjny przy zmianie ceny instrumentu bazowego o jeden procent. Wskaźnik ten mnoży gammę każdego kontraktu przez liczbę otwartych pozycji (open interest), mnożnik stu akcji oraz kwadrat ceny spot, a następnie sumuje wyniki dla wszystkich cen wykonania, przyjmując odpowiedni znak dla opcji call i put.

Czy do obliczenia GEX potrzebne są dane o otwartych pozycjach (open interest)?

Standardowa konstrukcja wykorzystuje open interest, czyli liczbę niezamkniętych pozycji. Niektóre panele analityczne zastępują ten parametr wolumenem obrotu, gdy dane o otwartych pozycjach są niedostępne lub opóźnione, jednak zamiana tych wartości zmienia profil ekspozycji.

Czym jest poziom zero gamma lub gamma flip?

Jest to cena instrumentu bazowego, przy której profil sumarycznej ekspozycji na gammę przecina poziom zero. Precyzyjne wyliczenie wymaga ponownego przeliczenia gammy każdego kontraktu dla każdej potencjalnej ceny spot, zamiast interpolacji z obecnego profilu cen wykonania, ponieważ gamma zmienia się wraz z ruchem ceny spot.

Czy dodatni odczyt GEX oznacza nastawienie wzrostowe?

Znak opisuje przyjętą postawę hedgingową, a nie wynik rynkowy; opiera się on w całości na przyjętej konwencji dotyczącej tego, kto posiada opcje call i put. Zmiana tej konwencji odwraca znak przy tych samych danych, zatem odczyt opisuje modelowaną pozycję, a nie kierunek trendu.

Czy można zbudować panel GEX bez płatnego źródła danych?

Obliczenia można zbudować i przetestować na dowolnym migawkowym obrazie łańcucha opcji, w tym na danych opóźnionych lub częściowych. Wygenerowanie aktualnego profilu zazwyczaj wymaga źródła danych dostarczającego jednocześnie open interest oraz greki dla całego łańcucha, za co większość dostawców pobiera opłaty według stanu na sierpień dwa tysiące dwudziestego szóstego roku.


Każdy panel w tym miejscu zawiera dokładne zapytanie SQL, na którym bazuje. Wystarczy otworzyć wybrany panel, zmienić ticker lub okno wygasania i samodzielnie uruchomić te same obliczenia w terminalu Strasmore.

#gamma exposure#options#open source#dealer positioning#tools