import json, math, statistics as S, datetime as dt, sys
sys.path.insert(0, '/home/claude/live'); import rule4
st = json.load(open('/home/claude/live3/state.json')); ch = json.load(open('/home/claude/live3/chains.json'))
bk = json.load(open('bk_clean.json')); PX = json.load(open('majors_px.json'))
def rets(line): return {line[i][0]: line[i][1] / line[i - 1][1] - 1 for i in range(1, len(line)) if line[i - 1][1]}
def cmp(a, b, name):
    common = sorted(set(a) & set(b))
    if len(common) < 10: print(name, 'too few common days', len(common)); return
    x = [a[d] for d in common]; y = [b[d] for d in common]
    mx, my = S.mean(x), S.mean(y); cov = sum((p - mx) * (q - my) for p, q in zip(x, y)); c = cov / math.sqrt(sum((p - mx) ** 2 for p in x) * sum((q - my) ** 2 for q in y))
    mad = S.median([abs(p - q) for p, q in zip(x, y)])
    print(f"{name:52s} days {len(common):4d} corr {c:.3f} median abs diff {mad*100:.2f} pts")
    return c
R = {}
# 112 live CMC lines vs research rebuild
for k in ('sol_pump', 'sol_bonk', 'sol_memes', 'sol_ai', 'sol_defi', 'base_memes', 'base_ai', 'base_defi', 'ton_all'):
    R['112_' + k] = cmp(rets(st['cmc'][k]['line']), rets(bk[k]['line']), f"112 live {k} vs research rebuild")
# 113 majors OKX vs research majors (CMC natives)
R['113'] = cmp(rets(st['majors3']), rets(bk['majors']['line']), "113 majors basket OKX (live) vs CMC natives (research)")
# 114 BTC CMC vs OKX
okb = st['majors3_px']['BTC']; R['114'] = cmp(rets(sorted(st['btc'].items())), rets(sorted(okb.items())), "114 BTC: CoinMarketCap vs OKX closes")
mism = [d for d in okb if d in st['btc'] and abs(okb[d] / st['btc'][d] - 1) > 0.01]
print('    BTC days off by >1%:', len(mism), mism[:5])
# 119 SOL/BTC live vs research
sb_live = {d: st['majors3_px']['SOL'][d] / okb[d] for d in st['majors3_px']['SOL'] if d in okb}
sb_res = {d: PX['SOL'][d] / PX['BTC'][d] for d in PX['SOL'] if d in PX['BTC']}
R['119'] = cmp(rets(sorted(sb_live.items())), rets(sorted(sb_res.items())), "119 SOL/BTC: OKX (live) vs CMC (research)")
json.dump(R, open('res_checks1.json', 'w'))
