Strasmore Research
Edukacja Matt ConnorAutor: Matt Connor

Jak obliczyć wskaźnik put/call krok po kroku

Analiza metodologii obliczania wskaźnika put/call na podstawie wolumenu i otwartych pozycji. Wyjaśnienie różnic dla indeksów oraz norm rynkowych w roku dwa tysiące dwudziestym szóstym.

Wskaźnik put/call

Wskaźnik put/call oblicza się poprzez podzielenie liczby zawartych kontraktów opcji put przez liczbę kontraktów opcji call w tym samym przedziale czasowym. Jeśli podczas sesji przedmiotem obrotu było dwieście pięćdziesiąt tysięcy opcji put oraz pięćset tysięcy opcji call, wskaźnik wynosi zero przecinek pięćdziesiąt. Każda dyskusja dotycząca tego wskaźnika, wolumenu w relacji do otwartych pozycji (open interest) oraz akcji w relacji do indeksów, sprowadza się do tego, co zostało uwzględnione po każdej ze stron tego dzielenia. Aby zapoznać się z podstawową definicją, należy przejść do czym jest wskaźnik put/call. Niniejsza strona przedstawia stosowne obliczenia.

Wzór na wskaźnik put/call krok po kroku

Wzór składa się z dwóch danych wejściowych i jednej operacji: należy zliczyć wolumen obrotu opcjami put, zliczyć wolumen obrotu opcjami call, a następnie podzielić pierwszą wartość przez drugą. Opcja put to kontrakt dający posiadaczowi prawo do sprzedaży stu akcji instrumentu bazowego po ustalonej cenie wykonania w terminie do dnia wygaśnięcia włącznie. Opcja call daje prawo do zakupu po ustalonej cenie. Wolumen uwzględnia liczbę kontraktów, które zmieniły właściciela w trakcie sesji i zeruje się na otwarciu kolejnego dnia.

W obliczeniach nie stosuje się wag. Jeden kontrakt typu lot w opcji tygodniowej typu far out of the money ma taką samą wagę jak jeden kontrakt w najbardziej płynnej serii, a żadna z tych wartości nie jest skalowana przez zaangażowany kapitał. Wskaźnik ten jest jedynie liczbą kontraktów.

Kluczowym wyborem wpływającym na wynik jest to, które kontrakty podlegają zliczeniu. Poniższe zestawienie przedstawia identyczne obliczenia dla ośmiu płynnych instrumentów w okresie jednego pełnego miesiąca.

ZapytanieWolumen opcji put i call dla ośmiu wybranych spółek, lipiec 2026
Dokładny kod SQL dla każdej liczby
SELECT
    underlying_symbol                 AS symbol,
    sumIf(volume, right_letter = 'P') AS put_volume,
    sumIf(volume, right_letter = 'C') AS call_volume,
    round(toFloat64(sumIf(volume, right_letter = 'P'))
        / toFloat64(sumIf(volume, right_letter = 'C')), 2) AS put_call_ratio
FROM
(
    SELECT
        underlying_symbol,
        volume,
        substring(ticker, length(ticker) - 8, 1) AS right_letter
    FROM global_markets.options_greeks
    WHERE date >= '2026-07-01'
      AND date <  '2026-08-01'
      AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
      AND volume > 0
)
GROUP BY symbol
HAVING call_volume > 0 AND put_volume > 0
ORDER BY put_call_ratio DESC
Run this yourself

W lipcu dwa tysiące dwudziestego szóstego roku IWM odnotowało najwyższy wskaźnik spośród ośmiu analizowanych instrumentów na poziomie 3.11 opcji put na jedną opcję call, natomiast MSFT najniższy, wynoszący 0.38. Jeden wzór, jeden miesiąc i rozpiętość między najwyższą a najniższą wartością znacznie szersza niż codzienne wahania, o których często się pisze. Wskaźnik podany bez wskazania kategorii, której dotyczy, nie niesie niemal żadnej informacji.

Wolumen czy otwarte pozycje

Licznik i mianownik mogą być wyliczane na dwa różne sposoby.

Wersja wolumenowa zlicza kontrakty, którymi obrócono w danym przedziale czasowym. Jest to miara przepływu, która w każdej sesji zaczyna się od zera i opisuje aktywność inwestorów w danym dniu. Każdy wskaźnik prezentowany w nagłówkach serwisów rynkowych opiera się na tej metodzie.

