# Fetch NSE participant-wise OI (public archive) for each trading day 2021-12..2026-10-23; FII index futures long % = Long/(Long+Short). import pandas as pd,requests,os,time,io D=pd.read_parquet('/workspace/research/flow-forensics-2026-10/lows/data/minute_panel_v.parquet',columns=['date']).date.drop_duplicates().sort_values() days=list(pd.bdate_range('2021-12-01','2021-12-31'))+list(D) s=requests.Session(); s.headers['User-Agent']='Mozilla/5.0'; rows=[] for d in days: f=f'data/fao/{d:%d%m%Y}.csv' if not os.path.exists(f): try: r=s.get(f'https://archives.nseindia.com/content/nsccl/fao_participant_oi_{d:%d%m%Y}.csv',timeout=20) if r.status_code==200 and b'Client Type' in r.content: open(f,'wb').write(r.content) except Exception as e: print(d,e) time.sleep(0.25) if os.path.exists(f): t=pd.read_csv(f,skiprows=1); t.columns=[c.strip() for c in t.columns]; t['Client Type']=t['Client Type'].str.strip() x=t[t['Client Type']=='FII'].iloc[0]; L=float(x['Future Index Long']); S_=float(x['Future Index Short']) rows.append(dict(date=d,fii_fut_long=L,fii_fut_short=S_,fii_long_pct=100*L/(L+S_))) pd.DataFrame(rows).to_csv('data/fii_index_fut_long_pct.csv',index=False); print('days',len(rows))