# TEST evaluation of frozen choices + flaw-impact tables + all-exit secondary grid. import pandas as pd,numpy as np,json from scipy import stats T=pd.read_csv('results/trades_candidates.csv',parse_dates=['date']); T=T[T.status=='ok'] RR=pd.read_csv('results/trades_random.csv',parse_dates=['date','src_date']) CH=json.load(open('results/frozen_choices.json')); cands=['A','B15','B30','C','D','E'] def lotq(d): return 65 if d>=pd.Timestamp('2026-01-01') else 75 def summ(x): p=x.pnl; w=p[p>0]; l=p[p<=0] rs=(x.pnl*x.date.map(lotq)) if len(x) else pd.Series(dtype=float) cum=rs.cumsum().values if len(x) else np.array([0]); dd=(cum-np.maximum.accumulate(np.r_[0,cum])[1:]).min() if len(x) else 0 mon=(x.assign(rs=rs.values).groupby(x.date.dt.to_period('M')).rs.sum()) if len(x) else pd.Series(dtype=float) return dict(n=len(p),mean=p.mean(),median=p.median(),win=(p>0).mean()*100,avg_win=w.mean(),avg_loss=l.mean(),payoff=(w.mean()/abs(l.mean())) if len(w) and len(l) and l.mean()!=0 else np.nan, rs_total=rs.sum(),rs_per_trade=rs.mean(),maxdd_rs=dd,worst_month=(str(mon.idxmin()) if len(mon) else ''),worst_month_rs=(mon.min() if len(mon) else np.nan), t_p_one=(stats.ttest_1samp(p,0,alternative='greater').pvalue if len(p)>2 else np.nan)) rng=np.random.default_rng(7) def rand_pct(sub,cand,ex): R=RR[(RR.cand==cand)&(RR.ex==ex)]; G={k:g.pnl.values for k,g in R.groupby('src_date')} arrs=[G[d] for d in sub.date if d in G] if not arrs: return np.nan,np.nan means=np.array([np.mean([a[rng.integers(len(a))] for a in arrs]) for _ in range(2000)]) return (means0).mean()*100),rs=('rs','sum')).round(1); yy.to_csv('results/chosen_by_year.csv'); print(yy.to_string()) Y.groupby(['cand','ym']).agg(n=('pnl','size'),mean=('pnl','mean'),rs=('rs','sum')).round(1).to_csv('results/chosen_by_month.csv') # secondary: all exits x scen x split G=T.groupby(['cand','ex','scen','split']).pnl.agg(n='size',mean='mean',win=lambda v:(v>0).mean()*100).round(2).reset_index(); G.to_csv('results/grid_all_exits_scen.csv',index=False) print(G[G.scen=='REAL'].pivot_table(index=['cand','ex'],columns='split',values='mean').round(2).to_string()) # flaw impact (pooled all candidates, train+test) F=T.groupby(['scen','ex']).agg(n=('pnl','size'),gross=('gross','mean'),cost=('cost','mean'),pnl=('pnl','mean')).round(2); print(F.to_string()); F.to_csv('results/flaw_cost_exit_pooled.csv')