Does Nifty's last 30 minutes (15:00–15:30) predict the next day? Full-history backtest for an option buyer

Built 2026-10-21 16:59 IST. Research only, not advice. Data: Nifty 50 1-min spot (Upstox) 2022-01-03 → 2026-10-21; Nifty weekly options 1-min (Upstox, S3 analyticsdata123) Aug 2024 → Sep 2026.

Plain-language summary

Verdict: FAIL — not a tradeable option-buyer rule after costs. The last 30 minutes (15:00–15:30) of Nifty do not reliably predict the next day's gap or first hour.

Data note: frozen closing window (added 2026-10-21) and corrected numbers

What happened: NSE's Closing Auction Session (CAS) went live in the cash market on 2026-08-03. For F&O stocks, continuous trading ends at 15:15, the auction runs 15:15–15:30 (random close 15:28–15:30), and the official close comes from the auction. The Nifty/Sensex spot value therefore stops moving at 15:15. Upstox (historical and live) fills 15:15–15:27/15:28 with flat O=H=L=C bars, then one bar jumps to the closing print. Those flat bars are not trades. Index options and futures keep trading until 15:40, and their bars are real: on 14 frozen days checked, near-ATM option bars from 15:15 to 15:29 had 0% flat repeats and normal volume.

Scope (Upstox HISTORICAL candles only): Nifty, 54 of 54 sessions from 2026-08-03 to 2026-10-19 (0 before Aug 2026); the last real minute is 15:14 on every one, and the closing print equals the Upstox daily close on all 54. Sensex: 53 of 53 post-Aug sessions (2 print/daily mismatches). Also, Nifty 2022-03-07 09:37–10:21 had flat-filled morning bars, now marked missing. The earlier "26 days" count missed the variant where the jump lands in the 15:28 bar. 2026-10-21 (today) is pending: Upstox has not published historical candles for it yet, intraday-feed bars are not used, and it will be added when historical data is available.

Rule applied (helper /workspace/research/common/clean_close_window.py): frozen and closing-print bars are set MISSING, never filled. last30 = last REAL close / 14:59 close (15:29 on normal days, 15:14 on frozen days). A separate variant runs to the Upstox daily (official) close. Any day missing a needed bar is excluded. For 15:20/15:25/15:28 option entries, the signal and ATM strike use the last real index bar at or before entry (15:14 on frozen days). Option entry bars are checked for flat-fill (none found). Results are also shown with all frozen days excluded.

Verdict unchanged: FAIL. On the cleaned data (n=1165 days), last30 still has no link to the next-day gap or first hour against the last real close (ρ=+0.002, p=0.94). Today's bucket (>+0.5%): n=18, gap up 78%, 10:15 up 61%, 09:20→10:15 up 44%. Today itself is pending historical data.

Reference-price warning: against the official close, last30 suddenly correlates with the gap (ρ=+0.112, p<0.001). That is mechanical, not an edge. Before CAS the official close was a VWAP of the last 30 minutes, so after a late rally the last traded price sits above the official close and the next open "gaps up" relative to it. Nobody can trade at the official close, and an option buyer's entry price already reflects the last traded price. From 09:20 the two references give the same answer.

Bucket table: previous run vs cleaned data

bucketn oldn cleangap up % oldgap up % cleanp gap clean10:15 up % old10:15 up % clean09:20→10:15 up % old09:20→10:15 up % cleangap up % vs OFFICIAL closep (official ref)
<-0.5121258.358.31.00050.050.041.741.758.31.000
-0.5..-0.3525173.172.50.08563.564.744.245.166.70.474
-0.3..-0.123122458.458.50.68256.356.249.450.054.90.075
-0.1..0.156759359.359.40.76952.952.851.051.359.50.501
0.1..0.324122759.861.20.73556.057.353.152.067.40.048
0.3..0.5444047.747.50.11054.555.065.965.062.50.873
>0.5201875.077.80.15255.061.140.044.483.30.056

Correlation of last30 with the next day

next-day measureρ oldρ clean (vs last real close)perm p cleanρ vs OFFICIAL closeperm p official
n_gap-0.0110.0020.9380.1120.000
n_0930-0.038-0.0220.4760.0710.018
n_0945-0.035-0.0240.4190.0650.028
n_1015-0.025-0.0170.5650.0650.029
n_1115-0.014-0.0050.8560.0660.025
n_close0.0210.0250.4200.0850.004
n_from0920_09450.0360.0240.4160.0240.416
n_from0920_10150.0620.0490.0850.0490.085
n_from0920_11150.0470.0400.1760.0400.176
n_from0920_close0.0840.0760.0090.0760.009

Option-buyer P&L (next-day 09:16/09:20 entries)

runvariantspositivepos_n20beat95best_pct
previous960120094.2
clean960337296.2
modetrades oldwin_pct oldavg_pts oldtotal_pts oldpctile_vs_random oldtrades cleanwin_pct cleanavg_pts cleantotal_pts cleanpctile_vs_random clean
momentum4228.6-17.7-742.84.93630.6-20.0-719.02.9
fade4245.2-1.1-45.591.43647.20.14.893.0
fade_drop_only(CE)2343.5-9.1-209.258.22245.5-7.9-173.163.6
momo_up_only(CE)1910.5-25.5-483.63.01414.3-31.4-439.91.3
momo_drop_only(PE)2343.5-11.3-259.229.62240.9-12.7-279.122.6

Clean CSVs: clean_buckets_last30.csv, clean_officialref_buckets_last30.csv, clean_option_pnl_summary.csv, nifty_frozen_days.csv, sensex_frozen_days.csv.

Day-before-expiry check on cleaned data: gap follows last30 direction (pre-expiry vs other days)

hn_pre old%up_pre oldn_other old%up_other oldp oldn_pre clean%up_pre cleann_other clean%up_other cleanp clean
n_gap127.039.4473.051.80.016121.039.7451.052.30.014
n_1015127.044.1473.050.70.195121.044.6451.051.20.220
n_from0920_1015127.055.9473.052.20.484121.056.2451.051.20.357

Same conclusion: a nominal reversal at the gap before expiry that fails multiple-testing correction and is gone by 09:20.

1. Bucket table: all 1167 days (last30 = close 15:29 / close 14:59 − 1)

"up %" = % of next days where the price at that time is above the signal day's close (the 09:15 open for "gap"). "same-dir" = moved in the same direction as last30. p = two-sided binomial test vs the all-days base rate (7 buckets × several horizons are tested, so p≈0.05 is expected by chance a few times). "09:20→10:15" is what an option buyer entering at 09:20 actually gets.

