import pandas as pd,numpy as np,glob,os pd.set_option('display.width',250);pd.set_option('display.max_columns',40);pd.set_option('display.max_rows',400) D='../data/1m' def L(n): d=pd.read_csv(f'{D}/{n}_1m.csv',parse_dates=['ts']); d['ts']=d.ts.dt.tz_localize(None); return d.set_index('ts') def P(f): return pd.read_parquet(f).set_index('ts') out=open('results/intraday_report.txt','w') def pr(*a): s=' '.join(str(x) for x in a); print(s); out.write(s+'\n') LOT={'NIFTY':65,'BANKNIFTY':30} for day,phases in [('2026-10-23',[('13:20','13:37'),('13:37','13:41'),('13:41','13:47'),('13:47','13:54'),('13:54','14:10')]), ('2026-10-13',[('09:15','09:30'),('09:30','10:00'),('13:45','14:15'),('14:15','14:30'),('14:30','14:45'),('14:45','15:00'),('15:00','15:14')])]: pr('\n=================',day) spot=L('NIFTY').close[day]; bns=L('BANKNIFTY').close[day] fut={} for u in ['NIFTY','BANKNIFTY']: fs=sorted(glob.glob(f'data/{u}_FUT_*_{day}.parquet')) fut[u]={os.path.basename(f).split('_FUT_')[1][:9]:P(f) for f in fs} # minute OI sanity: |dOI| <= minute volume for u in fut: for k,v in fut[u].items(): bad=(v.oi.diff().abs()>v.volume).sum(); pr(f'{u} {k}: minutes where |dOI|>volume (OI feed glitch/lag) = {bad} of {len(v)}') rows=[] for a,b in phases: ta,tb=pd.Timestamp(f'{day} {a}'),pd.Timestamp(f'{day} {b}') r=dict(phase=f'{a}->{b}',nifty_spot=round(spot.get(tb,np.nan)-spot.get(ta,np.nan),1),bn_spot=round(bns.get(tb,np.nan)-bns.get(ta,np.nan),1)) for u in fut: near=list(fut[u].values())[0] if False else fut[u] oct_=[v for k,v in fut[u].items() if 'OCT' in k][0] r[f'{u[:2]}fut_pts']=round(oct_.close[tb]-oct_.close[ta],1) vol=sum(v.volume[(v.index>ta)&(v.index<=tb)].sum() for v in fut[u].values()) doi=sum(v.oi[tb]-v.oi[ta] for v in fut[u].values()) r[f'{u[:2]}_vol_ctr']=int(vol/LOT[u]); r[f'{u[:2]}_dOI_ctr_allexp']=int(doi/LOT[u]) r[f'{u[:2]}_dOI_ctr_oct']=int((oct_.oi[tb]-oct_.oi[ta])/LOT[u]) rows.append(r) t=pd.DataFrame(rows); pr(t.to_string(index=False)); t.to_csv(f'results/fut_phases_{day}.csv',index=False) # minute table NIFTY all expiries combined around burst o=fut['NIFTY']; comb=sum(v.oi for v in o.values()); vv=sum(v.volume for v in o.values()) oc=[v for k,v in o.items() if 'OCT' in k][0] m=pd.DataFrame({'spot':spot,'fut':oc.close,'basis':oc.close-spot,'vol_ctr':(vv/65).round(),'dOI_ctr':(comb.diff()/65).round(),'bn_spot':bns,'bnfut_vol_ctr':(sum(v.volume for v in fut['BANKNIFTY'].values())/30).round(),'bn_dOI_ctr':(sum(v.oi for v in fut['BANKNIFTY'].values()).diff()/30).round()}) w=('13:30','13:58') if day=='2026-10-23' else ('14:15','14:50') mm=m.between_time(*w); pr(mm.to_string()); mm.to_csv(f'results/fut_minutes_{day}.csv') out.close()