# Implied Nifty point-sensitivity per stock: dN = sum_i c_i * dP_i, NNLS on 1-minute differences (Oct 1-23, 09:16-15:14 real minutes). import pandas as pd,numpy as np,sys; sys.path.insert(0,'scripts'); from load import * from scipy.optimize import nnls N=m1('NIFTY').set_index('ts').close P=pd.DataFrame({s:m1(s).set_index('ts').close for s in STK}) ix=N.index[(N.index>='2026-10-01')&(N.index.strftime('%H:%M')<='15:14')] X=P.loc[ix]; y=N.loc[ix] dX=X.diff(); dy=y.diff(); same=pd.Series(X.index.date,index=X.index); ok=(same==same.shift()).values&dX.notna().all(1).values&dy.notna().values c,res=nnls(dX.values[ok],dy.values[ok]) pred=dX.values[ok]@c; r2=1-((dy.values[ok]-pred)**2).sum()/((dy.values[ok]-dy.values[ok].mean())**2).sum() w=pd.Series(c,index=STK); last=P.loc['2026-10-23 15:14']; wt=w*last/N.loc['2026-10-23 15:14'] out=pd.DataFrame({'pts_per_rupee':w,'price_1514_1023':last,'implied_weight_pct':100*wt}).sort_values('implied_weight_pct',ascending=False) out.to_csv('data/implied_weights.csv'); print('R2',round(r2,4),'sum w',round(wt.sum(),4),'n',ok.sum()); print(out.round(3).to_string())