Files
resonance-engine/arm_ab_check.py
T
2026-06-08 06:34:31 +07:00

30 lines
1.5 KiB
Python

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()