Files
resonance-engine/_analyze_sn.py
T
2026-06-06 19:34:30 +07:00

87 lines
3.5 KiB
Python

"""Analyze inject_sn_battery_results.jsonl."""
import json, statistics
from collections import defaultdict
with open("/mnt/d/Resonance_Engine/sn_battery_results.jsonl") as f:
recs = [json.loads(l) for l in f]
baseline = next(r for r in recs if r.get("event") == "baseline_stats")
CHS = ["stress_xx", "stress_yy", "stress_xy", "asymmetry", "coherence",
"vel_var", "vorticity_mean"]
sigma = {ch: baseline["stats"][ch]["std"] for ch in CHS}
mean_b = {ch: baseline["stats"][ch]["mean"] for ch in CHS}
print(f"=== baseline (n={baseline['n_samples']} samples) ===")
for ch in CHS:
print(f" {ch:18s} mean={mean_b[ch]:+.6f} sigma={sigma[ch]:.6f}")
print()
trials = [r for r in recs if r.get("event") == "trial"]
print(f"=== {len(trials)} trials ===\n")
by_var_signed = defaultdict(lambda: {ch: [] for ch in CHS})
by_var_abs = defaultdict(lambda: {ch: [] for ch in CHS})
for t in trials:
v = t["variable"]
for ch in CHS:
if ch in t["peak_delta_signed"]:
by_var_signed[v][ch].append(t["peak_delta_signed"][ch])
by_var_abs[v][ch].append(t["peak_delta_abs"][ch])
# Per-variable mean S/N
print(f"{'variable':18s} {'n':>3} {'sxy SN':>8} {'sxx SN':>8} {'syy SN':>8} "
f"{'asym SN':>8} {'vort SN':>8} signed-sxy-mean")
print("-" * 100)
VARS = ["mid_price", "signed_flow_usd", "trade_count", "large_print_cnt",
"wallet_entropy", "vwap_drift"]
for v in VARS:
row = by_var_abs[v]
n = len(row["stress_xy"])
sn = lambda ch: statistics.mean(row[ch]) / sigma[ch] if sigma[ch] > 0 else 0
mss = statistics.mean(by_var_signed[v]["stress_xy"])
print(f"{v:18s} {n:>3} {sn('stress_xy'):>8.2f} {sn('stress_xx'):>8.2f} "
f"{sn('stress_yy'):>8.2f} {sn('asymmetry'):>8.2f} "
f"{sn('vorticity_mean'):>8.2f} {mss:+.6f}")
print()
print("=== Does response scale with strength magnitude (per-variable correlation)? ===")
print(f"{'variable':18s} {'corr(|str|, |sxy|)':>22} {'corr(str, signed_sxy)':>26}")
print("-" * 75)
for v in VARS:
rows = [t for t in trials if t["variable"] == v]
if len(rows) < 3:
continue
abs_str = [abs(r["strength"]) for r in rows]
abs_sxy = [r["peak_delta_abs"]["stress_xy"] for r in rows]
signed_str = [r["strength"] for r in rows]
signed_sxy = [r["peak_delta_signed"]["stress_xy"] for r in rows]
def corr(x, y):
n = len(x)
mx = sum(x) / n
my = sum(y) / n
num = sum((x[i] - mx) * (y[i] - my) for i in range(n))
denx = (sum((x[i] - mx) ** 2 for i in range(n))) ** 0.5
deny = (sum((y[i] - my) ** 2 for i in range(n))) ** 0.5
return num / (denx * deny) if denx > 0 and deny > 0 else float("nan")
print(f"{v:18s} {corr(abs_str, abs_sxy):>22.3f} {corr(signed_str, signed_sxy):>26.3f}")
print()
print("=== full trial dump sorted by sxy SN ===")
print(f"{'variable':18s} {'pct':>4} {'strength':>9} "
f"{'sxx Δ':>10} {'syy Δ':>10} {'sxy Δ':>10} {'sxy SN':>8} "
f"{'asym Δ':>9} {'coh Δ':>9}")
print("-" * 105)
ranked = sorted(trials, key=lambda r: -r["peak_delta_abs"]["stress_xy"] / sigma["stress_xy"])
for t in ranked:
sxy_sn = t["peak_delta_abs"]["stress_xy"] / sigma["stress_xy"]
print(f"{t['variable']:18s} {t['percentile']:>4} {t['strength']:>+9.4f} "
f"{t['peak_delta_signed']['stress_xx']:>+10.6f} "
f"{t['peak_delta_signed']['stress_yy']:>+10.6f} "
f"{t['peak_delta_signed']['stress_xy']:>+10.6f} "
f"{sxy_sn:>8.2f} "
f"{t['peak_delta_signed']['asymmetry']:>+9.4f} "
f"{t['peak_delta_signed']['coherence']:>+9.4f}")