Является ли высокое соотношение put/call бычьим сигналом?
Инвесторы считают высокий коэффициент put/call сигналом к росту. Изучите перцентили для акций и индексов, чтобы понять, как рынок реагирует на экстремальные значения показателя.
Высокое соотношение put/call — это классический контр-индикатор для «бычьего» прогноза: необычно активная покупка put-опционов воспринимается как признак того, что толпа уже подготовилась к падению. Однако использование этого сигнала сталкивается с одной проблемой. У понятия «высокое» нет фиксированного значения: показатель 1,15 на экране может быть экстремальным для опционов на отдельные акции и вполне обычным для индексных продуктов.
Для анализа требуется эталонное распределение. На этой странице оно приведено для обеих категорий, а также показано, что следовало за высокими значениями. В пояснении к соотношению put/call описано, как строится этот показатель, и все дальнейшие выводы опираются на это определение.
Два примечания к измерениям. Все соотношения здесь учитывают количество контрактов, проторгованных за день, то есть являются показателями объёма; открытый интерес учитывает позиции, которые остаются открытыми, и находится на другом уровне (объём против открытого интереса разделяет эти понятия). Кроме того, цифры получены на основе фиксированной корзины, состоящей из десяти известных акций и трёх широких ETF, а не по всему рынку, поэтому оценивайте форму распределения, а не последний десятичный знак.
Что считается высоким коэффициентом put/call?
Перцентиль отвечает на вопрос, на который не может ответить абсолютное значение. Приведенная ниже кривая охватывает каждую торговую сессию с января две тысячи двадцать второго года по июль две тысячи двадцать шестого года, по одному коэффициенту на сессию для каждой категории инструментов.
Точный 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
)Для корзины отдельных акций медианное значение сессии составило 0.67 пут-опционов на один колл-опцион. Десятый верхний дециль сессий начинался с 0.89, а самый экстремальный один процент превысил 1.34. Нижний диапазон также полезен для калибровки: одна сессия из двадцати завершилась на уровне 0.48 или ниже.
Для ETF распределение отличается в каждой точке кривой. Медианное значение сессии составило 1.45, что выше линии один к одному, под которой уверенно держится медиана отдельных акций, а собственный верхний дециль начался с 1.77. Коэффициент, указанный без уточнения категории инструментов, практически лишен смысла. Значение один целая пятнадцать сотых означает две разные вещи в зависимости от того, к какой категории оно относится.
Почему коэффициент индекса выше единицы — это норма, а коэффициент акций — нет
Разделите тот же объем по базовым активам, и уровни четко разойдутся.
Точный 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За первые семь месяцев 2026 года IWM возглавлял таблицу с показателем 2.73 пут-опционов на один колл-опцион, завершив торги выше единицы в 98.6% из своих 144 сессий. В нижней части списка XOM торговался на уровне 0.38, превысив единицу в 2.8% сессий.
Этот разрыв носит структурный характер. Опционы на широкие рыночные ETF используются для хеджирования портфелей: управляющий, владеющий двумя сотнями позиций, покупает индексные путы, а не путы на каждый актив, и этот поток не имеет встречной сделки с колл-опционами. Объем опционов на отдельные акции смещен в другую сторону — в пользу коллов, купленных для игры на повышение, и коллов, проданных против уже имеющихся акций. «Общий» коэффициент объединяет обе категории, что ставит его посередине и заставляет меняться в зависимости от структуры инструментов в конкретный день не меньше, чем от рыночных настроений.
Стоит учитывать еще один сдвиг уровней. Объем по индексам и ETF сейчас в значительной степени состоит из опционов с экспирацией в тот же день (0DTE опционы) — категория, которая не торговалась в подобных масштабах, когда устанавливались привычные пороговые значения. Старые уровни не применимы к ленте сделок с иным составом.
Является ли высокое соотношение put/call «бычьим» сигналом? Что следовало за экстремальными значениями
Контринтуитивный подход поддается проверке. Разделим все торговые сессии на пять равных групп (квинтилей) по дневному соотношению put/call для акций, а затем измерим динамику ETF на индекс 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
),
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Группа сессий с самыми низкими показателями начинается с 0.34, а группа с самыми высокими — с 0.81. Таким образом, верхний диапазон включает все значения, которые сторонник контринтуитивной стратегии назвал бы экстремальными. За эти 226 сессий медианное изменение за двадцать сессий составило 3%, тогда как после группы с самыми низкими показателями оно равнялось 0.91%. На горизонте пяти сессий те же два диапазона показали значения 0.82% и 0.3%.
Медианы скрывают наиболее важную часть данных. Внутри верхней квинтили средняя половина результатов за двадцать сессий варьировалась от -1.82% до 5.71%. Внутри группы с самыми низкими показателями этот диапазон составлял от -0.83% до 2.67%. Эти два интервала во многом перекрываются. Принадлежность сессии к определенной группе смещает центр распределения, но почти не сужает диапазон вокруг этого центра, что и упускают из виду упрощенные правила.
Одно предостережение относительно веса данных. Период с января две тысячи двадцать второго года по июль две тысячи двадцать шестого года включает один «медвежий» рынок и последующее восстановление, что составляет примерно 226 сессий на каждую группу. Это реальная выборка, но она представляет собой лишь один отрезок рыночной истории.
Наблюдается ли скопление экстремальных значений на рыночных минимумах?
Они скапливаются в месяцы падения, что является иным утверждением. Сгруппируйте каждый месяц начиная с 2022 года по динамике движения трекера внутри него, а затем подсчитайте, сколько показаний put/call из верхнего дециля пришлось на каждую группу.
Точный 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В месяцы, когда трекер закрывался на три процента или более ниже, в среднем приходилось 4.2 показаний из верхнего дециля, против 1.9 в месяцы, когда он прибавлял три процента или более. Медианное дневное значение для каждой группы указано в последнем столбце: 0.75 для худшей группы и 0.62 для лучшей. На два края таблицы приходится 12 и 22 месяцев.
Экстремальные значения put/call и падение цен проявляются одновременно. Это сопутствующее явление, а прогнозные показатели из предыдущего раздела показывают, чего оно стоит. Коэффициент — это измерение ленты сделок за тот же день, поэтому его всплески происходят внутри периодов снижения, а не перед ними. Минимум — это ярлык, который присваивается постфактум.
Интерпретация уровня относительно распределения
Из приведенных выше цифр вытекают две привычки.
Во-первых, сравнивайте сопоставимые показатели. Значение имеет смысл только в контексте собственной истории того же инструмента за аналогичный период. Именно это дает таблица перцентилей, в отличие от запомненного порогового значения.
Во-вторых, следите за знаменателем. Коэффициент падает при резком росте объема call-опционов, даже если покупка put-опционов остается неизменной. Как падение, так и скачок коэффициента могут быть вызваны движением только одной части дроби. Поэтому раздельный анализ объемов put и call позволяет видеть реальную арифметику процесса.
Та же дисциплина применима к любому индикатору настроений, представленному в виде простого числа. VIX и значение подразумеваемой волатильности в тридцать процентов невозможно интерпретировать без их собственных распределений, а правила контринтуитивного анализа настроений подтверждаются данными только тогда, когда базовый уровень измерен, а не принят как допущение.
Часто задаваемые вопросы
Является ли высокий коэффициент put/call «бычьим» сигналом?
Контринтуитивный подход рассматривает активную покупку put-опционов как признак того, что толпа уже заняла позиции в расчете на падение. При сопоставлении с указанной выше корзиной отдельных акций, сессии, попавшие в верхнюю пятую часть значений, сопровождались медианным двадцатидневным движением в 3% для трекера S&P 500, по сравнению с 0.91% после сессий с самыми низкими показателями. При этом средняя половина результатов из верхней пятой части находилась в диапазоне от -1.82% до 5.71%.
Что считается нормальным коэффициентом put/call?
Это полностью зависит от того, какие опционы учитываются. По корзине из десяти популярных акций медианное значение за период с две тысячи двадцать второго года по июль две тысячи двадцать шестого года составило 0.67 put-опционов на один call-опцион. По трем широким рыночным ETF за те же сессии медианное значение составило 1.45.
Почему коэффициент put/call для индекса выше, чем для акций?
Опционы на широкие индексы и ETF являются стандартным инструментом хеджирования портфелей, и хеджер, покупающий индексные put-опционы, не всегда совершает встречную сделку с call-опционами. Объем торгов по отдельным акциям смещен в сторону call-опционов, которые покупаются для игры на повышение или продаются как часть стратегии покрытия (covered call) по уже имеющимся акциям, что удерживает коэффициент для таких бумаг на более низком уровне.
Работает ли коэффициент put/call для выбора времени входа в рынок?
Приведенные выше измерения показывают распределение результатов, следовавших за каждой пятой частью значений, при этом разброс внутри любого диапазона значительно шире, чем разница между медианами диапазонов. Значения из верхней децили также концентрируются в месяцах, которые индекс завершал снижением, с частотой 4.2 в месяц в худшей группе.
В чем разница между коэффициентом put/call по объему и по открытому интересу?
Коэффициент по объему учитывает контракты, проторгованные в течение сессии, поэтому он обнуляется каждый день и быстро реагирует на изменения. Коэффициент по открытому интересу учитывает позиции, которые остаются не закрытыми; он меняется медленно и находится на своем собственном уровне. Эти два показателя не взаимозаменяемы, и пороговое значение, взятое из одного, приведет к неверной интерпретации другого.
Как рассчитываются эти показатели
- Источник: одна строка на опционный контракт за сессию, содержащая объем торгов за эту сессию. Put и call-опционы разделяются на основе кода контракта OCC, где последние восемь символов обозначают цену исполнения, а символ перед ними — C для call и P для put. Откройте SQL под любой панелью для просмотра точной таблицы и фильтров.
- Каждый коэффициент на этой странице является коэффициентом по объему. Открытый интерес не участвует в расчетах, поэтому здесь нет коэффициентов по открытому интересу.
- Фильтр по качеству подразумеваемой волатильности не применяется. Контракты попадают в выборку только на основании объема торгов, так как эти панели учитывают торговую активность, а не измеряют волатильность.
- Корзина: AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO и XOM для портфеля отдельных акций, плюс SPY, QQQ и IWM для портфеля индексных ETF. Публикуемые биржами коэффициенты охватывают весь рынок и включают индексные продукты, такие как SPX, поэтому их уровни отличаются.
- Цены индекса — это последний принт регулярной торговой сессии каждого дня для трекера S&P 500. Форвардная доходность не учитывает последние двадцать сессий выборки, для которых еще нет данных о будущих двадцати сессиях. Месячные изменения рассчитываются от цены закрытия первой сессии до цены закрытия последней сессии внутри каждого месяца.
Каждая панель выше разворачивается, показывая лежащий в ее основе SQL-запрос; те же запросы по процентилям можно запустить для любого базового актива, за которым вы следите в терминале Strasmore.