# Outlier sensitivity (drop top 1/3 trades) for 2026 combo trades + BH over the 10 distinct tests (PAIR_BEST == PAIR_P3P4). import pandas as pd,numpy as np RS='/workspace/research/popular-strategies/results' R=pd.read_csv(f'{RS}/combo_results.csv'); t=R[(R.split=='test')&(R.combo!='PAIR_BEST')] p=t.t_p.fillna(1).values; m=len(p); o=np.argsort(p); q=np.empty(m); q[o]=np.minimum.accumulate((p[o]*m/np.arange(1,m+1))[::-1])[::-1] E=pd.read_csv(f'{RS}/combo_events.csv',parse_dates=['date']); rows=[] for c in R.combo.unique(): x=E[(E.combo==c)&(E.date>='2026-01-01')].dropna(subset=['pnl']).pnl.sort_values().values rows.append(dict(combo=c,n=len(x),mean=x.mean() if len(x) else np.nan,drop_top1=x[:-1].mean() if len(x)>1 else np.nan,drop_top3=x[:-3].mean() if len(x)>3 else np.nan)) S=pd.DataFrame(rows).merge(pd.DataFrame(dict(combo=t.combo,q_bh10=np.minimum(q,1))),how='left',on='combo').round(3); S.to_csv(f'{RS}/combo_sensitivity.csv',index=False); print(S)