BankNifty options

What does this predict?

Nothing about which way BankNifty will move. Every hypothesis in this study that tried to predict direction was tested and none survived. That is the single clearest result here, and it is a real finding rather than a gap in the work.

The direction-predicting ideas, and how they did

These are the ideas most often repeated about BankNifty options — that a crowded put-call ratio marks a turn, that price is pulled toward "max pain", that a surge in open interest signals what comes next. Each was written down with its expected direction before being tested against fifteen years of data:

forward_drifts_toward_max_painRejected
forward_drifts_up_to_max_painRejected
oi_surge_precedes_iv_riseExcluded
oi_unwind_precedes_iv_fallExcluded
pcr_oi_high_precedes_riseRejected
pcr_oi_low_precedes_fallRejected
pcr_volume_high_precedes_riseRejected

0 of 7 survived. Rejected means the data showed no effect. Not tested means the idea could not be tested honestly with this machinery — usually because the way it selects events makes it find something even in random data.

What did survive, and what it is worth

5 patterns held up, and all 5 describe the same thing: an at-the-money straddle loses value as expiry approaches. In the final sessions before expiry that loss is large and extremely consistent — it went the predicted way in essentially every out-of-sample instance.

But this is not an edge. It is the square-root-of-time decay that option pricing theory predicts, and the measured numbers land within one to two percentage points of the textbook values. Everyone in the market can see it, it is already in the price, and it says nothing about whether the index goes up or down. Its value is as a planning fact — how fast premium erodes near expiry — not as a signal.

So how should this be used?

Nothing here is a forecast or a recommendation, and a percentage change in an option's price is not a return on the money it would cost to hold it. This describes what already happened; the future is not obliged to resemble it.

The honest summary

Twenty-seven ideas tested against fifteen years of BankNifty options. 5 confirmed, 1 unproven, 10 showed no evidence, 11 could not be tested honestly. What survived was arithmetic that was already known. No tradeable prediction of direction or volatility came out of this study — and knowing that, with the evidence behind it, is worth more than a list of patterns that would not have held.

How much of this is the clock?

Implied volatility is not something the market prints. It is worked out from an option's price using an assumed number of days left. This study originally counted calendar days; the market trades on business days. Wherever those two disagree, a pattern can appear that is entirely an artefact of the arithmetic.

Every result was therefore recomputed on a trading-day clock. All 27 are shown below, most-changed first, with both answers. Where the two columns disagree, treat neither as settled. Where they agree, that agreement is itself the evidence that the result does not depend on the convention.

