import json, math, statistics as S, collections
from stages import stage_series
exec(open('it2.py').read().split("V={")[0])
def don_state(L,a=30,b=15):
    s=False;o=[]
    for i in range(len(L)):
        if i>=a and L[i]>max(L[i-a:i]): s=True
        elif i>=b and L[i]<min(L[i-b:i]): s=False
        o.append(s)
    return o
alld=sorted({d for k in keys for d,_ in D[k]['line']})
ON={}; LV={}
for k in keys:
    ds=[d for d,_ in D[k]['line']]; L=[v for _,v in D[k]['line']]
    LV[k]=dict(zip(ds,L)); ON[k]=dict(zip(ds,don_state(L)))
breadth={d:(sum(1 for k in keys if ON[k].get(d)),sum(1 for k in keys if d in ON[k] and k!='majors')) for d in alld}
# HOT conditional on BTC
H=collections.defaultdict(list)
for k in keys:
    ds=[d for d,_ in D[k]['line']]; L=[v for _,v in D[k]['line']]; st=stage_series(L); bo=bt_on(ds)
    for i in range(30,len(L)-14):
        f=L[i+14]/L[i]-1; per='H1' if ds[i]<'2024-09-01' else 'H2'
        n_on,n=breadth[ds[i]]; frac=n_on/max(n,1)
        if st[i][0]=='HOT':
            H[('HOT','BTC on' if bo[i] else 'BTC off',per)].append(f)
            H[('HOT','breadth>=50%' if frac>=0.5 else 'breadth<50%',per)].append(f)
        H[('ALL','BTC on' if bo[i] else 'BTC off',per)].append(f)
for key in sorted(H):
    xs=H[key]; print(key,len(xs),f"med {S.median(xs)*100:+.1f}% up {sum(1 for x in xs if x>0)/len(xs)*100:.0f}%")
# breakout trades by breadth at signal (other baskets ON share)
G=collections.defaultdict(list)
for k in keys:
    ds=[d for d,_ in D[k]['line']]; L=[v for _,v in D[k]['line']]
    for t in trades_don(ds,L,30,15,btc=bt_on(ds),btc_mode='entry'):
        n_on,n=breadth[t['sig']]; fr=(n_on-1)/max(n-1,1)
        b='others ON 0-25%' if fr<0.25 else 'others ON 25-50%' if fr<0.5 else 'others ON 50%+'
        per='H1' if t['sig']<'2024-09-01' else 'H2'
        G[(b,per)].append(t); G[(b,'all')].append(t)
        mj=ON['majors'].get(t['sig'])
        G[('majors ON' if mj else 'majors OFF','all')].append(t); G[('majors ON' if mj else 'majors OFF',per)].append(t)
for key in sorted(G): print(key, st_(G[key]))
json.dump({d:list(v) for d,v in breadth.items()},open('breadth.json','w'))
