Strasmore Research

Чи є високий put/call ratio бичачим сигналом?

Контраріанський підхід вважає високий put/call ratio бичачим сигналом. Порівняйте перцентильні діапазони для опціонів на акції та індекси й наслідки екстремальних значень.

Високий put/call ratio — класичний бичачий сигнал із позиції контраріанського підходу: незвично активні покупки put-опціонів вважають ознакою того, що більшість учасників уже підготувалася до падіння. Однак практичне застосування цього сигналу має одну проблему. «Високий» не має фіксованого значення: показник 1,15 на екрані може бути екстремальним для опціонів на окрему акцію, але звичайним значенням для індексних продуктів.

Для відповіді потрібен розподіл, із яким можна порівнювати показник. На цій сторінці такий розподіл наведено для обох груп, після чого виміряно, що відбувалося після високих значень. У поясненні про put/call ratio описано, як розраховується цей коефіцієнт, а весь подальший аналіз ґрунтується на цьому визначенні.

Щодо методики вимірювання — два уточнення. Кожен коефіцієнт тут розраховано за кількістю контрактів, укладених протягом дня, тобто це коефіцієнт обсягу. Open interest враховує позиції, які залишаються відкритими, і належить до іншого показника (обсяг проти open interest пояснює різницю). Дані також охоплюють фіксований кошик: десять широко відомих окремих акцій проти трьох broad-market ETFs, а не весь ринок. Тому оцінюйте форму розподілу, а не останній десятковий знак.

Яке значення put/call ratio вважається високим?

Перцентиль відповідає на запитання, на яке не може відповісти сам рівень. Наведена нижче крива охоплює кожну торгову сесію з січня 2022 року до липня 2026 року: для кожного book наведено один ratio на сесію.

ЗапитПерцентилі співвідношення обсягів put/call: кошик окремих акцій проти індексних ETF, 2022 — липень 2026
Точний SQL-код для кожного числа
WITH book_days AS (
    SELECT date AS day,
           if(underlying_symbol IN ('SPY', 'QQQ', 'IWM'), 'index_etf', 'equity') AS book,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
    FROM global_markets.options_greeks
    WHERE date >= toDate('2022-01-01')
      AND date <= toDate('2026-07-31')
      AND volume > 0
      AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',
                                'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY day, book
    HAVING call_volume > 0
),
paired AS (
    SELECT day,
           toFloat64(sumIf(put_volume, book = 'equity'))
             / toFloat64(sumIf(call_volume, book = 'equity')) AS equity_pcr,
           toFloat64(sumIf(put_volume, book = 'index_etf'))
             / toFloat64(sumIf(call_volume, book = 'index_etf')) AS index_pcr
    FROM book_days
    GROUP BY day
    HAVING sumIf(call_volume, book = 'equity') > 0
       AND sumIf(call_volume, book = 'index_etf') > 0
),
curves AS (
    SELECT arrayMap(v -> round(v, 2),
                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
                                          (equity_pcr, cityHash64(day))) AS eq,
           arrayMap(v -> round(v, 2),
                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
                                          (index_pcr, cityHash64(day))) AS idx
    FROM paired
)
SELECT z.1 AS percentile,
       z.2 AS equity_pcr,
       z.3 AS index_etf_pcr
FROM (
    SELECT arrayJoin(arrayZip(['p05', 'p10', 'p25', 'p50', 'p75', 'p90', 'p95', 'p99'], eq, idx)) AS z
    FROM curves
)
Run this yourself

У кошику окремих акцій медіанне значення за сесію становило 0.67 put на один call. Верхній дециль сесій починався з 0.89, а найекстремальніший один відсоток перевищував 1.34. Нижня частина розподілу не менш корисна для калібрування: кожна двадцята сесія завершувалася на рівні 0.48 або нижче.

Розподіл для ETF на кожній точці кривої відрізняється. Медіанне значення за сесію становило 1.45 — вище за рівень one-to-one, якому медіана кошика окремих акцій суттєво не досягає. Верхній дециль для ETF починався з 1.77. Ratio без зазначення book майже позбавлений сенсу. Значення 1.15 означає різні речі залежно від того, з якої колонки його взято.

Чому коефіцієнт для індексу вище 1 є нормою, а коефіцієнт для окремих акцій — ні

Якщо розподілити той самий обсяг за базовими активами, рівні чітко розходяться.

