import pandas as pd, numpy as np, glob from scipy import stats arm_a = pd.read_parquet('/mnt/d/Resonance_Engine/traj/tension_20260607T130445/arm_A_no_inject.parquet') arm_t = pd.read_parquet('/mnt/d/Resonance_Engine/traj/tension_20260607T130445/arm_T_tension.parquet') files = sorted(glob.glob('/mnt/d/PaperTrader/research/hl_data/minutes/202604*/*.parquet')) pdf = pd.concat([pd.read_parquet(f) for f in files], ignore_index=True) pdf = pdf[pdf.coin=='BTC'].sort_values('minute').reset_index(drop=True) pdf['fwd_60'] = (pdf['mid_price'].shift(-60)/pdf['mid_price']-1)*10000 pdf['sign_60'] = pdf['fwd_60'].apply(lambda x: 1 if x>0 else -1) for label, arm in [('ARM_A_freerun', arm_a), ('ARM_T_driven', arm_t)]: arm = arm.copy().sort_values('minute').reset_index(drop=True) arm['asym_d240'] = arm['asymmetry'].diff(240) arm['coh_d240'] = arm['coherence'].diff(240) arm['vel_d60'] = arm['vel_max'].diff(60) merged = arm.merge(pdf[['minute','fwd_60','sign_60']], on='minute', how='inner') merged = merged.dropna(subset=['asym_d240','fwd_60']) n = len(merged) test = merged.iloc[int(n*0.7):] for feat in ['asym_d240','coh_d240','vel_d60']: if feat not in test.columns: continue t2 = test.dropna(subset=[feat]) pred = t2[feat].apply(lambda x: 1 if x>0 else -1) acc = (pred == t2['sign_60']).mean() r, p = stats.spearmanr(t2[feat], t2['fwd_60']) print(f'{label} {feat}: dacc={acc*100:.1f}% r={r:+.4f} p={p:.2e} n={len(t2)}') print()