Wersja oparta na otwartych pozycjach (open interest) dzieli liczbę pozostających w obrocie opcji put przez liczbę opcji call, gdzie open interest oznacza liczbę kontraktów otwartych, które nie zostały jeszcze zamknięte, wykonane ani wygasłe. Jest to miara stanu, odzwierciedlająca skumulowaną pozycję, a nie bieżącą aktywność, dlatego zmienia się powoli. Sesja, w której trzydzieści tysięcy opcji put zmienia właściciela między dwoma dotychczasowymi posiadaczami, zwiększa wolumen o trzydzieści tysięcy, ale pozostawia open interest bez zmian. Artykuł Wolumen opcji a otwarte pozycje omawia szczegóły księgowe.

Rozważmy hipotetyczny instrument, który kończy wtorkową sesję z czterdziestoma tysiącami opcji put i pięćdziesięcioma tysiącami opcji call w obrocie, co daje wskaźnik open interest na poziomie zero przecinek osiemdziesiąt. W środę dochodzi do obrotu trzydziestoma tysiącami opcji put i dziesięcioma tysiącami opcji call, co daje wskaźnik wolumenowy na poziomie trzy. Obie liczby opisują ten sam łańcuch opcji w tym samym dniu, różnią się niemal czterokrotnie i obie są poprawne. Wskaźniki oparte na otwartych pozycjach stanowią również podstawę obliczeń max pain, w których wagi cen wykonania zależą od liczby kontraktów pozostających w obrocie, a nie od liczby kontraktów, którymi obrócono.

Miary przepływu są zmienne. Poniżej przedstawiono dzienny wskaźnik wolumenowy dla jednego ETF-u oraz jednej akcji w ciągu tego samego miesiąca.

ZapytanieDzienny wskaźnik wolumenu put/call, SPY względem AAPL, lipiec 2026
Dokładny kod SQL dla każdej liczby
SELECT
    toString(d)                                                 AS session_date,
    concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
    round(toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'P'))
        / toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'C')), 2)  AS spy_put_call_ratio,
    round(toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'P'))
        / toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'C')), 2) AS aapl_put_call_ratio
FROM
(
    SELECT
        date                                     AS d,
        underlying_symbol                        AS sym,
        volume,
        substring(ticker, length(ticker) - 8, 1) AS right_letter
    FROM global_markets.options_greeks
    WHERE date >= '2026-07-01'
      AND date <  '2026-08-01'
      AND underlying_symbol IN ('SPY', 'AAPL')
      AND volume > 0
)
GROUP BY d
HAVING countIf(sym = 'SPY' AND right_letter = 'C') > 0
   AND countIf(sym = 'AAPL' AND right_letter = 'C') > 0
ORDER BY d
Run this yourself

W dniu Jul 1 dla SPY odnotowano 1.1, podczas gdy dla AAPL było to 0.49. Do dnia Jul 31 wartości te wyniosły odpowiednio 2 oraz 0.55. W ciągu 22 sesji dzienne odczyty ulegają wahaniom, a obie serie znajdują się na wykresie na różnych poziomach. Różnica poziomów jest bardziej użyteczną z tych dwóch informacji.

Akcje, indeksy, ETP i suma: cztery wskaźniki Cboe

Liczba określana mianem „wskaźnika put/call” pochodzi z codziennych statystyk rynkowych Cboe, które publikują kilka takich wartości. Kategorie, zgodnie z nazewnictwem Cboe, to:

  • Wskaźnik put/call dla akcji: opcje na pojedyncze spółki.
  • Wskaźnik put/call dla indeksów: opcje na indeksy, w tym SPX i VIX.
  • Wskaźnik put/call dla produktów giełdowych (ETP): opcje na ETF-y, w tym SPY, QQQ oraz IWM.
  • Całkowity wskaźnik put/call: suma wszystkich kategorii.

Każdy z nich obliczany jest w ten sam sposób: jako iloraz łącznej liczby opcji put do łącznej liczby opcji call w danej kategorii, zatem odczyty różnią się jedynie zawartością koszyka. Koszyki te nie są wymienne.

