Apakah Rasio Put/Call Tinggi Bullish?
Rasio put/call tinggi dianggap bullish oleh contrarian. Lihat percentile band untuk opsi saham dan indeks, serta apa yang terjadi setelah pembacaan ekstrem.
Rasio put/call yang tinggi merupakan sinyal bullish kontrarian klasik: pembelian put yang jauh lebih besar dari biasanya dianggap menunjukkan bahwa pelaku pasar sudah bersiap menghadapi penurunan. Namun, penerapan sinyal tersebut menghadapi satu masalah. Tidak ada nilai tetap untuk menentukan rasio yang “tinggi”. Rasio 1,15 di layar Anda dapat menjadi nilai ekstrem pada opsi saham individual, tetapi merupakan sesi biasa pada produk indeks.
Yang dibutuhkan adalah distribusi acuan. Halaman ini menyajikan distribusi untuk kedua kelompok tersebut, lalu mengukur apa yang terjadi setelah rasio mencapai level tinggi. Penjelasan tentang rasio put/call membahas cara menghitung rasio ini. Semua uraian di bawah menggunakan definisi tersebut sebagai titik awal.
Dua catatan mengenai pengukuran ini. Setiap rasio di sini menghitung kontrak yang diperdagangkan pada hari itu, sehingga merupakan rasio volume. Open interest menghitung posisi yang masih terbuka dan berada pada tingkat pengukuran yang berbeda (volume versus open interest menjelaskan perbedaan keduanya). Angka-angka ini juga berasal dari basket tetap yang terdiri atas ten saham individual yang dikenal luas dan three ETF pasar luas, bukan dari seluruh transaksi pasar. Karena itu, perhatikan bentuk distribusinya, bukan angka desimal terakhir.
Apa yang termasuk put/call ratio tinggi?
Persentil menjawab pertanyaan yang tidak dapat dijawab oleh suatu level. Kurva di bawah ini mencakup setiap sesi dari Januari 2022 hingga Juli 2026, dengan satu rasio per sesi untuk setiap book.
SQL tepat di balik setiap angka
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
)Pada basket saham individual, median sesi berada di 0.67 put per call. Decile teratas sesi dimulai pada 0.89, sedangkan satu persen sesi yang paling ekstrem melampaui 1.34. Sisi yang tenang juga berguna untuk kalibrasi: satu dari setiap dua puluh sesi berakhir pada atau di bawah 0.48.
Kolom ETF menunjukkan distribusi yang berbeda di setiap titik kurva. Median sesinya berada di 1.45, di atas garis one-to-one yang berada jauh di atas median saham individual, sedangkan decile teratasnya sendiri dimulai pada 1.77. Rasio yang dikutip tanpa menyebutkan book-nya hampir tidak bermakna. Print sebesar 1,15 itu memiliki arti yang berbeda, bergantung pada kolom asalnya.
Mengapa rasio indeks di atas 1 adalah hal yang normal, sedangkan rasio saham di atas 1 tidak
Pisahkan volume yang sama berdasarkan aset dasar, dan levelnya akan terlihat jelas berbeda.
SQL tepat di balik setiap angka
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 DESCSelama tujuh bulan pertama 2026, IWM berada di posisi teratas dengan 2.73 put per call, dan ditutup di atas satu pada 98.6% dari 144 sesi perdagangannya. Di posisi terbawah, XOM diperdagangkan pada 0.38, dan berada di atas satu pada 2.8% sesi.
Kesenjangan ini bersifat struktural. Opsi ETF pasar luas menjadi instrumen untuk melakukan hedging portofolio: manajer yang memegang dua ratus posisi membeli put indeks, bukan put atas setiap kepemilikan, dan arus tersebut tidak memiliki transaksi call yang sepadan di sisi lain. Volume opsi saham individual lebih condong ke call yang dibeli untuk memperoleh eksposur kenaikan dan call yang ditulis terhadap saham yang sudah dimiliki. Rasio “total” menggabungkan kedua buku tersebut. Karena itu, posisinya berada di antara keduanya dan berubah mengikuti komposisi produk pada hari tersebut, bukan hanya sentimen.
Ada satu pergeseran level lain yang perlu diketahui. Volume indeks dan ETF kini mencakup porsi besar dari expiry pada hari yang sama (opsi 0DTE), yaitu kategori yang belum diperdagangkan dalam skala seperti ini ketika ambang batas yang umum digunakan pertama kali ditetapkan. Level lama tidak dapat diterapkan begitu saja pada tape dengan komposisi yang berbeda.
Apakah put/call ratio yang tinggi bullish? Apa yang terjadi setelah kondisi ekstrem
Kasus kontrarian dapat diuji. Kelompokkan setiap sesi ke dalam lima kelompok berdasarkan equity ratio pada hari tersebut, lalu ukur pergerakan tracker S&P 500 selama 5 dan 20 sesi berikutnya.
SQL tepat di balik setiap angka
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 ASCKelompok sesi paling tenang dimulai pada 0.34, sedangkan kelompok sesi paling aktif dimulai pada 0.81. Dengan demikian, kelompok teratas mencakup semua pembacaan yang akan dianggap terlalu ekstrem oleh investor kontrarian. Dalam 226 sesi tersebut, median pergerakan 20 sesi mencapai 3%, dibandingkan dengan 0.91% setelah kelompok paling tenang. Setelah 5 sesi, kedua kelompok tersebut masing-masing mencatat 0.82% dan 0.3%.
Median menyembunyikan bagian yang penting. Di dalam kelompok teratas, separuh hasil pergerakan 20 sesi berada dalam rentang -1.82% hingga 5.71%. Di dalam kelompok paling tenang, separuh hasilnya berada dalam rentang -0.83% hingga 2.67%. Kedua rentang tersebut mencakup sebagian besar area yang sama. Kelompok tempat suatu sesi berada menggeser titik tengah distribusi, tetapi hampir tidak mempersempit rentang di sekitar titik tengah tersebut. Inilah bagian yang tidak tercakup dalam aturan praktis.
Ada satu catatan terkait bobot sampel. Periode Januari 2022 hingga Juli 2026 mencakup satu bear market dan pemulihan setelahnya, dengan sekitar 226 sesi per kelompok. Ini merupakan sampel yang nyata, tetapi hanya mencerminkan satu periode dalam sejarah pasar.
Apakah pembacaan ekstrem mengelompok di sekitar titik terendah pasar?
Pembacaan tersebut mengelompok pada bulan-bulan ketika pasar turun. Itu merupakan klaim yang berbeda. Kelompokkan setiap bulan sejak 2022 berdasarkan pergerakan tracker di dalam bulan tersebut, lalu hitung berapa banyak pembacaan put/call desil teratas yang jatuh ke setiap kelompok.
SQL tepat di balik setiap angka
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) ASCBulan ketika tracker berakhir 3% atau lebih rendah rata-rata mencatat 4.2 pembacaan desil teratas per bulan, dibandingkan dengan 1.9 pada bulan ketika tracker naik 3% atau lebih. Median pembacaan harian setiap kelompok tercantum di kolom terakhir, yaitu 0.75 untuk kelompok terburuk dan 0.62 untuk kelompok terbaik. Kedua ujung tabel tersebut mencakup 12 dan 22 bulan.
Pembacaan put/call ekstrem dan penurunan harga muncul secara bersamaan. Ini merupakan ko-occurrence, dan angka forward pada bagian sebelumnya menunjukkan nilai informasinya. Rasio tersebut merupakan pengukuran pada hari yang sama atas tape pada hari yang sama, sehingga lonjakannya muncul di tengah penurunan, bukan sebelumnya. Titik terendah baru diberi label setelah peristiwa tersebut terjadi.
Membaca suatu level dibandingkan dengan distribusinya
Dari angka-angka di atas, ada dua kebiasaan penting.
Pertama, bandingkan hal yang sejenis. Suatu angka hanya bermakna jika dibandingkan dengan riwayat indikator yang sama dalam periode yang sebanding. Inilah yang diberikan tabel persentil, bukan ambang batas yang hanya diingat.
Kedua, perhatikan penyebutnya. Rasio tersebut turun ketika volume call melonjak, meskipun pembelian put tidak berubah. Penurunan maupun lonjakan rasio dapat terjadi hanya karena salah satu sisi pecahan bergerak. Karena itu, membaca volume put dan volume call secara terpisah membuat perhitungannya tetap terlihat.
Disiplin yang sama berlaku untuk setiap indikator sentimen yang dikutip sebagai angka tunggal. VIX dan angka implied volatility 30% tidak dapat dibaca tanpa distribusinya masing-masing. Aturan sentimen kontrarian hanya didukung oleh data jika level acuannya diukur, bukan diasumsikan.
FAQ
Apakah put/call ratio yang tinggi bersifat bullish?
Pembacaan kontrarian menganggap pembelian put dalam jumlah besar menunjukkan bahwa pelaku pasar sudah memosisikan diri untuk menghadapi penurunan. Jika diukur terhadap keranjang saham individual di atas, sesi yang berada di seperlima teratas pembacaan diikuti median pergerakan 20 sesi sebesar 3% pada tracker S&P 500, dibandingkan dengan 0.91% setelah seperlima pembacaan yang paling tenang. Separuh hasil pada kelompok seperlima teratas berada dalam rentang -1.82% hingga 5.71%.
Berapa put/call ratio yang normal?
Hal itu sepenuhnya bergantung pada opsi yang dihitung. Pada keranjang berisi sepuluh saham individual yang umum diperdagangkan, median sesi dari 2022 hingga Juli 2026 menunjukkan 0.67 put per call. Pada tiga ETF pasar luas dalam sesi yang sama, median tersebut menunjukkan 1.45.
Mengapa put/call ratio indeks lebih tinggi daripada put/call ratio saham?
Opsi indeks luas dan ETF merupakan sarana standar untuk melakukan lindung nilai portofolio. Hedger yang membeli put indeks tidak memiliki transaksi call yang berpasangan dengannya. Volume saham individual lebih banyak berasal dari pembelian call untuk memperoleh eksposur kenaikan dan penulisan call atas saham yang sudah dimiliki. Hal ini membuat rasio pada kelompok tersebut lebih rendah.
Apakah put/call ratio efektif untuk menentukan waktu pasar?
Pengukuran di atas menunjukkan distribusi hasil setelah setiap seperlima pembacaan. Rentang hasil di dalam satu kelompok jauh lebih lebar daripada jarak antara median antarkelompok. Pembacaan pada desil teratas juga terkonsentrasi pada bulan-bulan ketika indeks berakhir lebih rendah, dengan penurunan sebesar 4.2 per bulan pada kelompok terburuk.
Apa perbedaan antara put/call ratio berdasarkan volume dan berdasarkan open interest?
Rasio volume menghitung kontrak yang diperdagangkan selama satu sesi. Karena itu, rasio ini kembali dihitung setiap hari dan bereaksi dengan cepat. Rasio open interest menghitung posisi yang masih terbuka. Perubahannya lebih lambat dan berada pada tingkatnya sendiri. Keduanya tidak dapat dipertukarkan. Ambang batas yang diambil dari salah satunya dapat menghasilkan pembacaan yang keliru jika diterapkan pada yang lain.
Cara menyusun angka-angka ini
- Sumbernya terdiri atas satu baris untuk setiap kontrak opsi pada setiap sesi, yang memuat volume perdagangan sesi tersebut. Put dan call dipisahkan berdasarkan kode kontrak OCC. Delapan karakter terakhir menunjukkan strike, sedangkan karakter tepat sebelumnya adalah C untuk call dan P untuk put. Buka SQL di bawah panel mana pun untuk melihat tabel dan filter yang digunakan secara tepat.
- Setiap rasio di halaman ini merupakan rasio volume. Open interest tidak termasuk dalam perhitungan. Karena itu, tidak ada rasio open interest di sini.
- Tidak ada filter kualitas implied volatility yang diterapkan. Kontrak dimasukkan hanya berdasarkan volume perdagangan, karena panel-panel ini menghitung aktivitas perdagangan, bukan mengukur volatilitas.
- Keranjangnya terdiri atas AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO, dan XOM untuk kelompok saham individual, serta SPY, QQQ, dan IWM untuk kelompok index-ETF. Rasio yang diterbitkan bursa mencakup seluruh pasar dan memasukkan produk indeks seperti SPX. Karena itu, tingkatnya berada pada kisaran yang berbeda.
- Harga indeks menggunakan print sesi reguler terakhir setiap hari untuk tracker S&P 500. Perhitungan forward return menghapus 20 sesi terakhir dalam sampel karena belum memiliki periode 20 sesi berikutnya. Pergerakan bulanan dihitung dari penutupan sesi pertama hingga penutupan sesi terakhir dalam setiap bulan.
Setiap panel di atas dapat dibuka untuk menampilkan SQL yang mendasarinya. Kueri persentil yang sama dapat dijalankan terhadap underlying apa pun yang Anda ikuti di terminal Strasmore.