Option Scanner
Open More → Option Scanner in the top navigation bar. It's a read-only research tool — scans and shows you the option chain, never places an order.
Everything on the page — instruments, spot, option LTPs, and open interest — comes from whichever Broker you pick in the scan form (Kite, Breeze, or Dhan), switchable per scan with no restart. There's no requirement that it be the same broker your strategies trade through.
Scan Modes
Three radio buttons at the top of the form switch the whole page between modes — the controls below them change to match.
Specific Underlying
Type an index (NIFTY, BANKNIFTY, FINNIFTY, MIDCPNIFTY, SENSEX — offered in the autocomplete) or an F&O stock symbol, pick an expiry, and scan its full option chain.
Top F&O Stocks
Scans the market's most active F&O stocks instead of one you name — rank by Value (₹ turnover) or Volume (shares), pick Top 10/20/50, and an Expiry Mode of Nearest or Monthly.
Flow (OI Analysis)
Per-strike open-interest buildup for one underlying's expiry — see Flow mode below. The common filters below (Option Type, LTP %) don't apply here — everything on the expiry is shown.
Common Controls (Specific / Top modes)
- Option Type — Both, CE only, or PE only.
- LTP > x% of Spot — only show strikes where the option's last price is
at least this percentage of the underlying's spot price. Default
0.5.
Results Columns (Specific / Top modes)
| Column | Meaning |
|---|---|
| Spot | Underlying's spot price at scan time — shown in Top mode only; in Specific mode it's in the summary line (see below) |
| Strike | Strike price |
| Type | CE (call) or PE (put) |
| LTP | Last traded price |
| Bid / Ask | Best bid/offer, top of book — — when the broker's depth data wasn't available for that strike |
| Premium % | LTP ÷ spot price × 100 |
| IV % | Implied volatility (annualized), solved from LTP |
| Delta | Rate of change in LTP per ₹1 move in the underlying |
| Gamma | Rate of change of Delta per ₹1 move in the underlying |
| Theta | Time decay — LTP change per calendar day |
| Vega | LTP change per 1 percentage point of IV |
| OI | Open interest (outstanding contracts) |
IV/Delta/Gamma/Theta/Vega are all solved from LTP via Black-Scholes — no
broker exposes native IV/Greeks, so these are model estimates, not
broker-reported values. Any of them can show — when the LTP falls outside
the range implied_vol can solve (illiquid/mispriced quote).
In Specific mode, Spot (and the scan's underlying and expiry) is the same on every row, so it's not shown as a column — it's already in the summary line above the table. It's still included in Export CSV and Ask AI, which add hidden Underlying, Expiry and Spot columns so the data is self-contained once it leaves the page.
Top F&O Stocks mode shows Underlying, Expiry and Spot as real columns since results span multiple stocks — Spot then reflects each row's own stock, not one shared value. Click any column header to sort; Export CSV saves the current table (spot/bid/ask/Greeks included).
Flow Mode Columns
| Column | Meaning |
|---|---|
| Spot | Hidden on screen (same on every row — shown in the summary line instead); still included in Export CSV and Ask AI |
| Strike / Type | Same as above |
| LTP | Last traded price |
| Bid / Ask | Best bid/offer, top of book — same caveat as above |
| Spread % | (Ask − Bid) ÷ midpoint. — when either side is missing. Above 5% the row's Flag is capped at NOTABLE; above 10% it gets no Flag (the Score still shows). A ⚠ marks anything over 5% |
| IV % / Delta / Gamma / Theta / Vega | Same Black-Scholes estimates as Specific/Top mode above |
| OI | Open interest |
| OI Δ (today) | Change in OI vs. the previous trading day's close |
| Volume | Contracts traded today |
| Vol/OI | Volume ÷ OI — higher means more fresh activity relative to what's already open |
| Net Chg | Change in LTP (₹) vs. previous close |
| Buildup | Price % + OI % move combined, by strength — see below |
| Score | Unusual Activity score, 0-100 — see below |
| Flag | EXTREME/HIGH/NOTABLE from the score, plus unusual when today's volume has reached 50% of open interest |
How the Unusual Activity score works
The goal: separate a strike where positioning genuinely looks abnormal from the normal background noise of a chain where every strike moves a little every day. Four signals are scored independently, added together into one 0-100 number, and the number is translated into a flag.
A strike needs a minimum open interest (100 contracts) before any of this
runs at all — below that, Buildup shows Weak / Mixed and Score/Flag stay
blank. Below that floor there's too little OI for the ratios to mean
anything, and an illiquid or untradeable contract (an ltp of 0, e.g. a
broker returning zero for a contract "not enabled for trading") would
otherwise read as a fabricated ~100% price crash.
1. Volume Turnover — how much of today's open interest just traded
Volume ÷ Current OI. A ratio of 15 means today's volume alone is 1.5×
the entire open interest — most of that OI has changed hands today, not a
quiet day of odd-lot trading.
| Vol ÷ OI | < 3 | 3-5 | 5-10 | 10-20 | ≥ 20 |
|---|---|---|---|---|---|
| Points | 0 | 5 | 15 | 25 | 40 |
2. Fresh OI Positioning — how much of the open interest is brand new today
ABS(today's OI change) ÷ ABS(yesterday's closing OI), as a percentage. A
big swing here means real new contracts are being opened or closed, not
existing positions just being marked around.
| Fresh OI % | < 10% | 10-25% | 25-50% | 50-100% | ≥ 100% |
|---|---|---|---|---|---|
| Points | 0 | 5 | 10 | 20 | 30 |
If yesterday's OI was ~0 (a strike that just opened), this percentage is
meaningless (division by nothing) — the score is capped at 30 and the strike
is marked new_position instead of computing a ratio.
3. Buildup Confirmation — does price agree with OI?
Combines the strike's price % move with its OI % move — the classic "buildup" read: price and OI rising together means new money is confidently opening the same side; price and OI moving opposite ways means positions are being closed, not opened.
| Price move | OI up ≥ 20% | OI down ≥ 20% |
|---|---|---|
| ≥ 1% | Strong Long/Short Buildup — 15 pts | Short Covering / Long Unwinding — 10 pts |
| 0.5-1% | Moderate Long/Short Buildup — 10 pts | — |
| below both thresholds | Weak / Mixed — 0-5 pts | Weak / Mixed — 0-5 pts |
("Long" if price rose, "Short" if it fell.) A brand-new strike (new_position
above) always reads as a fresh, high-conviction build here regardless of its
price move — there's no prior OI to compare against, so the direction is
taken as given.
4. ATM Proximity — how close the strike is to the current spot price
ABS(Strike - Spot) ÷ Spot, as a percentage. Activity right at the money
matters more than the same activity in a deep-OTM strike nobody trades —
this component rewards strikes near spot and lets far-OTM strikes score low
here even if the other three are high.
| Distance from spot | ≤ 0.5% | 0.5-1.0% | 1.0-2.0% | 2.0-3.0% | > 3.0% |
|---|---|---|---|---|---|
| Points | 15 | 12 | 8 | 4 | 0 |
Adding it up: Score = Volume Turnover + Fresh OI + Buildup + ATM
Proximity, out of a possible 100. The score sorts into a flag:
| Score | Flag | Meaning |
|---|---|---|
| 70-100 | 🔴 EXTREME | Exceptional — worth immediate attention |
| 50-69 | 🟠 HIGH | Clearly abnormal positioning |
| 30-49 | 🟡 NOTABLE | Worth keeping an eye on |
| < 30 | — | Normal, no flag |
The percentile filter — the last check before a flag shows. A score crossing one of the bands above isn't enough on its own: the strike must also rank near the top of that same expiry's own chain today (top ~3% for EXTREME, next ~5% for HIGH, next ~10% for NOTABLE). This matters most on expiry day or a gap-up/gap-down morning, when the whole chain moves together — without this check, an absolute score threshold would flag nearly every strike, which defeats the point of "unusual." A strike can show a score in the 30s-50s with no badge at all if the rest of the chain scored even higher today.
Worked example: NIFTY 25000 CE, spot at 25010 (0.04% away — 15 ATM pts), OI 1,20,000 → 1,45,000 (Fresh OI 20.8% → 5 pts), volume 6,00,000 against that 1,45,000 OI (Vol/OI 4.1 → 5 pts), price up 1.4% (Strong Long Buildup → 15 pts). Score = 15+5+5+15 = 40 → NOTABLE, if it also ranks in the top ~10% of that expiry's chain today.
The chain-wide PCR (OI) (put OI ÷ call OI) shows in the summary line above the table.
Chain summary tiles (the row of small cards under the summary line, also included in Ask AI). All of
it comes from the same scan (plus one small extra quote request for IV term and one for the next-month futures) and any figure
that can't be computed (no spot, no Greeks) shows —:
| Item | Meaning |
|---|---|
| Futures | The nearest-expiry futures contract: price, basis (futures − spot, also as % of spot), OI and today's OI change, and a buildup label from price × OI: Long Buildup (price ↑, OI ↑), Short Buildup (price ↓, OI ↑), Short Covering (price ↑, OI ↓), Long Unwinding (price ↓, OI ↓), or Flat / Mixed for tiny moves (price under 0.05% or OI under 0.5%). Use it to cross-check the option flow — e.g. put writing under a futures long buildup reads differently from put writing under a short buildup. Shows — on Breeze (its integration has no futures contracts) or if the futures quote fails; the option scan is never blocked by it |
| Next futures | The next-month futures contract's price, OI and OI change, plus the combined near + next OI change. When the two OI changes are roughly equal and opposite (residual under 30% of the larger one) it says Roll — positions moving to next month, so the near-month "Long Unwinding" / "Short Covering" label above is not a real exit. Most useful in roll week. Hidden when there's no next-month contract (Breeze) |
| IV term | ATM IV and 1σ move for the next 4 expiries, from a quote of the 7 strikes around the money in each. A front expiry with higher IV than the next one is flagged inverted — event risk. Note the 1σ move of the selected expiry near expiry day shrinks toward zero; the later expiries show the wider cone |
| ATM IV | Implied vol at the strike nearest spot (average of its CE and PE) |
| 1σ move | Spot × ATM IV × √(time to expiry) — the volatility-implied range to expiry, with its lower–upper bounds |
| 25Δ skew | Put IV at the strike nearest −25 delta minus call IV nearest +25 delta. Positive = downside protection is priced richer. — if no strike is within 0.1 delta of ±25 |
| PCR near-ATM / delta-weighted | PCR using only strikes within ±5% of spot; and PCR weighting each strike's OI by |delta| so deep-OTM OI counts for less |
| Put / Call OI walls | The 3 strikes with the most put OI (support candidates) and call OI (resistance candidates) |
| Top-5 OI share | Share of each side's total OI held by its 5 biggest strikes — higher means more concentrated |
| Max pain | The expiry price at which option buyers' total payout is smallest. Context only, not a signal on its own |
Auto-refresh (Flow mode only) polls on an interval you pick, approximating a live ticker without you re-triggering the scan by hand. It runs server-side, so it keeps going if you navigate away; click Stop to end it.
Scans run in the background. Leaving the page doesn't kill a scan in progress — the last result, and the whole form (mode, underlying, expiry, filters), are restored when you come back. A badge in the top bar shows the scanner's state on every page (running / ready / auto-refresh / recording), and Stop — on the page or the badge — cancels a running scan and ends auto-refresh.
Record history (Flow mode only, off by default) is the always-on counterpart: with the switch on, ThetaPrime saves a snapshot of the selected underlying's option chain every 5 minutes during market hours (Mon–Fri 09:15–15:30 IST, skipping holidays), even with this page closed. Each snapshot covers the next 4 expiries: the nearest two keep the 31 strikes around the money, the other two keep 7 (LTP, bid/ask, OI, volume, IV, delta). It also keeps the near- and next-month futures price and OI, and, for the nearest expiry only, the whole-chain summary above (PCR, max pain, OI walls) — those are never mixed across expiries; later expiries store just their ATM IV and 1σ move. Later expiries can't be reconstructed afterwards, which is why they're recorded from day one. OI, price and IV history builds up for later analysis. Snapshots older than 90 days are deleted automatically.
- Turn the switch on per underlying (NIFTY, BANKNIFTY, …); the status line shows what's being recorded, the last snapshot time and the total kept.
- One broker records for all underlyings — the one selected in the Broker box when you last switched an underlying on.
- It takes effect on the next 5-minute tick, no restart needed. It only runs while ThetaPrime itself is running.
- Snapshots are stored in
flow_snapshots.sqlitein your data folder. It is market data only, so unlike your trades it is not encrypted and is not included in scheduled backups. - Each snapshot is one batched quote request for the nearest chain plus the small later-expiry slices and the two futures. If the broker's token has expired the recorder just skips that tick and logs one error event (not one per tick).
- Don't turn this on in a dev/source install pointed at the same live Dhan or Breeze token as your installed app — the two would each pace themselves against one shared broker rate limit.
Previous-close OI baseline: confirmed accurate for Kite and Breeze. For Dhan it's forwarded to the API but not yet confirmed against a live response — if it doesn't carry OI the way expected, Flow silently falls back to today's first scan as the baseline instead of erroring. A note appears next to the summary line whenever this could apply. See Dhan Known Limitations.
Bid/Ask reliability: Kite and Dhan surface best bid/ask from their native market-depth response — confirmed present in both APIs' documented shape. Breeze's fields (
best_bid_price/best_offer_price) are carried over from breeze_connect's tick-stream naming and haven't been confirmed against a live REST response for the option-chain endpoint specifically — if they're absent or misnamed, Bid/Ask just shows—rather than erroring.
Scans run in the background
A scan keeps running on the server when you leave the page. While it runs (and after it finishes, until you open the scanner again) a ⏳ Scan running / ✓ Scan ready badge shows in the top bar of every other page — click it to return to the results. Coming back to the scanner restores the last result; Clear discards it. Press Stop (next to Scan, or ✕ Stop on the top-bar badge from any page) to cancel a running scan and turn off auto-refresh — it shows whenever a scan is running or auto-refresh is on — it halts at the next stage, so a broker call already in flight still finishes. Only one scan runs at a time, and a scan in progress is lost if ThetaPrime restarts. Flow auto-refresh and Record history also keep running when you leave the page (the badge shows ⟳ Auto-refresh / ● Recording); the ● Recording tag only shows during market hours, even if the switch is left on outside them. Stop ends auto-refresh, and the scanner page restores all your selections when you return. Auto-refresh stops if ThetaPrime restarts.
Ask AI
Both result tables have an ✨ Ask AI button — pick ChatGPT, Claude, Perplexity, Gemini, or Copilot and it builds a prompt from the current scan (as CSV), copies it to your clipboard, and — once you confirm the popup — opens that AI's site so you can paste it in for a second read on notable strikes, mispricings, or unusual activity. No API key stored, no call made from ThetaPrime itself — same bring-your-own-AI pattern as the Strategy Composer's payoff diagram.
From Flow mode, the prompt is different: it includes the summary line and the chain summary tiles (futures, expected move, skew, PCRs, OI walls, max pain) alongside the table, and it tells the AI how to read Buildup, Score/Flag and Spread % — including that flags on wide-spread strikes are unreliable and that there is no trade tape. It asks for where OI is concentrated versus the expected move, whether the option flow agrees with the futures buildup, which strikes deserve a closer look, and what data is still missing.