last30 bucket %ngap up %gap same-dir %gap med %09:30 up %09:45 up %10:15 up %11:15 up %close up %10:15 med %close med %09:20→10:15 up %p gap (binom)p 10:15p 09:20→10:15
<-0.51258.3341.670.2450.0050.0050.0041.6750.00-0.040.0741.671.000.780.57
-0.5..-0.35273.0826.920.2371.1567.3163.4661.5448.080.23-0.0544.230.050.210.34
-0.3..-0.123158.4441.560.0853.2553.2556.2853.6850.220.060.0449.350.740.690.65
-0.1..0.156759.2651.680.0956.7954.6752.9153.7951.150.030.0250.970.860.380.97
0.1..0.324159.7559.750.0952.7055.6056.0254.3649.790.06-0.0153.111.000.750.56
0.3..0.54447.7347.73-0.0250.0054.5554.5547.7354.550.060.0965.910.121.000.05
>0.52075.0075.000.1765.0070.0055.0060.0070.000.130.1640.000.181.000.38
ALL (base rate)116759.640.0955.7055.3654.7653.9850.990.050.0251.07

Variant excluding the 15:29 closing-print bar (close 15:28 / 14:59)

last30 bucket %ngap up %gap same-dir %gap med %09:30 up %09:45 up %10:15 up %11:15 up %close up %10:15 med %close med %09:20→10:15 up %p gap (binom)p 10:15p 09:20→10:15
<-0.51361.5438.460.1953.8553.8553.8546.1553.850.040.1846.151.001.000.79
-0.5..-0.35574.5525.450.2172.7369.0965.4565.4552.730.240.1045.450.030.140.42
-0.3..-0.123757.3842.620.0753.5953.5957.3854.0150.210.060.0451.050.510.431.00
-0.1..0.157458.8952.960.0955.0552.7951.3952.2648.780.02-0.0249.650.730.110.50
0.1..0.322959.3959.390.1153.2857.6455.9054.5952.400.060.0455.020.950.740.23
0.3..0.53554.2954.290.0360.0060.0062.8654.2962.860.090.2160.000.610.400.31
>0.52475.0075.000.1670.8375.0062.5066.6775.000.210.2150.000.150.541.00
ALL (base rate)116759.640.0955.7055.3654.7653.9850.990.050.0251.07

15:29 bar effect by year

yearnabs_jump1529_med_pctabs_jump1529_p90_pctbucket_changed_pctcorr_l30_l30x
20222460.020.0611.380.99
20232450.010.049.390.99
20242390.020.048.790.98
20252430.020.0410.290.98
20261940.020.0915.460.92

Deciles of last30

bucketnlast30_med%n_gap_%upn_gap_med%n_0945_%upn_1015_%upn_close_%upn_from0920_1015_%upn_gap_p_binomn_1015_p_binom
D1117-0.3265.810.1864.1063.2555.5647.860.190.08
D2117-0.1759.830.0952.9958.9747.0147.011.000.40
D3116-0.1058.620.0855.1753.4551.7250.860.850.78
D4117-0.0555.560.0654.7053.8547.8649.570.400.85
D5117-0.0156.410.0852.1451.2850.4352.140.510.46
D61160.0360.340.0950.0050.8650.0050.000.920.40
D71170.0658.120.0852.1447.0149.5752.990.780.10
D81160.1164.660.1556.0355.1750.8647.410.301.00
D91170.1759.830.1258.1257.2654.7054.701.000.64
D101170.3157.260.0558.1256.4152.1458.120.640.78

Correlation and permutation tests (2,000 shuffles)

hspearmanp_permspearman_ex1529
next gap-0.010.720.01
next 0930-0.040.19-0.02
next 0945-0.030.23-0.02
next 1015-0.030.37-0.01
next 1115-0.010.630.00
next close0.020.470.03
09:20→09450.040.220.03
09:20→10150.060.030.05
09:20→11150.050.110.04
09:20→close0.080.000.07

Regression: next move ~ last30 + day trend to 14:59

hb_last30t_last30b_pretrendt_pretrend
n_gap-0.03-0.410.052.61
n_1015-0.09-0.920.020.99
n_close0.100.82-0.03-1.14

Shuffle test per bucket (4,000 random same-size day sets)

buckethn%upbase%upp_shuffle
<-0.5n_gap1258.3359.641.00
<-0.5n_09451250.0055.360.76
<-0.5n_10151250.0054.760.78
<-0.5n_11151241.6753.980.54
<-0.5n_close1250.0050.991.00
<-0.5n_from0920_10151241.6751.070.57
-0.5..-0.3n_gap5273.0859.640.06
-0.5..-0.3n_09455267.3155.360.09
-0.5..-0.3n_10155263.4654.760.21
-0.5..-0.3n_11155261.5453.980.32
-0.5..-0.3n_close5248.0850.990.67
-0.5..-0.3n_from0920_10155244.2351.070.32
-0.3..-0.1n_gap23158.4459.640.70
-0.3..-0.1n_094523153.2555.360.52
-0.3..-0.1n_101523156.2854.760.61
-0.3..-0.1n_111523153.6853.980.94
-0.3..-0.1n_close23150.2250.990.83
-0.3..-0.1n_from0920_101523149.3551.070.61
-0.1..0.1n_gap56759.2659.640.80
-0.1..0.1n_094556754.6755.360.69
-0.1..0.1n_101556752.9154.760.24
-0.1..0.1n_111556753.7953.980.91
-0.1..0.1n_close56751.1550.990.95
-0.1..0.1n_from0920_101556750.9751.070.95
0.1..0.3n_gap24159.7559.641.00
0.1..0.3n_094524155.6055.360.94
0.1..0.3n_101524156.0254.760.66
0.1..0.3n_111524154.3653.980.94
0.1..0.3n_close24149.7950.990.73
0.1..0.3n_from0920_101524153.1151.070.52
0.3..0.5n_gap4447.7359.640.12
0.3..0.5n_09454454.5555.361.00
0.3..0.5n_10154454.5554.761.00
0.3..0.5n_11154447.7353.980.45
0.3..0.5n_close4454.5550.990.65
0.3..0.5n_from0920_10154465.9151.070.05
>0.5n_gap2075.0059.640.17
>0.5n_09452070.0055.360.25
>0.5n_10152055.0054.761.00
>0.5n_11152060.0053.980.66
>0.5n_close2070.0050.990.11
>0.5n_from0920_10152040.0051.070.36

Conditional: day direction and reversal vs continuation

"continuation" = last30 has the same sign as the move from the previous close to 14:59; "reversal into close" = opposite sign.

last30condnn_gap_%upn_gap_pn_0945_%upn_1015_%upn_1015_pn_close_%upn_from0920_1015_%up
big down <-0.3down day5269.230.2063.4659.620.5850.0044.23
big down <-0.3up day1275.000.3866.6766.670.5641.6741.67
mild downdown day14954.360.2148.3251.680.4647.6549.66
mild downup day8265.850.2662.2064.630.0854.8848.78
flat ±0.1down day25349.800.0045.8545.060.0048.6247.43
flat ±0.1up day31466.880.0161.7859.240.1153.1853.82
mild updown day9554.740.3551.5850.530.4143.1650.53
mild upup day14663.010.4558.2259.590.2554.1154.79
big up >0.3down day2356.520.8356.5247.830.5460.8760.87
big up >0.3up day4156.100.6460.9858.540.6458.5456.10
big down <-0.3continuation3876.320.0568.4268.420.1050.0042.11
big down <-0.3reversal into close2661.541.0057.6950.000.7046.1546.15
mild downcontinuation11852.540.1344.9250.000.3147.4649.15
mild downreversal into close11364.600.2961.9562.830.0953.1049.56
flat ±0.1continuation28860.420.8155.2155.210.9151.7453.12
flat ±0.1reversal into close27958.060.6354.1250.540.1750.5448.75
mild upcontinuation13160.310.9356.4958.020.4854.2053.44
mild upreversal into close11059.090.9254.5553.640.8544.5552.73
big up >0.3continuation2958.621.0068.9765.520.2751.7258.62
big up >0.3reversal into close3554.290.6151.4345.710.3165.7157.14