Opcje indeksowe stanowią standardowy instrument zabezpieczający cały portfel w ramach jednej transakcji. Fundusz posiadający szeroki portfel akcji kupuje opcje put na indeksy w celu zabezpieczenia i nie ma analogicznego powodu, by kupować opcje call na indeksy. Popyt ten jest jednostronny i w całości trafia do licznika kategorii indeksowej. Przepływy na pojedynczych akcjach wykazują odwrotną tendencję, gdzie kupno opcji call na poszczególne walory stanowi dużą i trwałą część wolumenu. Obie kategorie znajdują się na różnych poziomach ze względu na swoją strukturę, a porównywanie odczytu z jednej kategorii do benchmarku z drugiej jest najczęstszym błędem popełnianym przy korzystaniu z tego wskaźnika.

Szerokie ETF-y rynkowe pełnią taką samą rolę zabezpieczającą jak opcje indeksowe, będąc jednocześnie zaliczanymi do kategorii produktów giełdowych (ETP). Poniższy panel śledzi miesięczną medianę dla obu stron tego podziału.

ZapytanieMiesięczna mediana wskaźnika put/call: szeroki rynek ETF względem pojedynczych akcji
Dokładny kod SQL dla każdej liczby
WITH
    daily AS
    (
        SELECT
            d,
            toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
                / toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')))     AS etf_ratio,
            toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
                / toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio
        FROM
        (
            SELECT
                date                                     AS d,
                underlying_symbol                        AS sym,
                volume,
                substring(ticker, length(ticker) - 8, 1) AS right_letter
            FROM global_markets.options_greeks
            WHERE date >= '2025-08-01'
              AND date <  '2026-08-01'
              AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
              AND volume > 0
        )
        GROUP BY d
        HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
           AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
    )
SELECT
    toString(toStartOfMonth(d))                AS month,
    formatDateTime(toStartOfMonth(d), '%b %Y') AS month_label,
    round(quantileExact(0.5)(etf_ratio), 2)    AS etf_median_ratio,
    round(quantileExact(0.5)(stock_ratio), 2)  AS stock_median_ratio
FROM daily
GROUP BY month, month_label
ORDER BY month
Run this yourself

Panel obejmuje okres od Aug 2025 do Jul 2026. Na obu końcach przedziału mediana dziennego wskaźnika dla koszyka ETF znajdowała się w pobliżu lub powyżej 1,0, wynosząc 1.52 w pierwszym miesiącu i 1.49 w ostatnim. Koszyk pojedynczych akcji utrzymywał się poniżej 1,0 na obu końcach, osiągając 0.6 oraz 0.56, w trakcie wszystkich 12 miesięcy ujętych na wykresie. Ta stała różnica jest powodem, dla którego benchmark musi określać swoją kategorię, aby mieć jakiekolwiek znaczenie.

Co uznaje się za normalny wskaźnik put/call

Normalny poziom to zakres, a zakres ten przypisany jest do kategorii, a nie do samego wskaźnika. Poniższe zestawienie obejmuje każdą sesję z ostatnich dwunastu miesięcy i przedstawia medianę dziennego wskaźnika dla każdego koszyka wraz z wartościami dla dziesiątego i dziewięćdziesiątego percentyla.

ZapytanieAktualny poziom dziennego wskaźnika, dwanaście miesięcy sesji
Dokładny kod SQL dla każdej liczby
WITH
    daily AS
    (
        SELECT
            d,
            toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
                / toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')))     AS etf_ratio,
            toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
                / toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio,
            toFloat64(sumIf(volume, right_letter = 'P'))
                / toFloat64(sumIf(volume, right_letter = 'C'))                                      AS all_ratio
        FROM
        (
            SELECT
                date                                     AS d,
                underlying_symbol                        AS sym,
                volume,
                substring(ticker, length(ticker) - 8, 1) AS right_letter
            FROM global_markets.options_greeks
            WHERE date >= '2025-08-01'
              AND date <  '2026-08-01'
              AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
              AND volume > 0
        )
        GROUP BY d
        HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
           AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
    )
SELECT
    p.2                                  AS category,
    round(quantileExact(0.1)(p.3), 2)    AS p10_ratio,
    round(quantileExact(0.5)(p.3), 2)    AS median_ratio,
    round(quantileExact(0.9)(p.3), 2)    AS p90_ratio
FROM
(
    SELECT arrayJoin([
        tuple(1, 'Broad market ETFs', etf_ratio),
        tuple(2, 'Single stocks',     stock_ratio),
        tuple(3, 'All eight names',   all_ratio)
    ]) AS p
    FROM daily
)
GROUP BY p.1, p.2
ORDER BY p.1
Run this yourself

