Algorithmic Trading & Indicators
Intermediate
Calculate Nifty & BankNifty Weekly Expiry Max Pain Strike from Option Chain in Python
Compute the exact Option Max Pain strike price in Python Pandas where option writers experience minimum aggregate intrinsic payout loss at weekly expiry.
#pandas#numpy
Problem Statement
Institutional option sellers dominate weekly index expiries. The Max Pain strike is the exact index level where the combined intrinsic value of all outstanding Call and Put Open Interest (OI) is minimized.
Formula / Core Logic
For candidate expiry price S_k:
Call_Pain(S_k) = Sum [ max(0, S_k - K_i) * Call_OI_i ]
Put_Pain(S_k) = Sum [ max(0, K_i - S_k) * Put_OI_i ]
Max_Pain_Strike = argmin(Call_Pain + Put_Pain)
Installation
pip install pandas numpy
nifty-option-chain-max-pain-strike-calculator-python.py
import pandas as pd
import numpy as np
def calculate_max_pain(chain_df):
# Expected cols: Strike, CE_OI, PE_OI
strikes = chain_df['Strike'].values
ce_oi = chain_df['CE_OI'].values
pe_oi = chain_df['PE_OI'].values
total_payout = []
for expiry_candidate in strikes:
call_loss = np.sum(np.maximum(0.0, expiry_candidate - strikes) * ce_oi)
put_loss = np.sum(np.maximum(0.0, strikes - expiry_candidate) * pe_oi)
total_payout.append(call_loss + put_loss)
out = chain_df.copy()
out['Total_Writer_Pain'] = total_payout
max_pain_strike = out.loc[out['Total_Writer_Pain'].idxmin(), 'Strike']
return int(max_pain_strike), out
Get the Complete 100+ Python Quant & Automation Bundle
Instant lifetime access to all production-ready scripts, valuation models, and trading bots ($19).
Buy Full Bundle on Gumroad ($19) →Frequently Asked Questions
Q: Is Max Pain more reliable on expiry day Afternoon sessions?
Yes, as extrinsic time value (Theta) decays toward zero after 1:30 PM on expiry day, spot prices frequently gravitate toward the highest concentration of short strikes.