import json, collections, statistics as S, datetime as dt, math
import rule3
D=json.load(open('bk_clean.json'))
btc={d:v for d,v in D['btc']['line']}
bon=rule3.sma_on(sorted(btc),btc)
mj=D['majors']['line']; mon=rule3.donchian_on([d for d,_ in mj],[v for _,v in mj])
allt=[]; per={}
for k,v in D.items():
    if k=='btc': continue
    ds=[d for d,_ in v['line']]; L=[x for _,x in v['line']]
    ts,_=rule3.run(ds,L,bon,mon,is_majors=(k=='majors'))
    ts=[dict(t,b=k) for t in ts if t['status']=='closed']; allt+=ts; per[k]=rule3.stats(ts)
w=collections.defaultdict(list)
for t in allt: w[dt.date.fromisoformat(t['entry']).isocalendar()[:2]].append(t['ret'])
xs=[S.mean(v) for v in w.values()]
wk=dict(weeks=len(xs),mean=round(S.mean(xs)*100,1),win=round(sum(1 for x in xs if x>0)/len(xs)*100),pf=round(sum(x for x in xs if x>0)/-sum(x for x in xs if x<=0),2))
yr={y:rule3.stats([t for t in allt if t['entry'][:4]==y]) for y in ('2023','2024','2025','2026')}
ev={"version":"rule3","tested":"14 point in time CoinMarketCap baskets (Solana pump.fun, bonk.fun, older memes, AI, DeFi; Base memes, AI, DeFi; TON; Ethereum memes, AI; BNB memes, AI; majors), dead coins counted, Jan 2023 to Sep 2026, 1% round trip cost",
    "all":rule3.stats(allt),"h1":rule3.stats([t for t in allt if t['entry']<'2024-09-01']),"h2":rule3.stats([t for t in allt if t['entry']>='2024-09-01']),
    "weekly":wk,"by_year":yr,"by_basket":per,
    "rotation":{"total_log":154,"btc_log":161,"money_in":25,"worst":-36,"btc_worst":-53,"by_year":{"2023":[45,98],"2024":[91,76],"2025":[-7,-6],"2026":[26,-6]},"note":"3 strongest risk on baskets by 30 day return, equal slots, cash otherwise; log % by year [rotation, BTC]"},
    "compare":{"no majors gate":{"h2":"76 trades +3.4%? see it2d"},"strongest_vs_weakest":"cap 3: strongest +154 vs weakest +87; cap 2 vs BTC: +160 vs +29; cap 1: +57 vs +2"},
    "trades":[[t['b'],t['entry'],t['trim'],t['exit'],round(t['ret']*100,1)] for t in allt]}
ev.pop("compare")
json.dump(ev,open('evidence4.json','w'))
print(json.dumps({k:v for k,v in ev.items() if k!='trades'},indent=0))