Dla koszyka pojedynczych akcji mediana sesji wyniosła 0.58, przy czym 0.45 stanowiło dziesiąty percentyl, a 0.76 dziewięćdziesiąty. Koszyk szerokiego rynku ETF plasował się wyżej w całym rozkładzie: mediana wyniosła 1.54, przy granicach na poziomie 1.25 i 1.86.

Czy zatem poziom 1,20 jest wysoki? W odniesieniu do koszyka pojedynczych akcji, odczyt 1,20 znajduje się powyżej dziewięćdziesiątego percentyla na poziomie 0.76, co czyni go nietypowym. W odniesieniu do koszyka ETF jest to wynik zbliżony do rutynowego. W kategorii indeksów, gdzie koncentruje się opisany powyżej przepływ związany z hedgingiem, tę samą wartość należy oceniać w oparciu o inny zestaw poziomów. Jedna liczba, a kategoria przesądza o werdykcie, zanim jeszcze rozpocznie się interpretacja.

Zakresy te również ulegają przesunięciom. Percentyle obliczone dla ostatnich dwunastu miesięcy opisują właśnie ten okres, a zakres referencyjny skopiowany z artykułu sprzed dekady opisuje rynek o innym miksie kontraktów i niemal całkowitym braku handlu opcjami z zerowym terminem zapadalności. Ponowne obliczenie percentyli w oparciu o niedawne okno czasowe jest jedynym rzetelnym sposobem na określenie, czy odczyt jest wysoki, czy niski.

Interpretacja to zadanie odrębne od obliczeń. Wysoki odczyt jest przez niektórych odczytywany jako niedźwiedzie pozycjonowanie, a przez kontrarian jako zatłoczony hedging, przy czym artykuł czy wysoki wskaźnik put/call jest byczy szczegółowo analizuje ten spór.

Dlaczego średnia krocząca z dwudziestu jeden sesji

Wskaźnik z jednej sesji stanowi niewielką próbkę zaszumionego szeregu danych, dlatego publikowana wersja jest zazwyczaj wygładzana. Powszechnie przyjętą konwencją jest średnia krocząca z dwudziestu jeden sesji, co odpowiada w przybliżeniu jednemu miesiącowi handlowemu: sumuje się ostatnie dwadzieścia jeden dziennych wskaźników, dzieli przez dwadzieścia jeden, a następnie przesuwa okno o jedną sesję. Istnieją również wersje dziesięcio- i pięćdziesięciosesyjne, a wybrana długość okresu decyduje o tym, w jakim stopniu pojedynczy skok kursu pozostaje widoczny.

Warto znać dwa szczegóły. Uśrednianie dwudziestu jeden dziennych wskaźników to nie to samo, co podzielenie miesięcznego wolumenu opcji put przez miesięczny wolumen opcji call; pierwszy sposób nadaje każdej sesji taką samą wagę, drugi przypisuje większą wagę sesjom o wyższej aktywności. Ponadto wygładzony odczyt w punkcie ekstremalnym powstawał przez miesiąc sesji, więc równie powoli z tego ekstremum wychodzi.

ZapytanieDzienny wskaźnik put/call dla pojedynczych akcji względem średniej z 21 sesji
Dokładny kod SQL dla każdej liczby
WITH
    daily AS
    (
        SELECT
            d,
            toFloat64(sumIf(volume, right_letter = 'P'))
                / toFloat64(sumIf(volume, right_letter = 'C')) AS raw_ratio
        FROM
        (
            SELECT
                date                                     AS d,
                volume,
                substring(ticker, length(ticker) - 8, 1) AS right_letter
            FROM global_markets.options_greeks
            WHERE date >= '2026-01-02'
              AND date <  '2026-08-01'
              AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
              AND volume > 0
        )
        GROUP BY d
        HAVING countIf(right_letter = 'C') > 0
    )
SELECT
    session_date,
    day_label,
    daily_ratio,
    ma21_ratio
FROM
(
    SELECT
        d,
        toString(d)                                                 AS session_date,
        concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
        round(raw_ratio, 2)                                         AS daily_ratio,
        round(avg(raw_ratio) OVER (ORDER BY d ROWS BETWEEN 20 PRECEDING AND CURRENT ROW), 2) AS ma21_ratio
    FROM daily
)
WHERE d >= '2026-04-01'
ORDER BY d
Run this yourself

