"""QE-RESEARCH-03/1.0: recompute summaries of anonymous paired groups. Standard library only. No network, trading or model training. Rows contain within-group medians, not individual returns. Comparisons are descriptive. """ import argparse,csv,json,math,statistics,sys from pathlib import Path FIELDS=['variant','group','control_pnl','control_dd_pct','control_models','variant_pnl','variant_dd_pct','variant_models'] class InputError(ValueError):pass def read_pairs(path): with Path(path).open(encoding='utf-8-sig',newline='') as f: reader=csv.DictReader(f) if reader.fieldnames!=FIELDS:raise InputError('E_COLUMNS: expected '+','.join(FIELDS)) rows=list(reader) if not rows:raise InputError('E_EMPTY: no paired rows') seen=set();controls={} for row in rows: if set(row)!=set(FIELDS) or any(v is None for v in row.values()):raise InputError('E_ROW: incomplete or extra fields') if row['variant'] not in ['A','B'] or not row['group'].strip():raise InputError('E_LABEL: expected variant A/B and a group label') key=(row['variant'],row['group']) if key in seen:raise InputError('E_DUPLICATE_PAIR: '+':'.join(key)) seen.add(key) for key in FIELDS[2:]: try:x=float(row[key]) except (TypeError,ValueError):raise InputError('E_NUMBER: '+key) if not math.isfinite(x):raise InputError('E_NUMBER: '+key) if key.endswith('models') and (x<1 or not x.is_integer()):raise InputError('E_COUNT: '+key) if key.endswith('dd_pct') and not 0<=x<=100:raise InputError('E_DRAWDOWN: '+key) row[key]=int(x) if key.endswith('models') else x control=tuple(row[k] for k in FIELDS[2:5]) if row['group'] in controls and controls[row['group']]!=control:raise InputError('E_CONTROL_MISMATCH: '+row['group']) controls[row['group']]=control if {r['variant'] for r in rows}!={'A','B'}:raise InputError('E_VARIANTS: both A and B required') return rows def summarize(rows): result={} for arm in ['A','B']: rr=[r for r in rows if r['variant']==arm] result[arm]={'pairs':len(rr),'higher_pnl':sum(r['variant_pnl']>r['control_pnl'] for r in rr),'positive_pnl':sum(r['variant_pnl']>0 for r in rr),'positive_control':sum(r['control_pnl']>0 for r in rr),'lower_dd':sum(r['variant_dd_pct']