2. Stability

By year

yearlast30nn_gap_%upn_gap_med%n_1015_%upn_close_%upn_from0920_1015_%upspearman_gapspearman_1015
2022big down <-0.32979.310.3662.0751.7231.03
2022big up >0.32147.62-0.0142.8638.1047.62
2023big down <-0.3862.500.1575.0037.5075.00
2023big up >0.31464.290.1164.2985.7185.71
2024big down <-0.3666.670.0750.0050.0033.33
2024big up >0.31266.670.0566.6775.0075.00
2025big down <-0.3757.140.2157.1428.5771.43
2025big up >0.3742.86-0.0157.1457.1428.57
2026big down <-0.31464.290.1957.1457.1442.86
2026big up >0.31060.000.0550.0050.0040.00
2022ALL (base)24659.760.1252.4448.3750.410.020.06
2023ALL (base)24567.760.1361.2255.9253.47-0.030.00
2024ALL (base)23962.340.1254.8154.8151.88-0.02-0.04
2025ALL (base)24357.200.0553.9148.9750.62-0.07-0.09
2026ALL (base)19448.97-0.0150.5245.8848.45-0.08-0.12

Train 2022–2023 vs test 2024–2026

splitlast30nn_gap_%upn_gap_basen_gap_pn_1015_%upn_1015_basen_1015_pn_from0920_1015_%upn_from0920_1015_basen_from0920_1015_p
train 2022-2023big down <-0.33775.6863.750.1764.8656.820.4140.5451.930.19
train 2022-2023mild down9859.1863.750.3555.1056.820.7650.0051.930.76
train 2022-2023flat ±0.120663.5963.751.0052.9156.820.2650.0051.930.58
train 2022-2023mild up11566.9663.750.5064.3556.820.1157.3951.930.26
train 2022-2023big up >0.33554.2963.750.2951.4356.820.6162.8651.930.24
train 2022-2023ALL49163.7563.751.0056.8256.821.0051.9351.931.00
test 2024-2026big down <-0.32762.9656.660.5655.5653.250.8548.1550.440.85
test 2024-2026mild down13357.8956.660.7957.1453.250.3948.8750.440.73
test 2024-2026flat ±0.136156.7956.661.0052.9153.250.9251.5250.440.71
test 2024-2026mild up12653.1756.660.4748.4153.250.2949.2150.440.79
test 2024-2026big up >0.32958.6256.660.8558.6253.250.5851.7250.441.00
test 2024-2026ALL67656.6656.661.0053.2553.251.0050.4450.441.00

3. Option-buyer P&L (after costs)

Next day: buy the ATM (nearest 50) strike of the nearest weekly expiry (expiry day included; a variant skipping 0-DTE is in the CSV) at the 09:20 (or 09:16) 1-min close + 3 pts. Exit at the 09:45, 10:15 or 11:15 close − 3 pts, or at a 20-pt premium stop (fill − 20, or the bar open if it gaps through) − 3 pts. Costs: ₹40 brokerage per round trip, STT 0.1% on the sell leg (0.0625% before Oct 2024), exchange fees 0.035%, SEBI fee, stamp duty 0.003%, 18% GST, converted to points per unit using the lot size of the period (25/75/65). Points are per unit (× lot size for ₹). "pctile_vs_random" = where the rule's total ranks among 2,000 random sets of the same number of trades drawn from every-day entries.

Headline: X = 0.3%, entry 09:20, nearest expiry

modeexitsltradeswin_pctavg_ptsgross_avg (before 6 pt slip + costs)total_ptsmax_dd_ptsrandom_mean_totalpctile_vs_randomn_2024tot_2024n_2025tot_2025n_2026tot_2026
momentum09:45none4233.33-12.42-5.37-521.56562.38-316.3212.605.00-24.9414.00-255.6223.00-241.00
momentum09:4520.004226.19-10.99-3.94-461.79497.48-336.5119.205.00-82.3114.00-146.2223.00-233.26
momentum10:15none4228.57-17.69-10.64-742.79810.86-360.684.905.00-26.4414.00-458.3323.00-258.02
momentum10:1520.004219.05-12.69-5.64-533.18550.24-363.9118.155.00-79.2114.00-251.6723.00-202.30
momentum11:15none4230.95-11.42-4.37-479.74514.79-394.7538.955.00-88.0214.00-113.1723.00-278.54
momentum11:1520.004211.90-16.42-9.37-689.57715.77-418.967.805.00-100.5414.00-277.6323.00-311.40
fade09:45none4230.95-6.021.02-252.91252.91-320.9965.955.00-129.6214.0013.4223.00-136.71
fade09:4520.004223.81-8.20-1.16-344.48344.48-335.3251.055.00-95.0114.00-36.7123.00-212.76
fade10:15none4245.24-1.085.97-45.50223.03-365.7691.405.00-172.5614.00272.0523.00-144.99
fade10:1520.004230.95-3.173.88-133.18177.05-355.7788.155.00-116.5914.00109.7323.00-126.32
fade11:15none4233.33-13.12-6.08-550.84550.84-389.6929.405.00-202.4214.00-184.5623.00-163.87
fade11:1520.004219.05-11.17-4.13-469.00469.00-419.6843.355.00-111.1014.00-32.5223.00-325.39
fade_drop_only(CE)09:45none2330.43-8.22-1.21-188.97213.37-198.2154.452.00-88.837.0047.4414.00-147.58
fade_drop_only(CE)09:4520.002317.39-12.08-5.08-277.85301.66-202.9025.652.00-48.847.00-5.3814.00-223.63
fade_drop_only(CE)10:15none2343.48-9.10-2.09-209.19219.51-239.0058.252.00-135.517.00131.0214.00-204.70
fade_drop_only(CE)10:1520.002321.74-8.54-1.54-196.41220.12-232.2664.102.00-48.847.0035.3114.00-182.88
fade_drop_only(CE)11:15none2330.43-21.65-14.67-497.99498.99-230.8510.302.00-130.177.00-222.7414.00-145.09
fade_drop_only(CE)11:1520.00238.70-17.87-10.88-411.01411.01-253.2813.502.00-48.847.00-71.9414.00-290.23
momo_up_only(CE)09:45none1926.32-13.74-6.62-261.15281.04-163.3421.003.00-33.427.00-108.899.00-118.85
momo_up_only(CE)09:4520.001926.32-9.96-2.82-189.20209.09-167.7042.853.00-33.427.00-70.249.00-85.54
momo_up_only(CE)10:15none1910.53-25.45-18.34-483.58483.58-193.282.953.00-70.217.00-230.779.00-182.61
momo_up_only(CE)10:1520.001910.53-14.02-6.89-266.29266.29-183.0823.903.00-30.327.00-114.789.00-121.19
momo_up_only(CE)11:15none1921.05-19.63-12.51-373.05373.05-191.5416.203.00-77.167.00-144.149.00-151.75
momo_up_only(CE)11:1520.001915.79-15.84-8.72-301.00301.00-217.0528.153.00-51.647.00-110.549.00-138.82
momo_drop_only(PE)09:45none2339.13-11.32-4.33-260.41342.60-154.9421.002.008.477.00-146.7314.00-122.15
momo_drop_only(PE)09:4520.002326.09-11.85-4.86-272.59307.81-165.2515.402.00-48.907.00-75.9714.00-147.72
momo_drop_only(PE)10:15none2343.48-11.27-4.28-259.20387.16-163.9029.652.0043.777.00-227.5614.00-75.42
momo_drop_only(PE)10:1520.002326.09-11.60-4.62-266.89343.71-175.7927.452.00-48.907.00-136.8914.00-81.11
momo_drop_only(PE)11:15none2339.13-4.642.36-106.69249.90-209.9769.202.00-10.867.0030.9714.00-126.79
momo_drop_only(PE)11:1520.00238.70-16.89-9.91-388.57435.86-199.7810.952.00-48.907.00-167.0914.00-172.58