ЗапитСпіввідношення обсягів put/call за базовим активом: 1 січня — 31 липня 2026 року
Точний SQL-код для кожного числа
WITH symbol_days AS (
    SELECT underlying_symbol AS symbol,
           date AS day,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
    FROM global_markets.options_greeks
    WHERE date >= toDate('2026-01-01')
      AND date <= toDate('2026-07-31')
      AND volume > 0
      AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',
                                'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY symbol, day
    HAVING call_volume > 0
)
SELECT symbol,
       round(toFloat64(sum(put_volume)) / toFloat64(sum(call_volume)), 2) AS put_call_ratio,
       round(100 * countIf(put_volume > call_volume) / count(), 1) AS above_one_pct,
       count() AS observations
FROM symbol_days
GROUP BY symbol
ORDER BY put_call_ratio DESC
Run this yourself

За перші сім місяців 2026 року IWM очолював таблицю з показником 2.73 put-опціонів на один call-опціон, перевищуючи одиницю у 98.6% з 144 торгових сесій. На нижньому кінці таблиці XOM становив 0.38, перевищуючи одиницю у 2.8% сесій.

Розрив має структурний характер. Опціони на ETF широкого ринку використовують для хеджування портфеля: менеджер, який утримує дві сотні позицій, купує put-опціони на індекс, а не put-опціони на кожен актив. Такий потік не супроводжується відповідним обсягом call-опціонів. Обсяг опціонів на окремі акції, навпаки, більше припадає на купівлю call-опціонів у розрахунку на зростання та продаж call-опціонів проти вже наявних акцій. «Сукупний» коефіцієнт змішує обидва сегменти. Тому він опиняється між ними й залежить від структури продуктів у конкретний день не менше, ніж від настроїв ринку.

Варто враховувати ще один фактор, що зміщує рівень. На індекси та ETF припадає значна частка опціонів із експірацією того самого дня (опціони 0DTE). У період, коли формувалися звичні порогові значення, ця категорія не торгувалася в масштабах, навіть близьких до нинішніх. Старі рівні не можна безпосередньо переносити на ринок з іншою структурою.

Чи є високий put/call ratio бичачим сигналом? Що відбувалося після екстремальних значень

Контрарний сценарій можна перевірити. Кожну сесію розподілили на п'ять груп за значенням equity ratio цього дня, а потім виміряли зміну S&P 500 tracker протягом наступних 5 і 20 сесій.

