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_pain | Rejected |
forward_drifts_up_to_max_pain | Rejected |
oi_surge_precedes_iv_rise | Excluded |
oi_unwind_precedes_iv_fall | Excluded |
pcr_oi_high_precedes_rise | Rejected |
pcr_oi_low_precedes_fall | Rejected |
pcr_volume_high_precedes_rise | Rejected |
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?
- As a filter on claims. When someone says a PCR extreme or a max-pain level predicts the next move, this study is fifteen years of evidence against it.
- As a decay reference. The measured erosion near expiry is stable across all three market-structure eras, so it is dependable as a description of how premium behaves with time.
- As a starting point, not an answer. 11 ideas remain untested because testing them honestly needs machinery this project does not have. They are open questions, not dead ends.
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.
| pattern | counting calendar days | counting trading days |
|---|---|---|
monthly_final_two_days | Confirmed -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_days | Confirmed -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_days | Confirmed -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_higher | Rejected +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_crush | Rejected -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_higher | Candidate +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_average | Confirmed +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_lower | Rejected +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_rise | Rejected +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_higher | Rejected -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_cycle | Confirmed -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_pain | Rejected +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_pain | Rejected +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_rise | Rejected +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_fall | Rejected -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_rise | Rejected -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_rank | Excluded not measured | Excluded not measured |
iv_reverts_from_low_rank | Excluded not measured | Excluded not measured |
iv_rises_into_expiry_week | Excluded not measured | Rejected -3.7% (779 events) vs baseline -0.0% → excess -3.7% |
oi_surge_precedes_iv_rise | Excluded not measured | Excluded not measured |
oi_unwind_precedes_iv_fall | Excluded not measured | Excluded not measured |
skew_extreme_reverts | Excluded not measured | Excluded not measured |
straddle_cheap_after_low_iv | Excluded not measured | Excluded not measured |
term_inversion_precedes_iv_fall | Excluded not measured | Excluded not measured |
vrp_extreme_reverts | Excluded not measured | Excluded not measured |
vrp_negative_precedes_iv_rise | Excluded not measured | Excluded not measured |
wednesday_iv_lower | Excluded not measured | Confirmed -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.