246 lines
9.3 KiB
Python
246 lines
9.3 KiB
Python
|
|
"""
|
||
|
|
z1[7] Mechanical Simplification + FLINT 512-bit amplification.
|
||
|
|
|
||
|
|
z1[7] VAE finding:
|
||
|
|
w750_vel_norm r=-0.674 (long-term velocity reversing)
|
||
|
|
w300_vel_norm r=-0.357
|
||
|
|
w50_instability r=+0.421 (short-term chaos spiking)
|
||
|
|
= "eigenspace stress reversal"
|
||
|
|
|
||
|
|
Steps:
|
||
|
|
1. Mechanical proxy: linear combo from correlations
|
||
|
|
2. Different activations
|
||
|
|
3. PCA comparison
|
||
|
|
4. EDAIN-KL + HD 512-dim projection (FLINT)
|
||
|
|
"""
|
||
|
|
import sys, os
|
||
|
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
||
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
||
|
|
sys.path.insert(0, r"C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict")
|
||
|
|
|
||
|
|
import numpy as np
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
HERE = Path(__file__).parent
|
||
|
|
|
||
|
|
WINDOWS = [50, 150, 300, 750]
|
||
|
|
T1_NAMES = []
|
||
|
|
for w in WINDOWS:
|
||
|
|
for f in ['log_lmax', 'vel_norm', 'gap_ratio', 'instability', 'rtp']:
|
||
|
|
T1_NAMES.append(f"w{w}_{f}")
|
||
|
|
|
||
|
|
T0_NAMES = ['bull_pct', 'bear_pct', 'side_pct', 'sin_hour', 'cos_hour', 'sin_day', 'cos_day', 'has_eigen']
|
||
|
|
|
||
|
|
print("Loading corpus...")
|
||
|
|
from corpus_builder import DolphinCorpus, OFF, T1 as T1_DIM
|
||
|
|
corpus = DolphinCorpus.load(str(HERE / 'corpus_cache.npz'))
|
||
|
|
idx = corpus.mask[:, 1]
|
||
|
|
X_e = corpus.X[idx]
|
||
|
|
mask_e = corpus.mask[idx]
|
||
|
|
t1 = X_e[:, OFF[1]:OFF[1]+T1_DIM].copy() # (16607, 20)
|
||
|
|
t0 = X_e[:, OFF[0]:OFF[0]+8].copy()
|
||
|
|
print(f"T1 shape: {t1.shape}")
|
||
|
|
|
||
|
|
# Feature shortcuts
|
||
|
|
vel_w50 = t1[:, 1]
|
||
|
|
vel_w150 = t1[:, 6]
|
||
|
|
vel_w300 = t1[:, 11]
|
||
|
|
vel_w750 = t1[:, 16]
|
||
|
|
inst_w50 = t1[:, 3]
|
||
|
|
inst_w300= t1[:, 13]
|
||
|
|
lmax_w50 = t1[:, 0]
|
||
|
|
lmax_w750= t1[:, 15]
|
||
|
|
|
||
|
|
# ================================================================
|
||
|
|
# 1. MECHANICAL PROXIES
|
||
|
|
# ================================================================
|
||
|
|
print("\n" + "="*65)
|
||
|
|
print("1. MECHANICAL z1[7] PROXIES")
|
||
|
|
print("="*65)
|
||
|
|
|
||
|
|
proxy_A = -0.674*vel_w750 - 0.357*vel_w300 + 0.421*inst_w50
|
||
|
|
proxy_B = inst_w50 - vel_w750
|
||
|
|
proxy_C = vel_w50 - vel_w750
|
||
|
|
proxy_D = inst_w50 * (-vel_w750)
|
||
|
|
proxy_E = (inst_w50 - inst_w300) - (vel_w50 - vel_w750) # instability delta + vel divergence
|
||
|
|
|
||
|
|
for name, p in [
|
||
|
|
('A: linear VAE weights', proxy_A),
|
||
|
|
('B: inst_w50 - vel_w750', proxy_B),
|
||
|
|
('C: vel_w50 - vel_w750 (cross-scale divergence)', proxy_C),
|
||
|
|
('D: inst_w50 * -vel_w750 (interaction)', proxy_D),
|
||
|
|
('E: dinst - dvel (delta-delta)', proxy_E),
|
||
|
|
]:
|
||
|
|
nans = np.isnan(p).sum()
|
||
|
|
pv = p[np.isfinite(p)]
|
||
|
|
print(f"\n{name}:")
|
||
|
|
print(f" std={pv.std():.4f} p5={np.percentile(pv,5):.4f} "
|
||
|
|
f"p50={np.percentile(pv,50):.4f} p95={np.percentile(pv,95):.4f} NaN={nans}")
|
||
|
|
skew = float(((pv - pv.mean())**3).mean() / (pv.std()**3 + 1e-8))
|
||
|
|
kurt = float(((pv - pv.mean())**4).mean() / (pv.std()**4 + 1e-8))
|
||
|
|
print(f" skew={skew:.3f} kurt={kurt:.2f} (>3 = heavy tails = signal potential)")
|
||
|
|
|
||
|
|
# ================================================================
|
||
|
|
# 2. WHAT DOES HIGH proxy_B LOOK LIKE IN FULL T1 SPACE?
|
||
|
|
# ================================================================
|
||
|
|
print("\n" + "="*65)
|
||
|
|
print("2. HIGH vs LOW proxy_B = inst_w50 - vel_w750")
|
||
|
|
print("="*65)
|
||
|
|
p = proxy_B
|
||
|
|
lo = p < np.percentile(p, 10)
|
||
|
|
hi = p > np.percentile(p, 90)
|
||
|
|
print(f"N low={lo.sum()} N high={hi.sum()}")
|
||
|
|
print(f"\n{'Feature':<22} {'ALL':>8} {'LOW10%':>8} {'HIGH10%':>8} {'diff':>8}")
|
||
|
|
for i, name in enumerate(T1_NAMES):
|
||
|
|
a = t1[:, i].mean()
|
||
|
|
l = t1[lo, i].mean()
|
||
|
|
h = t1[hi, i].mean()
|
||
|
|
d = h - l
|
||
|
|
if abs(d) > 0.02:
|
||
|
|
print(f" {name:<20} {a:8.4f} {l:8.4f} {h:8.4f} {d:+8.4f}")
|
||
|
|
print(f"\n T0 context:")
|
||
|
|
for i, name in enumerate(T0_NAMES[:3]):
|
||
|
|
print(f" {name:<20} {t0[:,i].mean():8.3f} {t0[lo,i].mean():8.3f} {t0[hi,i].mean():8.3f} {t0[hi,i].mean()-t0[lo,i].mean():+8.3f}")
|
||
|
|
|
||
|
|
# ================================================================
|
||
|
|
# 3. ACTIVATION FUNCTIONS
|
||
|
|
# ================================================================
|
||
|
|
print("\n" + "="*65)
|
||
|
|
print("3. ACTIVATION FUNCTIONS ON proxy_B")
|
||
|
|
print("="*65)
|
||
|
|
|
||
|
|
def softplus(x):
|
||
|
|
return np.log1p(np.exp(np.clip(x, -30, 30)))
|
||
|
|
|
||
|
|
def sigmoid(x):
|
||
|
|
return 1.0 / (1.0 + np.exp(-np.clip(x, -30, 30)))
|
||
|
|
|
||
|
|
pb_z = (proxy_B - proxy_B.mean()) / (proxy_B.std() + 1e-8)
|
||
|
|
|
||
|
|
for name, act in [
|
||
|
|
('raw z-score', pb_z),
|
||
|
|
('relu', np.maximum(0, pb_z)),
|
||
|
|
('tanh', np.tanh(pb_z)),
|
||
|
|
('softplus', softplus(pb_z)),
|
||
|
|
('sigmoid', sigmoid(pb_z)),
|
||
|
|
('sign*log1p(|x|)', np.sign(pb_z) * np.log1p(np.abs(pb_z))),
|
||
|
|
('x^3 (cubic)', pb_z**3),
|
||
|
|
]:
|
||
|
|
if np.isnan(act).any():
|
||
|
|
print(f" {name:<22} NaN!")
|
||
|
|
continue
|
||
|
|
skew = float(((act - act.mean())**3).mean() / (act.std()**3 + 1e-8))
|
||
|
|
kurt = float(((act - act.mean())**4).mean() / (act.std()**4 + 1e-8))
|
||
|
|
# High kurtosis = heavy tails = outliers preserved = signal in extremes
|
||
|
|
print(f" {name:<22} std={act.std():.4f} skew={skew:+.3f} kurt={kurt:6.1f}")
|
||
|
|
|
||
|
|
# ================================================================
|
||
|
|
# 4. PCA vs VAE
|
||
|
|
# ================================================================
|
||
|
|
print("\n" + "="*65)
|
||
|
|
print("4. PCA ON T1: linear basis vs VAE z1 basis")
|
||
|
|
print("="*65)
|
||
|
|
|
||
|
|
t1_z = (t1 - t1.mean(0)) / (t1.std(0) + 1e-8)
|
||
|
|
U, S, Vt = np.linalg.svd(t1_z, full_matrices=False)
|
||
|
|
explained = S**2 / (S**2).sum()
|
||
|
|
print(f"Explained variance: {np.round(100*explained[:8], 1)}%")
|
||
|
|
for pc_i in range(5):
|
||
|
|
loadings = Vt[pc_i]
|
||
|
|
top3 = np.argsort(np.abs(loadings))[-3:][::-1]
|
||
|
|
pc_scores = t1_z @ Vt[pc_i]
|
||
|
|
r_pb = np.corrcoef(pc_scores, proxy_B)[0,1]
|
||
|
|
print(f"PC{pc_i+1} ({100*explained[pc_i]:.1f}%) r(proxy_B)={r_pb:+.3f}: "
|
||
|
|
+ " ".join(f"{T1_NAMES[j]}={loadings[j]:+.3f}" for j in top3))
|
||
|
|
|
||
|
|
# ================================================================
|
||
|
|
# 5. FLINT EDAIN-KL + HD PROJECTION
|
||
|
|
# ================================================================
|
||
|
|
print("\n" + "="*65)
|
||
|
|
print("5. FLINT: EDAIN-KL + HD PROJECTION 20->512")
|
||
|
|
print("="*65)
|
||
|
|
|
||
|
|
try:
|
||
|
|
from SILOQY_NN_Kernel_COMPLETE6 import MCDAINLayer
|
||
|
|
FLINT_OK = True
|
||
|
|
print("FLINT OK")
|
||
|
|
except ImportError as e:
|
||
|
|
FLINT_OK = False
|
||
|
|
print(f"FLINT import failed: {e}")
|
||
|
|
|
||
|
|
if FLINT_OK:
|
||
|
|
# 5a: MCDAINLayer (no training needed, NaN-safe)
|
||
|
|
print("\n5a: MCDAINLayer normalization:")
|
||
|
|
t1_f32 = t1.astype(np.float32)
|
||
|
|
try:
|
||
|
|
import torch
|
||
|
|
t1_torch = torch.from_numpy(t1_f32)
|
||
|
|
mc = MCDAINLayer(input_dim=20)
|
||
|
|
with torch.no_grad():
|
||
|
|
t1_mc = mc(t1_torch).numpy()
|
||
|
|
mc_std = t1_mc.std(0)
|
||
|
|
print(f" Per-dim std after MCDAIN: {mc_std.round(3)}")
|
||
|
|
print(f" Max std: {mc_std.max():.4f} Min std: {mc_std.min():.4f}")
|
||
|
|
# Proxy_B in MCDAIN space
|
||
|
|
pb_mc = t1_mc[:, 3] - t1_mc[:, 16] # inst_w50 - vel_w750
|
||
|
|
print(f" proxy_B (MCDAIN): std={pb_mc.std():.4f} "
|
||
|
|
f"skew={float(((pb_mc-pb_mc.mean())**3).mean()/(pb_mc.std()**3+1e-8)):.3f} "
|
||
|
|
f"kurt={float(((pb_mc-pb_mc.mean())**4).mean()/(pb_mc.std()**4+1e-8)):.1f}")
|
||
|
|
print(f" Variance ratio MCDAIN/raw: {pb_mc.var()/proxy_B.var():.3f}x")
|
||
|
|
except Exception as ex:
|
||
|
|
print(f" MCDAINLayer: {ex}")
|
||
|
|
|
||
|
|
# 5b: HD projection 20->512 with ReLU
|
||
|
|
print("\n5b: HD projection (20->512, ReLU):")
|
||
|
|
try:
|
||
|
|
np.random.seed(42)
|
||
|
|
W_hd = np.random.randn(20, 512).astype(np.float32) * np.sqrt(2.0/20)
|
||
|
|
t1_n = t1_mc if 't1_mc' in dir() else t1_z.astype(np.float32)
|
||
|
|
H = np.maximum(0, t1_n @ W_hd) # (16607, 512)
|
||
|
|
hd_var = H.var(0)
|
||
|
|
active = (hd_var > 0.01).sum()
|
||
|
|
print(f" Active HD dims (var>0.01): {active}/512")
|
||
|
|
# Which HD dims correlate most with proxy_B?
|
||
|
|
pb_n = (proxy_B - proxy_B.mean()) / (proxy_B.std() + 1e-8)
|
||
|
|
hd_r = np.array([np.corrcoef(pb_n, H[:, d])[0, 1] for d in range(512)])
|
||
|
|
print(f" |r(HD, proxy_B)| > 0.3: {(np.abs(hd_r)>0.3).sum()} dims")
|
||
|
|
print(f" |r(HD, proxy_B)| > 0.5: {(np.abs(hd_r)>0.5).sum()} dims")
|
||
|
|
print(f" max |r|: {np.abs(hd_r).max():.4f}")
|
||
|
|
top5 = np.argsort(np.abs(hd_r))[-5:][::-1]
|
||
|
|
print(f" Top HD dims:")
|
||
|
|
for d in top5:
|
||
|
|
print(f" HD[{d:3d}]: r={hd_r[d]:+.4f} var={hd_var[d]:.4f}")
|
||
|
|
|
||
|
|
# 5c: Can HD space reconstruct proxy_B better than PCA?
|
||
|
|
print("\n5c: Ridge regression HD->proxy_B (R^2 comparison):")
|
||
|
|
from numpy.linalg import lstsq
|
||
|
|
# PCA baseline: PC1 alone
|
||
|
|
pc1_scores = (t1_z @ Vt[0]).reshape(-1, 1)
|
||
|
|
coef_pc1, _, _, _ = lstsq(pc1_scores, proxy_B, rcond=None)
|
||
|
|
pred_pc1 = pc1_scores @ coef_pc1
|
||
|
|
ss_res = ((proxy_B - pred_pc1)**2).sum()
|
||
|
|
ss_tot = ((proxy_B - proxy_B.mean())**2).sum()
|
||
|
|
r2_pc1 = 1 - ss_res/ss_tot
|
||
|
|
print(f" PC1 alone R2={r2_pc1:.4f}")
|
||
|
|
|
||
|
|
# Top 8 PCs
|
||
|
|
pc8 = (t1_z @ Vt[:8].T)
|
||
|
|
coef8, _, _, _ = lstsq(pc8, proxy_B, rcond=None)
|
||
|
|
pred8 = pc8 @ coef8
|
||
|
|
r2_pc8 = 1 - ((proxy_B - pred8)**2).sum()/ss_tot
|
||
|
|
print(f" Top 8 PCs R2={r2_pc8:.4f}")
|
||
|
|
|
||
|
|
# Top 8 HD dims
|
||
|
|
top8_hd = np.argsort(np.abs(hd_r))[-8:]
|
||
|
|
H8 = H[:, top8_hd]
|
||
|
|
coef_hd8, _, _, _ = lstsq(H8, proxy_B, rcond=None)
|
||
|
|
pred_hd8 = H8 @ coef_hd8
|
||
|
|
r2_hd8 = 1 - ((proxy_B - pred_hd8)**2).sum()/ss_tot
|
||
|
|
print(f" Top 8 HD dims R2={r2_hd8:.4f}")
|
||
|
|
print(f" HD/PCA improvement: {r2_hd8/max(r2_pc8, 1e-8):.3f}x")
|
||
|
|
|
||
|
|
except Exception as ex:
|
||
|
|
import traceback; traceback.print_exc()
|
||
|
|
|
||
|
|
print("\nDone.")
|