ЗапитРухи трекера S&P 500 після кожної п’ятої частини співвідношення put/call для акцій, 2022 — липень 2026
Точний SQL-код для кожного числа
WITH raw AS (
    SELECT date AS day,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
    FROM global_markets.options_greeks
    WHERE date >= toDate('2022-01-01')
      AND date <= toDate('2026-07-31')
      AND volume > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META',
                                'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY day
    HAVING call_volume > 0
),
equity_pcr AS (
    SELECT day, toFloat64(put_volume) / toFloat64(call_volume) AS pcr
    FROM raw
),
spy_daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           toFloat64(argMax(close, window_start)) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-08-01')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY day
),
forward AS (
    SELECT day,
           close,
           any(close) OVER (ORDER BY day ASC ROWS BETWEEN 5 FOLLOWING AND 5 FOLLOWING) AS close_5,
           any(close) OVER (ORDER BY day ASC ROWS BETWEEN 20 FOLLOWING AND 20 FOLLOWING) AS close_20
    FROM spy_daily
),
joined AS (
    SELECT p.day AS day,
           p.pcr AS pcr,
           100 * (f.close_5 / f.close - 1) AS fwd_5d_pct,
           100 * (f.close_20 / f.close - 1) AS fwd_20d_pct
    FROM equity_pcr AS p
    INNER JOIN forward AS f ON p.day = f.day
    WHERE f.close_5 > 0 AND f.close_20 > 0
),
cuts AS (
    SELECT quantilesDeterministic(0.2, 0.4, 0.6, 0.8)(pcr, cityHash64(day)) AS q
    FROM joined
)
SELECT multiIf(pcr < q[1], 'lowest fifth',
               pcr < q[2], 'second fifth',
               pcr < q[3], 'middle fifth',
               pcr < q[4], 'fourth fifth',
               'highest fifth') AS pcr_band,
       count() AS observations,
       round(min(pcr), 2) AS band_floor_ratio,
       round(quantileDeterministic(0.5)(fwd_5d_pct, cityHash64(day)), 2) AS fwd_5d_median_pct,
       round(quantileDeterministic(0.5)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_median_pct,
       round(quantileDeterministic(0.25)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p25_pct,
       round(quantileDeterministic(0.75)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p75_pct
FROM joined CROSS JOIN cuts
GROUP BY pcr_band
ORDER BY band_floor_ratio ASC
Run this yourself

Найспокійніша п'ята сесій починається з 0.34, а найактивніша — з 0.81. Отже, до верхнього діапазону потрапляють усі значення, які контрарний інвестор назвав би екстремальними. За ці 226 сесій медіанна зміна за 20 сесій становила 3% проти 0.91% після найспокійнішої п'ятої. Через 5 сесій ці самі два діапазони показали 0.82% і 0.3%.

Медіанні значення приховують важливу частину картини. У верхній п'ятій середні 50% результатів за 20 сесій перебували в діапазоні від -1.82% до 5.71%. У найспокійнішій п'ятій середні 50% результатів становили від -0.83% до 2.67%. Ці два діапазони значною мірою перекриваються. Група, до якої потрапляє сесія, зміщує центр розподілу, але майже не звужує діапазон навколо цього центру. Саме цю частину зазвичай не враховує практичне правило.

Є застереження щодо ваги вибірки. Період із січня 2022 року до липня 2026 року охоплює один ведмежий ринок і подальше відновлення. На кожну групу припадає приблизно 226 сесій. Це реальна вибірка, але вона охоплює лише один відрізок історії ринку.

Чи концентруються екстремальні значення на ринкових мінімумах?

Вони концентруються в місяцях зі зниженням, але це інше твердження. Згрупуймо кожен місяць, починаючи з 2022 року, за зміною трекера протягом місяця, а потім порахуймо, скільки значень put/call у верхньому децилі припало на кожну групу.

ЗапитПоказники put/call у верхньому децилі за місяцями, згруповані за рухом трекера S&P 500
Точний SQL-код для кожного числа
WITH raw AS (
    SELECT date AS day,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
    FROM global_markets.options_greeks
    WHERE date >= toDate('2022-01-01')
      AND date <= toDate('2026-07-31')
      AND volume > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META',
                                'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY day
    HAVING call_volume > 0
),
equity_pcr AS (
    SELECT day, toFloat64(put_volume) / toFloat64(call_volume) AS pcr
    FROM raw
),
cut AS (
    SELECT quantileDeterministic(0.90)(pcr, cityHash64(day)) AS p90
    FROM equity_pcr
),
by_month AS (
    SELECT toStartOfMonth(day) AS month_start,
           countIf(pcr >= cut.p90) AS extreme_reads,
           quantileDeterministic(0.5)(pcr, cityHash64(day)) AS median_pcr
    FROM equity_pcr CROSS JOIN cut
    GROUP BY month_start
),
spy_daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           toFloat64(argMax(close, window_start)) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY day
),
spy_month AS (
    SELECT toStartOfMonth(day) AS month_start,
           100 * (argMax(close, day) / argMin(close, day) - 1) AS move_pct
    FROM spy_daily
    GROUP BY month_start
)
SELECT multiIf(s.move_pct <= -3, 'index down 3% or more',
               s.move_pct < 0, 'index down under 3%',
               s.move_pct < 3, 'index up under 3%',
               'index up 3% or more') AS index_move_bucket,
       count() AS observations,
       round(avg(m.extreme_reads), 1) AS top_decile_reads_avg,
       round(quantileDeterministic(0.5)(m.median_pcr, cityHash64(m.month_start)), 2) AS typical_pcr_ratio
FROM by_month AS m
INNER JOIN spy_month AS s ON m.month_start = s.month_start
GROUP BY index_move_bucket
ORDER BY min(s.move_pct) ASC
Run this yourself

У місяцях, коли трекер завершував період зі зниженням на 3% або більше, у середньому було по 4.2 значень у верхньому децилі. У місяцях зі зростанням на 3% або більше цей показник становив 1.9. Медіанне денне значення кожної групи наведено в останньому стовпці: 0.75 для найгіршої групи та 0.62 для найкращої. На дві крайні групи таблиці припадає 12 і 22 місяців.

Екстремальні значення put/call і зниження цін з’являються одночасно. Це співпадіння, а форвардні показники з попереднього розділу показують, чого воно варте. Коефіцієнт вимірює ситуацію на ринку в той самий день, тому його сплески припадають на періоди зниження, а не передують їм. Ринковий мінімум — це позначка, яку встановлюють уже постфактум.

Інтерпретація рівня на тлі розподілу

Із наведених вище даних випливають два практичні правила.

По-перше, порівнюйте зіставні показники. Значення має сенс лише в контексті історії того самого індикатора за аналогічний період. Саме це показує таблиця перцентилів, на відміну від порогового значення, яке просто запам’ятали.

По-друге, стежте за знаменником. Коефіцієнт знижується, коли обсяг call-опціонів різко зростає, навіть якщо купівля put-опціонів не змінюється. І падіння коефіцієнта, і його стрибок можуть бути спричинені рухом лише однієї частини дробу. Тому окремий аналіз обсягів put- і call-опціонів дає змогу бачити всю арифметику.

Такий самий підхід застосовується до будь-якого індикатора настроїв, наведеного як окреме число. VIX і 30% implied volatility неможливо інтерпретувати без їхніх власних розподілів, а контрарні правила для оцінки настроїв підтверджуються даними лише тоді, коли референтний рівень виміряно, а не припущено.

FAQ

Чи є високий put/call ratio бичачим сигналом?

Контрарний підхід трактує активну купівлю put-опціонів як ознаку того, що більшість учасників уже зайняла позиції на падіння. Якщо порівняти з наведеним вище кошиком окремих акцій, після сесій із показниками у верхній п’ятій частині розподілу медіанна зміна S&P 500 tracker за 20 сесій становила 3%, тоді як після найспокійнішої п’ятої частини — 0.91%. Середні 50% результатів у верхній п’ятій частині розподілу лежали в діапазоні від -1.82% до 5.71%.

Яким є нормальний put/call ratio?

Це повністю залежить від того, які опціони враховуються. Для кошика з десяти широко відомих окремих акцій медіанне значення за сесію з 2022 року до липня 2026 року становило 0.67 put-опціонів на один call-опціон. Для трьох ETF широкого ринку за ті самі сесії медіанне значення становило 1.45.

Чому put/call ratio для індексу вищий, ніж put/call ratio для акцій?

Опціони на широкі індекси та ETF є стандартним інструментом хеджування портфеля. Якщо учасник ринку купує put-опціони на індекс, відповідної угоди з call-опціонами може не бути. В обсягах торгів окремими акціями переважають call-опціони, придбані в розрахунку на зростання, а також call-опціони, продані під уже наявні акції. Це знижує співвідношення в такому сегменті.

Чи підходить put/call ratio для визначення моменту входу в ринок?

Наведені вище дані показують розподіл подальших результатів для кожної п’ятої частини значень. Розкид результатів усередині будь-якого діапазону значно перевищує відстань між медіанами діапазонів. Значення у верхньому децилі також частіше припадали на місяці, коли індекс завершував торги зі зниженням. У найгіршій групі це відбувалося у 4.2 випадків на місяць.

У чому різниця між put/call ratio за обсягом торгів і put/call ratio за відкритим інтересом?

Ratio за обсягом торгів враховує контракти, укладені протягом сесії. Тому він обнуляється щодня й швидко реагує на зміни. Ratio за відкритим інтересом враховує позиції, які залишаються відкритими, тому змінюється повільніше й має власний рівень. Ці показники не є взаємозамінними. Поріг, запозичений для одного з них, може давати неправильний сигнал для іншого.

Як розраховано ці показники
  • Джерело: один рядок на кожен опціонний контракт за кожну сесію із зазначенням обсягу торгів за цю сесію. Put- і call-опціони розділяються за кодом контракту OCC: останні вісім символів позначають strike, а символ перед ними — C для call-опціону та P для put-опціону. Щоб переглянути точну таблицю та фільтри, відкрийте SQL під будь-якою панеллю.
  • Усі ratio на цій сторінці розраховані за обсягом торгів. Відкритий інтерес не входить до розрахунку, тому жоден показник тут не є ratio за відкритим інтересом.
  • Фільтр якості implied volatility не застосовується. Контракти включаються лише за обсягом торгів, оскільки ці панелі підраховують торговельну активність, а не вимірюють волатильність.
  • Кошик: AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO та XOM для окремих акцій, а також SPY, QQQ та IWM для ETF на індекси. Показники, опубліковані біржами, охоплюють увесь ринок і включають такі індексні продукти, як SPX, тому їхні рівні відрізняються.
  • Ціни індексу — це останні regular-session prints кожного дня для S&P 500 tracker. Розрахунок майбутньої дохідності не враховує останні 20 сесій вибірки, оскільки для них ще немає наступних 20 сесій. Місячна зміна розраховується від ціни закриття першої сесії до ціни закриття останньої сесії місяця.

Кожна панель вище розгортається до SQL, на якому вона побудована. Ті самі percentile-запити можна виконати для будь-якого underlying, за яким ви стежите в терміналі Strasmore.

#put-call ratio#sentiment#options structure#contrarian#reference levels