patterncounting calendar dayscounting trading days
monthly_final_two_daysConfirmed -27.1% (55 events)
vs baseline -0.0% → excess -27.1%
Confirmed -59.2% (115 events)
vs baseline -0.0% → excess -59.2%
weekly_final_two_daysConfirmed -28.3% (176 events)
vs baseline -0.0% → excess -28.3%
Confirmed -58.8% (349 events)
vs baseline -0.0% → excess -58.8%
decay_final_three_daysConfirmed -41.4% (166 events)
vs baseline +0.0% → excess -41.4%
Confirmed -70.4% (383 events)
vs baseline +0.0% → excess -70.4%
march_quarter_end_iv_higherRejected +14.2% (131 events)
vs baseline +2.3% → excess +12.0%
Rejected +5.2% (133 events)
vs baseline -4.0% → excess +9.2%
budget_day_iv_crushRejected -7.9% (7 events)
vs baseline +3.4% → excess -11.3%
Rejected -15.6% (7 events)
vs baseline -3.9% → excess -11.7%
january_iv_higherCandidate +5.1% (147 events)
vs baseline +3.3% → excess +1.8%
Candidate -1.3% (147 events)
vs baseline -3.9% → excess +2.6%
vrp_positive_on_averageConfirmed +3.1% (1608 events)
vs baseline +0.0% → excess +3.1%
Rejected -3.1% (1611 events)
vs baseline +0.0% → excess -3.1%
friday_iv_lowerRejected +5.6% (318 events)
vs baseline -0.9% → excess +6.5%
Rejected +0.9% (318 events)
vs baseline +0.1% → excess +0.7%
skew_inverted_precedes_iv_riseRejected +2.8% (118 events)
vs baseline +2.9% → excess -0.1%
Candidate -1.7% (119 events)
vs baseline -3.2% → excess +1.6%
monday_iv_higherRejected -1.7% (325 events)
vs baseline +0.8% → excess -2.5%
Rejected -0.5% (325 events)
vs baseline +0.5% → excess -1.0%
decay_mid_cycleConfirmed -10.5% (1242 events)
vs baseline -0.0% → excess -10.5%
Confirmed -10.5% (1242 events)
vs baseline -0.0% → excess -10.5%
forward_drifts_toward_max_painRejected +0.5% (53 events)
vs baseline +0.2% → excess +0.3%
Rejected +0.5% (53 events)
vs baseline +0.2% → excess +0.3%
forward_drifts_up_to_max_painRejected +0.6% (53 events)
vs baseline +0.2% → excess +0.4%
Rejected +0.6% (53 events)
vs baseline +0.2% → excess +0.4%
pcr_oi_high_precedes_riseRejected +0.4% (160 events)
vs baseline +0.1% → excess +0.3%
Rejected +0.4% (160 events)
vs baseline +0.1% → excess +0.3%
pcr_oi_low_precedes_fallRejected -0.4% (125 events)
vs baseline +0.2% → excess -0.5%
Rejected -0.4% (125 events)
vs baseline +0.2% → excess -0.5%
pcr_volume_high_precedes_riseRejected -0.2% (181 events)
vs baseline +0.2% → excess -0.3%
Rejected -0.2% (181 events)
vs baseline +0.2% → excess -0.3%
iv_reverts_from_high_rankExcluded not measuredExcluded not measured
iv_reverts_from_low_rankExcluded not measuredExcluded not measured
iv_rises_into_expiry_weekExcluded not measuredRejected -3.7% (779 events)
vs baseline -0.0% → excess -3.7%
oi_surge_precedes_iv_riseExcluded not measuredExcluded not measured
oi_unwind_precedes_iv_fallExcluded not measuredExcluded not measured
skew_extreme_revertsExcluded not measuredExcluded not measured
straddle_cheap_after_low_ivExcluded not measuredExcluded not measured
term_inversion_precedes_iv_fallExcluded not measuredExcluded not measured
vrp_extreme_revertsExcluded not measuredExcluded not measured
vrp_negative_precedes_iv_riseExcluded not measuredExcluded not measured
wednesday_iv_lowerExcluded not measuredConfirmed -0.4% (324 events)
vs baseline +0.5% → excess -1.0%

4 pattern(s) changed verdict outright when only the clock changed. That is the clearest available measure of how much a convention — not the market — was driving the original answer.

The trading-day column has a known, unresolved defect and must not be read as a second set of findings. Under that clock, expiry-day sessions enter the comparison pool for the first time. Those sessions collapse by around 87% on average, and although they are only about 3.5% of all observations they drag the "typical day" reference from roughly +0.3% to −2.8%. Every pattern measured against that reference then looks better than it is.

Scoring all five weekdays with the same shape makes it plain: Monday +2.3%, Tuesday +3.2%, Wednesday +2.3%, Thursday +3.9%, Friday +3.6% — all against the same contaminated reference, all significant. Every weekday "confirms", so none of them does. monday_iv_higher shows as confirmed in the column below purely because it was the weekday that happened to be registered predicting a rise; its own raw change is negative and it goes the predicted way on 44% of occasions. It is not a finding, and it is shown rather than removed so the mechanism stays visible.

This affects every implied-volatility pattern in the trading-day column, not just that one. The straddle-decay family is unaffected — it measures raw prices and never touches the reference. Fixing it properly means drawing the comparison from the sessions a pattern could have selected and did not, which is real work and has not been done here.