import pandas as pd RN_=f'{L}/results' NC=pd.read_csv(f'{RN_}/ntv_vs_otm20.csv'); NF=pd.read_csv(f'{RN_}/ntv_freq.csv'); NM=pd.read_csv(f'{RN_}/ntv_freq_mode.csv'); NW=pd.read_csv(f'{RN_}/ntv_freq_win.csv') NS=pd.read_csv(f'{RN_}/ntv_summary.csv'); NR=pd.read_csv(f'{RN_}/ntv_regime.csv'); NFL=pd.read_csv(f'{RN_}/ntv_fill.csv'); NG=pd.read_csv(f'{RN_}/ntv_spot_gross.csv'); NT=pd.read_csv(f'{RN_}/ntv_trades.csv') NCt=NC.rename(columns={'x2':'P(≥2×) %','x3':'P(≥3×) %','zero':'settle≈0 %','peak_min_med':'median min to peak','sig_time_med':'median signal minute (0=9:15)','ret_a':'net/premium (a)','ret_c':'net/premium (c)'}) nsp=NS[(NS.tvdef=='tv2')&NS.grp.isin(['NIFTY_raw','SENSEX_scaled'])&NS['mode'].isin(['all','counter','with'])][['grp','mode','split','exit','n','mean','median','win','no_top3','p','q_bh_primary','random_mean','spot_same_dir','spot_coinflip_mean','counts']] ncount=int(NS.counts.sum()) SG=NG.groupby(['grp','split'])[['fc','sa_gross','sb_gross','sc_gross']].mean().reset_index().rename(columns={'fc':'futures cost pts (round trip)','sa_gross':"spot (a') before costs",'sb_gross':"spot (b') before costs",'sc_gross':"spot (c') before costs"}) NTt=NT[(NT.tvdef=='tv2')&(NT.split=='test')][['grp','date','typ','t','mode','spot','K','ref','tv','fill','max_ratio','pnl_a','pnl_b','pnl_c','sa','sb','sc']] NTV_HTML=f"""

“20 without time value”: an ITM ~20 premium that is almost all intrinsic

Satya's follow-up at 20:29 IST (27-Oct): “20 without timevalue can you add that condition”. The design was pre-registered at 20:31 IST in PREREG.md (TWENTY-NO-TV). State: the option is ITM by 18–22 index points (intrinsic from the 1m spot close), its premium is 16–24, and its time value (premium − intrinsic) is between −2 and +2. Sensitivities: |TV| ≤ 1 and ≤ 10% of premium. Sensex is shown raw and scaled (levels × Sensex/Nifty open, ≈3.3). Delta ≈ 1, so the option roughly doubles on a ~20-point spot move. Signals run 9:35–15:00 only, because spot from 15:15 onward is missing and is not filled.

Verdict: no edge, and the state is rare.

N1. Frequencies: ITM-20 with no time value vs OTM-20 (from the Why-20 scan, signal ≥ 9:35)

{tb(NCt,2)}

By time-value definition:

{tb(NF.drop(columns=['split_by']),1)}

By trend (same trend label as s16; counter = buying against the 20-minute move and the open):

{tb(NM,1)}

By window (W2 11:00–13:00, W3 13:00–14:30, W4 14:30–15:00; there were no W1 events):

{tb(NW,1)}

N2. Tradable buyer test (earliest event per side per day; pts per unit after all costs)

Exits: (a) half at 2×, rest at 3× or the 15:29 close. (b) Stop at fill − 10 (≈ spot 10 against), then trail 50% of peak once +20. (c) Hold to settlement intrinsic (official close). Spot control at the same minute and direction: (a') stop −20, half +20, rest +40 or the 15:14 spot close. (b') stop −10, trail 50% once +20. (c') stop −20, else the official close. Spot-control figures are after futures costs. Coin-flip = random direction at the same minute (1000 sims). The R1 random control (random minute in the same window, contract in the state) almost equals the signal, because the state usually lasts only 1–2 minutes, so it is not informative here.

{tb(nsp,2)}

Spot/futures control before costs, and the futures cost (pts):

{tb(SG,2)}

All 2026 (test) trades. Sensex-scaled test means are positive only because of 3 winners out of 5; without the top 3 they are −36 to −75:

{tb(NTt,1)}

Regime filter chosen on train only (best single label with n ≥ 15), applied to test unchanged. With 3–5 test trades this proves nothing:

{tb(NR,2)}

N3. Fill realism

{tb(NFL,1)}

All signal and fill minutes had traded volume. The median volume at the signal minute is very high (about 9.5M units on Nifty), because these are near-ATM strikes in the last hour of expiry. Bid-ask spreads are unknown (there is no quote data). ITM spreads on expiry afternoons can be wider than the 0.5 / 1.5 slippage assumed. Time value is computed from the spot close against the option's last trade in the same minute, so it is noisy. {int(NFL.negTV_contracts.sum())} contracts were excluded at least once for printing more than 2 points below intrinsic.

Files: ntv_events.csv · ntv_trades.csv · ntv_summary.csv · ntv_vs_otm20.csv · ntv_freq*.csv · ntv_random.csv · ntv_regime.csv · ntv_fill.csv · ntv_spot_gross.csv · ntv_negtv.csv · scripts s20_notv.py, s21_notv_stats.py.

"""