Volume ratio
Best for same-day flow. It reacts quickly, but it can be noisy around earnings, 0DTE windows, and large hedging transactions.
sum(put.volume) / sum(call.volume)
A put/call ratio scanner compares put activity with call activity across a defined universe. The useful version is not just one number: it segments by ticker, expiration, volume, open interest, and liquidity so the signal can be inspected instead of blindly ranked.
Core formula
put volume / call volume
Use the same ticker universe and expiration window for both sides.
Positioning variant
put OI / call OI
Open interest is slower moving and describes standing exposure, not same-day flow.
Main risk
Unsegmented ratios
Earnings, 0DTE flow, rolls, and hedges can distort a single headline value.
Measurement
A put/call ratio is only meaningful after the measurement boundary is defined. A ticker-level daily ratio, a single-expiration intraday ratio, and a market-wide open-interest ratio are different statistics. They can all be useful, but they should not be compared as if they were the same variable.
For scanner work, start with contract volume inside a controlled expiration window, then add open interest and spread filters. Volume tells you what traded in the current session. Open interest tells you how much exposure was standing after the previous reporting cycle. Spread and quote checks tell you whether the contracts were liquid enough for a signal to matter.
Best for same-day flow. It reacts quickly, but it can be noisy around earnings, 0DTE windows, and large hedging transactions.
sum(put.volume) / sum(call.volume)
Best for standing exposure. It changes more slowly and is useful for context around positioning and crowding.
sum(put.open_interest) / sum(call.open_interest)
Best for interpretation. Compare 0DTE, weekly, monthly, and LEAPS buckets separately before producing one dashboard rank.
group by expiration_date
API workflow
The clean workflow is to fetch expirations, select the expiration window, pull calls and puts with the same filters, aggregate the fields, and store the exact request parameters with the signal. That makes the scanner reproducible and makes false positives easier to debug.
# Calls for one expiration
curl "https://api.cutemarkets.com/v1/options/chain/QQQ/?expiration_date=2026-04-17&contract_type=call&limit=1000" \
-H "Authorization: Bearer YOUR_API_KEY"
# Puts for the same expiration
curl "https://api.cutemarkets.com/v1/options/chain/QQQ/?expiration_date=2026-04-17&contract_type=put&limit=1000" \
-H "Authorization: Bearer YOUR_API_KEY"Scanner design
Compute separate ratios for 0DTE or nearest weekly, standard monthly, quarterly, and long-dated buckets before combining them.
Exclude contracts with low volume, low open interest, or missing quote context. Otherwise one odd contract can dominate the ratio.
Compare a ticker against its own recent distribution before ranking it against structurally different underlyings.
A high put/call ratio can reflect bearish speculation, hedging demand, or protective rolls. The statistic is evidence, not a conclusion.
Pseudo-code
def put_call_ratio(chain_results):
call_volume = 0
put_volume = 0
call_oi = 0
put_oi = 0
for contract in chain_results:
details = contract.get("details", {})
contract_type = details.get("contract_type")
volume = contract.get("day", {}).get("volume") or 0
open_interest = contract.get("open_interest") or 0
if contract_type == "call":
call_volume += volume
call_oi += open_interest
elif contract_type == "put":
put_volume += volume
put_oi += open_interest
return {
"volume_ratio": put_volume / call_volume if call_volume else None,
"open_interest_ratio": put_oi / call_oi if call_oi else None,
}Last verified
Date-sensitive calendar references on this page were checked on April 27, 2026. Calendar math is useful for planning, but listed contracts and exchange calendars should still be verified before production workflows run.
A put/call ratio compares put activity with call activity, commonly using contract volume or open interest. Values above 1 indicate more put activity than call activity in the measured slice.
Use volume for same-day flow and open interest for standing positioning. They answer different questions and should not be mixed without a clear reason.
Yes. Earnings, dividends, hedges, rolls, and 0DTE activity can distort a single ticker. A robust scanner should segment by expiration and liquidity before ranking signals.
Related pages