---
name: nse-options
description: "NSE options chain: OI buildup, PCR, max pain, IV (Nifty/BankNifty)"
category: india
version: 1.0.0
tags: nse, options, derivatives, oi, pcr, maxpain, nifty, banknifty, iv, chain
license: Apache-2.0
---

# NSE Options

Analyze NSE options chain for Nifty and BankNifty — open interest buildup, put-call ratio, max pain level, and implied volatility — using NSE's public JSON API.

## When to Use

- User asks for Nifty or BankNifty options chain
- User wants to know the PCR (put-call ratio) for an index
- User asks for max pain or peak OI strikes
- User wants to see OI change at specific strike prices
- User asks about ITM/OTM options or IV skew

## How to Use

### Fetch options chain for Nifty
```powershell
$headers = @{ "User-Agent" = "Mozilla/5.0"; "Referer" = "https://www.nseindia.com" }
Invoke-WebRequest -Uri "https://www.nseindia.com" -SessionVariable nse -Headers $headers | Out-Null
$chain = Invoke-RestMethod -Uri "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" `
  -Headers $headers -WebSession $nse
$chain.records.data | Select-Object strikePrice,
  @{N='CE_OI';E={$_.CE.openInterest}}, @{N='CE_IV';E={$_.CE.impliedVolatility}},
  @{N='PE_OI';E={$_.PE.openInterest}}, @{N='PE_IV';E={$_.PE.impliedVolatility}} |
  Where-Object { $_.CE_OI -or $_.PE_OI } |
  Sort-Object strikePrice
```

### Calculate PCR (Put-Call Ratio)
```powershell
$headers = @{ "User-Agent" = "Mozilla/5.0"; "Referer" = "https://www.nseindia.com" }
Invoke-WebRequest -Uri "https://www.nseindia.com" -SessionVariable nse -Headers $headers | Out-Null
$chain = Invoke-RestMethod -Uri "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" `
  -Headers $headers -WebSession $nse
$totalCE_OI = ($chain.records.data | ForEach-Object { $_.CE.openInterest } | Measure-Object -Sum).Sum
$totalPE_OI = ($chain.records.data | ForEach-Object { $_.PE.openInterest } | Measure-Object -Sum).Sum
$pcr = [math]::Round($totalPE_OI / $totalCE_OI, 2)
Write-Host "Nifty PCR: $pcr  (CE OI: $totalCE_OI | PE OI: $totalPE_OI)"
```

### Find max pain strike
```powershell
$headers = @{ "User-Agent" = "Mozilla/5.0"; "Referer" = "https://www.nseindia.com" }
Invoke-WebRequest -Uri "https://www.nseindia.com" -SessionVariable nse -Headers $headers | Out-Null
$chain = Invoke-RestMethod -Uri "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" `
  -Headers $headers -WebSession $nse
$strikes = $chain.records.data | Select-Object strikePrice,
  @{N='CE_OI';E={$_.CE.openInterest}},
  @{N='PE_OI';E={$_.PE.openInterest}} |
  Where-Object { $_.strikePrice }

# Max pain = strike where total dollar loss for option holders is maximum
$maxPainStrike = $strikes | ForEach-Object {
  $s = $_.strikePrice
  $pain = ($strikes | ForEach-Object {
    $ceVal = [math]::Max(0, $s - $_.strikePrice) * $_.CE_OI
    $peVal = [math]::Max(0, $_.strikePrice - $s) * $_.PE_OI
    $ceVal + $peVal
  } | Measure-Object -Sum).Sum
  [PSCustomObject]@{ Strike = $s; TotalPain = $pain }
} | Sort-Object TotalPain | Select-Object -First 1
Write-Host "Max Pain Strike: $($maxPainStrike.Strike)"
```

### Top CE OI strikes (resistance levels)
```powershell
$chain.records.data |
  Where-Object { $_.CE.openInterest -gt 0 } |
  Sort-Object { $_.CE.openInterest } -Descending |
  Select-Object -First 5 strikePrice, @{N='CE_OI';E={$_.CE.openInterest}}, @{N='CE_OI_Change';E={$_.CE.changeinOpenInterest}}
```

### Top PE OI strikes (support levels)
```powershell
$chain.records.data |
  Where-Object { $_.PE.openInterest -gt 0 } |
  Sort-Object { $_.PE.openInterest } -Descending |
  Select-Object -First 5 strikePrice, @{N='PE_OI';E={$_.PE.openInterest}}, @{N='PE_OI_Change';E={$_.PE.changeinOpenInterest}}
```

## Examples

**"What is the current Nifty PCR?"**
→ Fetch chain, sum all CE and PE OI, divide PE by CE — PCR > 1.2 is bullish, < 0.8 is bearish.

**"Where is max pain for this week's expiry?"**
→ Run the max pain calculation across all strikes and return the strike with minimum total option holder loss.

**"Show me the top 5 CE and PE OI strikes for BankNifty"**
→ Change URL to `symbol=BANKNIFTY` and sort by OI descending.

## Cautions

- Options chain data is updated every few minutes during market hours — not tick-level real-time
- PCR and max pain are sentiment indicators, not trading signals — use alongside price action
- Always initialize the NSE session cookie before API calls or you will get 401/403 errors
- Near expiry, IV can spike significantly — raw IV numbers are comparable only within the same expiry