Poszarpana linia to dzienny wskaźnik dla koszyka pojedynczych akcji, a wygładzona to jego średnia z dwudziestu jeden sesji. Na pierwszej przedstawionej sesji, Apr 1, dzienny wolumen wyniósł 1.04 wobec wygładzonego 0.81. W dniu Jul 31 para odnotowała wartości 0.56 oraz 0.58. W ciągu 84 sesji średnia przebywa ułamek dystansu, który pokonuje surowy szereg danych, co stanowi główny cel podawania wygładzonej liczby.

Jak liczone są te panele

Typ kontraktu wynika z samego symbolu opcji: litera znajdująca się przed ośmiocyfrowym kodem ceny wykonania to C dla opcji call oraz P dla opcji put. Do obliczeń wliczane są wyłącznie kontrakty, dla których odnotowano wolumen w danej sesji, zatem cena wykonania, dla której nie zawarto żadnej transakcji, nie wpływa na żadną ze stron. Pierwszy panel dzieli miesięczny całkowity wolumen opcji put przez miesięczny całkowity wolumen opcji call dla każdego instrumentu. Pozostałe panele najpierw obliczają jeden wskaźnik na sesję, a następnie sumują te sesje, co odpowiada sposobowi tworzenia publikowanej średniej kroczącej. Koszyki: SPY, QQQ i IWM po stronie szerokiego rynku oraz AAPL, MSFT, NVDA, TSLA i KO po stronie pojedynczych akcji. Każdy panel zawiera dokładne zapytanie SQL, które wygenerowało dane.

Najczęściej zadawane pytania

Jak obliczyć wskaźnik put/call ratio?

Należy podzielić liczbę kontraktów put przez liczbę kontraktów call w tym samym przedziale czasowym. Większość publikowanych zestawień opiera się na wolumenie z danej sesji, zatem odczyt na poziomie 0,65 oznacza, że na każde sto kontraktów call przypada sześćdziesiąt pięć kontraktów put. Wersja oparta na otwartych pozycjach (open interest) wykorzystuje liczbę pozostających w obrocie kontraktów zamiast liczby zawartych transakcji i służy do analizy innych zależności.

Czy wskaźnik put/call ratio powyżej 1 jest wysoki?

Zależy to od kategorii. W przypadku koszyka pojedynczych akcji przedstawionego w powyższych panelach, dziewięćdziesiąty percentyl dziennych odczytów znajduje się na poziomie 0.76, więc wartości powyżej tego pułapu występują rzadko. W przypadku szerokich ETF-ów rynkowych oraz opcji na indeksy, gdzie zabezpieczanie portfeli koncentruje się po stronie opcji put, odczyty w okolicach 1 lub wyższe są standardem.

Jaka jest różnica między wskaźnikiem put/call ratio opartym na wolumenie a tym opartym na otwartych pozycjach?

Wolumen zlicza kontrakty, którymi obrócono w trakcie sesji, i zeruje się każdego ranka. Otwarte pozycje (open interest) zliczają kontrakty, które pozostają aktywne i przechodzą na kolejne dni. Wskaźnik wolumenowy może podwoić się w trakcie jednej sesji, podczas gdy wskaźnik oparty na otwartych pozycjach zmienia się o kilka procent, dlatego oba mierniki często wskazują odmienne kierunki w tym samym dniu.

Który wskaźnik put/call ratio cytuje prasa finansowa?

Zazwyczaj jest to wskaźnik Cboe equity put/call ratio lub całkowity put/call ratio, najczęściej w formie dwudziestojednosesyjnej średniej kroczącej, a nie surowego dziennego odczytu. Cztery kategorie Cboe charakteryzują się różnymi poziomami bazowymi, dlatego podana wartość bez wskazania kategorii nie może być odniesiona do żadnego punktu odniesienia.


Każdy panel na tej stronie zawiera kod SQL, który wygenerował dane, dzięki czemu każdą wyliczoną wartość można zweryfikować wiersz po wierszu. Aby wykonać analogiczne obliczenia dla innego instrumentu lub w dłuższym przedziale czasowym, należy wprowadzić stosowne zapytanie w języku naturalnym w terminalu Strasmore.

#put call ratio#options#sentiment#cboe#options volume