X = 0.5% (today's bucket), entry 09:20, no SL

modeexittradeswin_pctavg_ptstotal_ptspctile_vs_random
momentum09:451020.00-13.85-138.4624.60
momentum10:151030.00-19.58-195.7816.40
momentum11:151030.00-14.71-147.1036.85
fade09:451020.00-12.37-123.6630.55
fade10:151030.00-10.79-107.8843.45
fade11:151020.00-22.91-229.1018.10
fade_drop_only(CE)09:4530.00-28.31-84.9410.50
fade_drop_only(CE)10:1530.00-56.77-170.320.85
fade_drop_only(CE)11:1530.00-60.87-182.601.30
momo_up_only(CE)09:4570.00-18.42-128.9117.85
momo_up_only(CE)10:15714.29-33.47-234.314.00
momo_up_only(CE)11:15714.29-23.32-163.2122.95
momo_drop_only(PE)09:45366.67-3.18-9.5561.65
momo_drop_only(PE)10:15366.6712.8438.5382.50
momo_drop_only(PE)11:15366.675.3716.1172.35

Random-day baseline: buy every day at 09:20

modeexitsltradeswin_pctavg_ptstotal_ptsmax_dd_pts
buy CE09:45none50732.54-8.64-4379.714379.71
buy PE09:45none50436.51-6.68-3364.253473.73
buy CE09:4520.0050727.22-8.77-4445.634445.63
buy PE09:4520.0050430.75-7.11-3581.943666.36
buy CE10:15none50732.15-10.17-5154.075157.37
buy PE10:15none50434.92-6.98-3519.883605.25
buy CE10:1520.0050722.09-9.80-4967.894967.89
buy PE10:1520.0050425.79-7.44-3750.953847.66
buy CE11:15none50736.49-10.01-5075.115075.11
buy PE11:15none50433.13-8.83-4449.654547.38
buy CE11:1520.0050718.74-11.05-5602.265602.26
buy PE11:1520.0050420.44-8.86-4463.704487.30

All 960 variants (signal last30 / ex-15:29, X ∈ 0.1/0.2/0.3/0.5%, momentum / fade / drop-only CE / up-only CE / drop-only PE, entry 09:16/09:20, 3 exits, SL on/off, 0-DTE on/off): 12 positive, all with ≤4 trades. Full grid: option_pnl_summary.csv.

Day before expiry (signal day = one trading day before the Nifty weekly expiry)

Expiry calendar: Thursday until Aug 2025 and Tuesday from Sep 2025, with holiday weeks moved to the previous trading day (2022-04-13, 2023-01-25, 2023-03-29, 2023-06-28, 2024-04-10, 2024-08-14, 2025-04-09, 2025-04-30, 2025-10-20, 2026-03-02, 2026-03-30, 2026-04-13, 2026-10-19, 2026-11-23). It matches every option-file expiry from 2024-10-03 to 2026-10-06 exactly (0 mismatches); earlier dates use the rule plus the actual trading days in the spot data. Files: expiry_calendar_2022_2026.csv, pre_expiry_days.csv. Tomorrow, Thu 2026-10-22, is NOT a pre-expiry day: the next expiry is Tue 2026-10-27, so the pre-expiry day is Mon 2026-10-26. The last one was Fri 2026-10-16, before the Dussehra-shifted Mon 2026-10-19 expiry.

Day-before-expiry verdict: FAIL as a rule. It slightly changes the gap pattern but gives no tradeable edge.

Bucket table: pre-expiry vs other days

"p_vs_all" = binomial test vs the all-days base; "p_vs_ownbase" = vs the base of that group (pre-expiry days or other days).

groupbucketnn_gap_%upn_gap_med%n_gap_p_vs_alln_gap_p_vs_ownbasen_0930_%upn_0945_%upn_1015_%upn_1015_p_vs_ownbasen_close_%upn_from0920_1015_%up
pre-expiry<-0.5425.0-1.20.3100.32725.025.050.01.00050.025.0
pre-expiry-0.5..-0.31384.60.30.0890.04992.384.684.60.02653.846.2
pre-expiry-0.3..-0.14470.50.20.1670.06747.754.559.10.45445.545.5
pre-expiry-0.1..0.112352.80.00.1410.52546.348.048.80.36643.147.2
pre-expiry0.1..0.35650.0-0.00.1730.42048.251.850.00.68944.657.1
pre-expiry0.3..0.5540.0-0.00.3990.66060.080.080.00.38080.060.0
pre-expiry>0.5540.0-0.30.3990.66040.060.040.00.67060.040.0
pre-expiryALL25056.00.10.2461.00049.252.453.21.00045.648.8
other days<-0.5875.00.30.4870.49362.562.550.01.00050.050.0
other days-0.5..-0.33969.20.20.2550.32764.161.556.41.00046.243.6
other days-0.3..-0.118755.60.00.2640.17854.552.955.60.94151.350.3
other days-0.1..0.144461.00.10.5620.88459.756.554.10.63453.452.0
other days0.1..0.318562.70.10.4110.59954.156.857.80.50651.451.9
other days0.3..0.53948.7-0.00.1920.14148.751.351.30.63351.366.7
other days>0.51586.70.20.0360.06073.373.360.00.79973.340.0
other daysALL91760.60.10.5451.00057.556.255.21.00052.551.7

Does the last30 effect differ? (Fisher exact and chi-square)

testbuckethn_pre%up_pren_other%up_otherp
Fisher: %up pre vs other, same bucketlast30 up >0.1n_gap66.048.5239.061.90.066
Fisher: %up pre vs other, same bucketlast30 up >0.1n_101566.051.5239.056.90.485
Fisher: %up pre vs other, same bucketlast30 up >0.1n_from0920_101566.056.1239.053.60.781
Fisher: %up pre vs other, same bucketlast30 down <-0.1n_gap61.070.5234.058.50.105
Fisher: %up pre vs other, same bucketlast30 down <-0.1n_101561.063.9234.055.60.249
Fisher: %up pre vs other, same bucketlast30 down <-0.1n_from0920_101561.044.3234.049.10.566
Fisher: same-direction rate (effect) pre vs otherlast30 up >0.1+last30 down <-0.1n_gap127.039.4473.051.80.016
Fisher: same-direction rate (effect) pre vs otherlast30 up >0.1+last30 down <-0.1n_1015127.044.1473.050.70.195
Fisher: same-direction rate (effect) pre vs otherlast30 up >0.1+last30 down <-0.1n_from0920_1015127.055.9473.052.20.484
Fisher: %up pre vs other, same bucketlast30 > +0.3n_gap10.040.054.059.30.312
Fisher: %up pre vs other, same bucketlast30 > +0.3n_101510.060.054.053.71.000
Fisher: %up pre vs other, same bucketlast30 > +0.3n_from0920_101510.050.054.059.30.731
Fisher: %up pre vs other, same bucketlast30 < -0.3n_gap17.070.647.070.21.000
Fisher: %up pre vs other, same bucketlast30 < -0.3n_101517.076.547.055.30.155
Fisher: %up pre vs other, same bucketlast30 < -0.3n_from0920_101517.041.247.044.71.000
Fisher: same-direction rate (effect) pre vs otherlast30 > +0.3+last30 < -0.3n_gap27.033.3101.045.50.282
Fisher: same-direction rate (effect) pre vs otherlast30 > +0.3+last30 < -0.3n_101527.037.0101.049.50.283
Fisher: same-direction rate (effect) pre vs otherlast30 > +0.3+last30 < -0.3n_from0920_101527.055.6101.057.41.000
chi-square: 7 buckets x up/down, pre-expiry days onlyalln_gap250.00.063
chi-square: 7 buckets x up/down, other days onlyalln_gap917.00.094
chi-square: 7 buckets x up/down, pre-expiry days onlyalln_1015250.00.187
chi-square: 7 buckets x up/down, other days onlyalln_1015917.00.974

Day direction (up/down day) on pre-expiry vs other days

groupdaynn_gap_%upn_gap_p_vs_ownbasen_0945_%upn_1015_%upn_close_%upn_from0920_1015_%up
pre-expirydown day12154.50.78449.648.838.843.0
pre-expiryup day12957.40.79155.057.451.954.3
other daysdown day45153.70.00349.449.250.650.3
other daysup day46667.40.00362.760.954.353.0

Base rates and by year

hbase_allbase_prebase_otherp_pre_vs_other
n_gap59.656.060.60.191
n_093055.749.257.50.022
n_094555.452.456.20.315
n_101554.853.255.20.616
n_close51.045.652.50.063
n_from0920_101551.148.851.70.433
dateprengap_upup1015med_gap
2022False19460.351.00.1
2022True5257.757.70.3
2023False19371.061.70.1
2023True5255.859.60.1
2024False18762.653.50.1
2024True5261.559.60.2
2025False19056.356.30.1
2025True5360.445.30.1
2026False15351.052.90.0
2026True4141.541.5-0.1

Day before expiry + large late move (added 2026-10-21 IST)

Verdict: FAIL. The combination "one trading day before weekly expiry AND a large late-session move" gives no reliable next-morning edge on cleaned data.

Data: cleaned Upstox historical 1-minute candles (frozen closing window = missing). The last real spot minute on CAS days (since 2026-08-03) is 15:14, and option bars are real until 15:40. Signal day = one trading day before the weekly expiry (calendar as above). 251 pre-expiry days, 2022-01..2026-10-19. Today (2026-10-21) is pending historical data and is not a pre-expiry day anyway; the next pre-expiry day is Mon 2026-10-26.

Late move measures (real bars only): primary m1 = close 15:14 / close 14:44 − 1 (30 real minutes on every day 2022-2026); m2 = 15:14 / 14:59 − 1 (15 minutes); m3 = old 15:29 / 14:59 − 1 (pre-CAS days only). "Large" definitions, fixed in advance: |move| ≥ 0.3%, ≥ 0.5%; |move| in the top 20% / top 10% of the same day-type's own past history (rolling window, past data only: last 52 pre-expiry days, or 250 other days, minimum 20); |move| ≥ 1.0x / 1.5x the trailing 20-day average |move| for the same window. Up and down moves are reported separately. "Same dir %" is the momentum hit rate; the fade hit rate is 100 minus it. Outcomes are measured from the 15:14 real price (the entry reference). The gap versus the official close is also shown, but on pre-CAS days the official close is a 30-minute VWAP, which biases that number. Comparisons: (a) pre-expiry days without a large move (same direction), (b) non-pre-expiry days with a large move (same direction). Binomial p is against the pre-expiry base rate for that direction; Fisher compares the combo with group (b); BH is applied across all tests.

Spot outcomes, primary measure m1 (14:45→15:14)

definitionsidengap same dir %09:16 %09:30 %09:45 %10:15 %expiry close %gap same dir % (vs official close)pre base gap %pre, not large gap %non-pre, large gap %median gap (signed, %)median 10:15 (signed, %)median expiry range %range, pre not large %min p binommin q BHmin p Fisher vs non-pre large
abs>=0.3up2450.045.854.250.058.358.354.257.853.871.90.00.11.10.80.2271.0000.073
abs>=0.3down1838.944.455.650.061.150.044.442.236.929.5-0.20.11.20.90.3461.0000.046
abs>=0.5up250.050.050.050.050.050.050.057.853.169.22.11.12.00.81.0001.0000.476
abs>=0.5down366.733.333.333.366.766.766.742.236.422.20.00.01.00.90.5771.0000.184
top20% own-type rollingup2343.543.543.547.856.552.247.858.054.173.2-0.10.11.00.80.2041.0000.010
top20% own-type rollingdown1833.344.450.050.061.150.038.942.035.941.7-0.20.10.90.90.2491.0000.197
top10% own-type rollingup1250.050.041.758.366.766.758.358.052.367.9-0.00.11.00.80.2481.0000.311
top10% own-type rollingdown1241.750.050.050.058.350.050.042.034.735.7-0.10.11.00.90.5661.0000.057
>=1.0x 20d avgup5054.048.042.052.054.048.060.057.350.068.10.10.10.90.80.3221.0000.075
>=1.0x 20d avgdown3828.934.239.531.639.550.031.642.740.543.2-0.2-0.21.00.90.0361.0000.140
>=1.5x 20d avgup3056.750.050.056.763.360.063.357.350.070.60.10.21.00.80.1021.0000.185
>=1.5x 20d avgdown2227.336.450.040.950.054.531.842.738.942.1-0.20.01.00.90.1961.0000.233

Alternate measures (compact)

m2 (15:00→15:14):

definitionsidengap same dir %10:15 %expiry close %pre base gap %non-pre, large gap %min p binommin q BH
abs>=0.3up1136.454.563.657.862.50.2211.000
abs>=0.3down1250.050.050.042.229.70.5701.000
abs>=0.5up10.00.00.057.850.00.4221.000
abs>=0.5down2100.0100.0100.042.233.30.1781.000
top20% own-type rollingup2245.554.550.058.064.00.2811.000
top20% own-type rollingdown2437.545.841.742.041.30.3101.000
top10% own-type rollingup1241.758.366.758.065.70.2481.000
top10% own-type rollingdown1540.060.053.342.031.20.4391.000
>=1.0x 20d avgup5653.646.446.457.364.60.3501.000
>=1.0x 20d avgdown4623.943.547.842.742.80.0071.000
>=1.5x 20d avgup3158.151.645.257.363.60.4701.000
>=1.5x 20d avgdown2737.055.655.642.740.00.4421.000

m3 (old 14:59→15:29, pre-CAS days only):

definitionsidengap same dir %10:15 %expiry close %pre base gap %non-pre, large gap %min p binommin q BH
abs>=0.3up944.466.777.856.959.20.0961.000
abs>=0.3down1729.423.547.143.129.20.0491.000
abs>=0.5up450.050.075.056.985.70.3541.000
abs>=0.5down475.050.050.043.122.20.3171.000
top20% own-type rollingup2142.952.457.157.156.20.1911.000
top20% own-type rollingdown2528.036.048.042.934.10.1091.000
top10% own-type rollingup1136.454.581.857.163.20.0351.000
top10% own-type rollingdown1233.341.750.042.935.00.5721.000
>=1.0x 20d avgup4252.459.552.456.864.70.2801.000
>=1.0x 20d avgdown4325.632.653.543.238.80.0211.000
>=1.5x 20d avgup2259.168.259.156.860.70.1961.000
>=1.5x 20d avgdown2729.640.751.943.238.90.1241.000

Year by year (m1): combo days and gap same-direction %

definitionsidegap same % 2022gap same % 2023gap same % 2024gap same % 2025gap same % 2026n 2022n 2023n 2024n 2025n 2026
>=1.0x 20d avgdown27.325.042.922.228.611.04.07.09.07.0
>=1.0x 20d avgup72.750.050.040.060.011.016.08.010.05.0
>=1.5x 20d avgdown20.025.040.00.040.05.04.05.03.05.0
>=1.5x 20d avgup75.045.525.060.0100.08.011.04.05.02.0
abs>=0.3down33.333.366.70.050.06.03.03.02.04.0
abs>=0.3up66.740.00.050.09.010.01.04.0
abs>=0.5down0.0100.01.02.0
abs>=0.5up0.0100.01.01.0
top10% own-type rollingdown0.050.066.70.066.71.02.03.03.03.0
top10% own-type rollingup50.025.00.0100.066.72.04.01.02.03.0
top20% own-type rollingdown0.033.340.020.050.01.03.05.05.04.0
top20% own-type rollingup60.028.650.050.040.05.07.02.04.05.0

Option-buyer trades on the combo (m1 signal at 15:14)

Entries: option 15:14 close, 15:15 open, or 15:25 close, all with the 15:14 signal and +3 pts slippage. Instruments: the contract expiring next day, or the following weekly; ATM or 1 ITM (strike from the 15:14 spot). Exits: next day at 09:15 open, 09:16, 09:30, 09:45 or 10:15 close, or hold to 11:00 with a 30% premium stop (expiry-day gamma variant); −3 pts slippage. Costs: brokerage, STT, exchange fee, SEBI fee, stamp duty and GST. Momentum = CE after an up move or PE after a down move; fade = the opposite. Percentile = rank of the total against 2,000 random same-size sets of pre-expiry days (same option and variant). Option data covers 2024-10-01..2026-09-28 (104 pre-expiry days; 2024-08/09 has no next-day-expiry contract in the dataset). Every row below has n < 20.

Totals: 1728 variants (6 definitions × 2 sides × 2 modes × 2 expiries × 2 strikes × 3 entries × 6 exits). 841 positive, 283 beat 95% of random sets, 0 with n ≥ 20, and 75 positive after removing each variant's best day. m2 signal: 1584 variants, 821 positive, 0 with n ≥ 20.

definitionsidemodevariantsnpositivepositive_ex_best_daybeat95
>=1.0x 20d avgdownfade7218300
>=1.0x 20d avgdownmomentum72182200
>=1.0x 20d avgupfade72144500
>=1.0x 20d avgupmomentum72143001
>=1.5x 20d avgdownfade7211800
>=1.5x 20d avgdownmomentum72115620
>=1.5x 20d avgupfade727000
>=1.5x 20d avgupmomentum727722870
abs>=0.3downfade727100
abs>=0.3downmomentum7276120
abs>=0.3upfade7244000
abs>=0.3upmomentum72472069
abs>=0.5downfade721300
abs>=0.5downmomentum7216200
abs>=0.5upfade721000
abs>=0.5upmomentum72172072
top10% own-type rollingdownfade727000
top10% own-type rollingdownmomentum72761240
top10% own-type rollingupfade725000
top10% own-type rollingupmomentum72572571
top20% own-type rollingdownfade7212200
top20% own-type rollingdownmomentum721258140
top20% own-type rollingupfade7294500
top20% own-type rollingupmomentum7295600

Best variant per definition, side and mode (in-sample best = optimistic)

definitionsidemodevariantnn<20win_pctavgmediantotalmaxddtotal_ex_best_daypctile vs random
>=1.5x 20d avgupmomentumCE ITM1 next-day expiry, 15:25c→09:15o7yes42.9132.8-2.9929.774.937.499.3
abs>=0.5upmomentumCE ITM1 next-day expiry, 15:15o→09:15o1yes100.0895.5895.5895.50.00.099.2
top10% own-type rollingupmomentumCE ITM1 next-day expiry, 15:25c→09:15o5yes60.0178.60.7892.8108.70.699.3
abs>=0.3upmomentumCE ITM1 next-day expiry, 15:25c→09:15o4yes50.0186.51.4746.0257.8-146.296.8
top20% own-type rollingupmomentumCE ITM1 next-day expiry, 15:25c→09:15o9yes33.371.1-21.1639.6257.8-252.693.3
>=1.0x 20d avgupmomentumCE ITM1 next-day expiry, 15:25c→09:15o14yes35.738.8-12.1542.8257.8-349.591.8
top10% own-type rollingdownmomentumPE ITM1 next-day expiry, 15:25c→09:167yes71.438.065.3266.2200.017.289.9
abs>=0.3downmomentumPE ITM1 next-day expiry, 15:25c→10:157yes57.135.088.2244.9197.411.383.3
>=1.0x 20d avgupfadePE ITM1 next-day expiry, 15:14c→09:1614yes50.017.4-2.9244.0330.7-90.779.2
top20% own-type rollingdownmomentumPE ITM1 next-day expiry, 15:25c→10:1512yes58.320.025.1240.4197.46.875.3
top20% own-type rollingupfadePE ITM1 next-day expiry, 15:15o→09:309yes44.425.3-1.3227.4184.7-124.978.0
>=1.5x 20d avgdownmomentumPE ITM1 next-day expiry, 15:25c→09:4511yes45.515.6-16.5171.1188.619.169.3
abs>=0.3upfadePE ITM1 next-day expiry, 15:14c→09:164yes50.040.0-8.4160.2291.1-174.585.0
>=1.0x 20d avgdownmomentumPE ITM1 following weekly, 15:25c→09:3018yes61.18.63.4154.5213.0-12.961.4
abs>=0.5downmomentumPE ITM1 next-day expiry, 15:25c→10:151yes100.0101.7101.7101.70.00.089.6
>=1.0x 20d avgdownfadeCE ITM1 following weekly, 15:14c→09:15o18yes44.41.5-0.426.2157.2-121.778.1
top20% own-type rollingdownfadeCE ATM following weekly, 15:14c→09:15o12yes41.71.7-2.520.8158.2-133.881.8
>=1.5x 20d avgdownfadeCE ATM next-day expiry, 15:14c→09:15o11yes45.51.5-0.316.0143.8-163.384.8
abs>=0.5downfadeCE ATM next-day expiry, 15:14c→09:15o1yes100.04.04.04.00.00.079.9
abs>=0.3downfadeCE ATM next-day expiry, 15:14c→09:15o7yes57.10.14.01.0116.2-178.383.5
top10% own-type rollingdownfadeCE ATM following weekly, 15:25c→09:15o7yes28.6-2.4-4.2-16.9158.2-184.973.0
abs>=0.5upfadePE ATM next-day expiry, 15:25c→09:161yes0.0-94.6-94.6-94.694.60.02.8
top10% own-type rollingupfadePE ATM next-day expiry, 15:14c→09:15o5yes20.0-43.9-21.9-219.7276.4-276.43.9
>=1.5x 20d avgupfadePE ATM next-day expiry, 15:25c→09:307yes28.6-36.8-4.9-257.5261.0-264.54.9

Reference: ≥1.0x 20-day average, ATM, next-day expiry, 15:15 open entry, every exit

sidemodetypexitnwin_pctavgmediantotalmaxddtotal_ex_best_daypctile_vs_random_pretot_2026tot_2024tot_2025
upmomentumCE09:15o1414.323.9-20.6334.6280.5-481.087.9561.6-227.0
upmomentumCE09:161414.3-6.5-34.7-91.0331.0-661.887.1239.9-330.8
upmomentumCE09:30147.1-13.2-49.9-184.4440.8-781.384.7256.3-440.8
upmomentumCE09:451428.6-11.7-47.9-164.0360.5-661.286.8136.7-300.7
upmomentumCE10:151435.74.8-29.766.6300.2-455.694.0222.0-155.4
upmomentumCE11:00stop30147.1-5.0-31.0-69.6345.4-674.586.1259.5-329.1
upfadePE09:15o1450.0-3.0-6.3-42.6299.1-189.368.8-36.2-6.5
upfadePE09:161450.013.1-6.6182.8303.0-127.278.5149.932.9
upfadePE09:301442.910.3-9.5143.9255.9-182.569.270.573.4
upfadePE09:451450.09.0-7.9126.2249.4-162.473.373.153.2
upfadePE10:151421.4-14.1-44.1-197.8473.4-473.429.6-45.2-152.7
upfadePE11:00stop301414.3-20.9-30.7-292.4472.6-472.613.2-118.3-174.1
downmomentumPE09:15o1822.2-18.8-21.7-337.9337.9-540.216.0-73.1-117.2-147.6
downmomentumPE09:161833.3-4.5-15.3-81.6210.8-293.043.5-14.2-10.3-57.1
downmomentumPE09:301838.9-3.0-7.3-54.8194.5-197.139.4-10.2-24.4-20.2
downmomentumPE09:451838.9-11.8-26.7-213.0310.7-330.429.0-137.197.7-173.6
downmomentumPE10:151844.4-10.7-29.0-192.6233.8-385.132.2-73.441.2-160.4
downmomentumPE11:00stop301827.8-12.2-23.6-219.7288.2-438.927.634.7-44.5-209.8
downfadeCE09:15o1833.3-9.9-2.9-177.4334.2-356.668.8-0.344.1-221.1
downfadeCE09:161833.3-21.8-16.3-391.5447.7-499.165.8-164.1-14.6-212.9
downfadeCE09:301822.2-32.6-24.5-586.6631.4-728.554.4-181.1-91.8-313.7
downfadeCE09:451822.2-36.7-29.1-660.4660.4-693.339.0-194.8-173.4-292.2
downfadeCE10:151827.8-36.7-26.7-660.7742.5-742.540.6-260.0-87.3-313.3
downfadeCE11:00stop301822.2-28.8-31.8-518.2551.2-596.049.5-267.6-44.8-205.8

Every combo day 2024-2026 (any definition, m1): 47 days, 33 with option data

"Best trade" is the best of all 72 option variants that day, chosen with hindsight; it is only there to help you eyeball the days. The two reference columns are fixed: the ATM next-day-expiry option bought at the 15:15 open and sold at the 09:15 open.

datesidelate move 14:45→15:14 %gap vs 15:14 %gap vs official close %10:15 vs 15:14 %expiry close vs 15:14 %expiry range %momentum ATM next-day 15:15→09:15 ptsfade ATM next-day 15:15→09:15 ptsbest trade (hindsight)best ptsqualifies under
2024-01-10up0.20.40.30.30.20.6no option data>=1.0x 20d avg
2024-01-24up0.1-0.00.0-0.4-0.51.0no option data>=1.0x 20d avg
2024-01-31up0.10.20.30.2-0.10.8no option data>=1.0x 20d avg
2024-02-21up0.3-0.10.1-0.80.61.7no option data>=1.0x 20d avg; >=1.5x 20d avg
2024-04-30down-0.6-0.2-0.20.20.20.6no option data>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; abs>=0.5; top10% own-type rolling; top20% own-type rolling
2024-06-19down-0.40.30.3-0.10.20.8no option data>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2024-08-07up0.2-0.3-0.2-0.6-0.81.1no option data>=1.0x 20d avg; >=1.5x 20d avg
2024-08-28down-0.2-0.1-0.10.20.40.8no option data>=1.0x 20d avg
2024-09-04up0.10.20.2-0.0-0.30.6no option data>=1.0x 20d avg
2024-09-11down-0.10.60.60.52.02.0no option data>=1.0x 20d avg
2024-09-18up0.20.40.40.50.10.9no option data>=1.0x 20d avg; >=1.5x 20d avg; top20% own-type rolling
2024-09-25up0.3-0.00.00.20.81.0no option data>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2024-10-09down-0.30.40.30.60.10.6-72.342.8CE ITM1 next-day expiry, 15:15o->10:15100.1>=1.0x 20d avg; >=1.5x 20d avg; top20% own-type rolling
2024-10-16down-0.20.20.2-0.5-0.91.2-13.6-1.4PE ITM1 next-day expiry, 15:14c->09:45109.6>=1.0x 20d avg; >=1.5x 20d avg; top20% own-type rolling
2024-11-19down-0.9-0.0-0.1-0.8-0.61.0-31.32.6PE ITM1 next-day expiry, 15:25c->10:15101.7>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; abs>=0.5; top10% own-type rolling; top20% own-type rolling
2025-01-01down-0.10.20.20.41.92.0-18.1-28.3CE ITM1 next-day expiry, 15:14c->11:00stop3091.1>=1.0x 20d avg
2025-01-22up0.2-0.2-0.10.20.20.8-27.26.7CE ITM1 following weekly, 15:25c->10:1533.7>=1.0x 20d avg; >=1.5x 20d avg
2025-02-05down-0.20.30.3-0.3-0.40.9-28.6-1.8PE ITM1 following weekly, 15:14c->10:1530.8>=1.0x 20d avg
2025-02-12up0.30.00.00.6-0.11.1-6.3-15.9CE ITM1 next-day expiry, 15:14c->10:1588.9>=1.0x 20d avg; >=1.5x 20d avg; top10% own-type rolling; top20% own-type rolling
2025-02-19up0.3-0.5-0.5-0.3-0.10.5-49.723.0PE ITM1 next-day expiry, 15:14c->09:15o80.1>=1.0x 20d avg; top20% own-type rolling
2025-03-12up0.10.30.30.3-0.30.8-7.6-16.2CE ITM1 next-day expiry, 15:25c->10:1540.2>=1.0x 20d avg
2025-03-26down-0.1-0.3-0.20.40.41.016.6-53.4CE ITM1 next-day expiry, 15:25c->10:1562.1>=1.0x 20d avg
2025-04-02up0.1-0.8-0.8-0.3-0.40.7-50.052.8PE ITM1 following weekly, 15:14c->09:15o120.3>=1.0x 20d avg
2025-04-08down-0.2-0.3-0.3-0.7-0.60.512.7-91.8PE ITM1 following weekly, 15:25c->09:30101.9>=1.0x 20d avg; top20% own-type rolling
2025-04-23up0.2-0.2-0.2-0.2-0.40.5-14.03.2PE ITM1 next-day expiry, 15:15o->09:3020.2>=1.0x 20d avg; >=1.5x 20d avg; top20% own-type rolling
2025-05-14up0.20.10.1-0.41.62.5-0.8-31.7PE ITM1 next-day expiry, 15:25c->09:45109.2>=1.0x 20d avg; >=1.5x 20d avg
2025-05-28down-0.10.30.30.20.30.9-64.1-3.9CE ITM1 next-day expiry, 15:25c->09:1661.8>=1.0x 20d avg
2025-06-18up0.1-0.0-0.00.1-0.10.5-29.9-32.2CE ITM1 next-day expiry, 15:25c->09:15o2.4>=1.0x 20d avg
2025-07-02up0.20.20.20.3-0.20.8-6.5-21.8CE ITM1 next-day expiry, 15:25c->10:1541.9>=1.0x 20d avg; >=1.5x 20d avg; top10% own-type rolling; top20% own-type rolling
2025-08-26down-0.30.0-0.1-0.5-0.80.9-1.2-11.0PE ITM1 next-day expiry, 15:25c->09:30133.0>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2025-09-08down-0.40.40.40.20.40.3-21.710.3CE ITM1 next-day expiry, 15:14c->09:3043.9>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2025-09-29down-0.20.20.2-0.0-0.10.6-19.8-13.3PE ITM1 next-day expiry, 15:25c->09:4516.8>=1.0x 20d avg; top20% own-type rolling
2025-11-24down-0.30.20.20.3-0.30.7-23.6-27.7CE ITM1 next-day expiry, 15:25c->10:1514.2>=1.0x 20d avg; >=1.5x 20d avg; top10% own-type rolling; top20% own-type rolling
2025-12-08up0.2-0.4-0.4-0.7-0.50.8-35.025.7PE ITM1 next-day expiry, 15:14c->09:45144.2>=1.0x 20d avg
2026-01-23down-0.20.10.10.30.51.3-24.32.3CE ITM1 following weekly, 15:14c->09:4566.9>=1.0x 20d avg
2026-02-02up0.54.94.92.52.62.8815.7-109.6CE ITM1 next-day expiry, 15:15o->09:15o895.5>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; abs>=0.5; top10% own-type rolling; top20% own-type rolling
2026-02-23up0.2-0.3-0.3-0.9-1.11.2-55.910.2PE ITM1 next-day expiry, 15:14c->11:00stop30155.8top20% own-type rolling
2026-02-27down-0.5-2.0-2.1-1.1-1.21.5202.3-115.3PE ITM1 next-day expiry, 15:25c->11:00stop30260.7>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2026-03-09up0.41.01.10.60.90.926.4-129.4CE ITM1 next-day expiry, 15:25c->09:15o111.6>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2026-03-23down-0.41.61.60.91.81.9-181.2179.2CE ATM next-day expiry, 15:25c->09:15o192.4>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2026-04-06up0.3-0.7-0.6-0.30.61.9-146.356.1PE ITM1 next-day expiry, 15:14c->09:16116.6>=1.0x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2026-04-10up0.3-1.9-1.9-1.7-0.91.5-134.2146.7PE ITM1 next-day expiry, 15:15o->09:30352.2>=1.0x 20d avg; abs>=0.3; top20% own-type rolling
2026-05-11down-0.5-0.3-0.4-0.7-1.81.74.6-72.5PE ITM1 next-day expiry, 15:25c->11:00stop30136.2>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top10% own-type rolling; top20% own-type rolling
2026-06-15down-0.30.30.30.30.60.5-52.86.4CE ITM1 next-day expiry, 15:14c->11:00stop3035.9>=1.0x 20d avg; >=1.5x 20d avg; abs>=0.3; top20% own-type rolling
2026-09-21down-0.10.10.20.1-0.40.9-21.7-0.4PE ITM1 following weekly, 15:25c->11:00stop3016.9>=1.0x 20d avg; >=1.5x 20d avg
2026-10-05down-0.10.30.20.51.10.8no option data>=1.0x 20d avg
2026-10-16up0.10.10.0-0.2-1.01.4no option data>=1.0x 20d avg

Files: combo_spot.csv, combo_spot_by_year.csv, combo_options_summary.csv, combo_day_list_2024_2026.csv. Scripts: /workspace/research/pre-expiry/combo/ (extract.py, spot.py, opt.py, post.py, section.py).

Method notes and exclusions

Files

results/: buckets_last30.csv, buckets_last30x.csv, deciles_*.csv, base_rates.csv, conditional.csv, by_year.csv, train_test.csv, shuffle_tests.csv, correlations.csv, regression.csv, jump1529_by_year.csv, option_pnl_summary.csv, option_trades_0920_X0.3_0.5.csv, daily_features.csv