import sys,time,json; sys.path.insert(0,'/workspace/research/buyer-method-audit/scripts'); from lib_trail import * t0=time.time(); S,PC=load_spot(); opt(); X=pd.read_csv('results/signals_all.csv',parse_dates=['date']) X=X[X.date>=pd.Timestamp('2024-10-21')] rows=[]; spx=[] for r in X.itertuples(): a=S[r.date] for act in (1.5,2.0,3.0): for lock in (0.4,0.5,0.6): if act!=2.0 and lock!=0.5: continue # one-at-a-time sensitivity (+ primary) z=sim_trail(a,r.date,r.m,r.dir,r.entry,r.stop,r.R,'spot',act,lock) if z: rows.append(dict(cand=r.cand,date=r.date,hm=i2hm(r.m),dir=r.dir,R=r.R,mode='spot',act=act,lock=lock,split=split(r.date),inst='ATM',**z)) spx.append(dict(cand=r.cand,date=r.date,dir=r.dir,act=act,lock=lock,spot_pts=spot_proxy_trail(a,r.m,r.dir,r.entry,r.stop,r.R,act,lock))) z=sim_trail(a,r.date,r.m,r.dir,r.entry,r.stop,r.R,'prem'); if z: rows.append(dict(cand=r.cand,date=r.date,hm=i2hm(r.m),dir=r.dir,R=r.R,mode='prem',act=2.0,lock=0.5,split=split(r.date),inst='ATM',**z)) if r.cand in('B15','B30') and r.dir<0: for so,lab in ((2,'ITM2'),(4,'ITM4')): z=sim_trail(a,r.date,r.m,r.dir,r.entry,r.stop,r.R,'spot',2.0,0.5,strike_off=so) if z: rows.append(dict(cand='L'+r.cand[1:],date=r.date,hm=i2hm(r.m),dir=r.dir,R=r.R,mode='spot',act=2.0,lock=0.5,split=split(r.date),inst=lab,**z)) T=pd.DataFrame(rows); T.to_csv('results/trail50_trades.csv',index=False); pd.DataFrame(spx).to_csv('results/trail50_spot_proxy.csv',index=False) print('cand',len(T),T.status.value_counts().to_dict(),round(time.time()-t0),flush=True) # full-history spot proxy (2022+) for primary trail X0=pd.read_csv('results/signals_all.csv',parse_dates=['date']); sp0=[] for r in X0.itertuples(): sp0.append(dict(cand=r.cand,date=r.date,dir=r.dir,spot_pts=spot_proxy_trail(S[r.date],r.m,r.dir,r.entry,r.stop,r.R))) pd.DataFrame(sp0).to_csv('results/trail50_spot_proxy_full.csv',index=False) # random baseline, same seed/draw procedure as s3 (same days), primary spot & prem exits rng=np.random.default_rng(20261026); od=[d for d in sorted(S) if d>=pd.Timestamp('2024-10-21') and nexp(d) is not None] pool={s:[d for d in od if split(d)==s] for s in ('train','test')}; rr=[] LX=X[X.cand.isin(['B15','B30'])&(X.dir<0)].assign(cand=lambda z:'L'+z.cand.str[1:]) for r in pd.concat([X,LX]).itertuples(): sp=split(r.date); lead=r.cand.startswith('L') for k in range(30): d=pool[sp][rng.integers(len(pool[sp]))]; a=S[d]; en=a[3,r.m] if np.isnan(en): continue st=en-r.dir*r.R for mode,so in ([('spot',2)] if lead else [('spot',0),('prem',0)]): z=sim_trail(a,d,r.m,r.dir,en,st,r.R,mode,strike_off=so) if z and z['status']=='ok': rr.append(dict(cand=r.cand,src_date=r.date,rep=k,date=d,mode=mode,split=sp,pnl=z['pnl'])) pd.DataFrame(rr).to_csv('results/trail50_random.csv',index=False); print('random',len(rr),round(time.time()-t0))