"""
Stage 1 重跑：7因子 Ridge IC 验证
对比新旧因子的预测力
"""
import pandas as pd, numpy as np
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from scipy.stats import spearmanr

df = pd.read_parquet("data/btc_multidim.parquet")

X_cols = ["ret_5","ret_20","ma_dev","fr_level","fr_chg","taker_pct","taker_dev"]
y_col = "fwd_ret"

data = df[X_cols + [y_col]].dropna()
print(f"样本: {len(data)}, 因子: {X_cols}")

# 滚动IC (30天训练, 1天测试)
window = 30 * 24 * 4
step = 24 * 4

# ── 逐因子 IC ──
print("\n" + "="*50)
print("逐因子 IC")
print("="*50)
for col in X_cols:
    ics = []
    for i in range(0, len(data) - window - step, step):
        train, test = data.iloc[i:i+window], data.iloc[i+window:i+window+step]
        if len(test) < 10: break
        X_tr = StandardScaler().fit_transform(train[[col]])
        X_te = StandardScaler().fit_transform(test[[col]])
        m = Ridge(alpha=1.0).fit(X_tr, train[y_col])
        pred = m.predict(X_te)
        ic, _ = spearmanr(pred, test[y_col])
        if not np.isnan(ic): ics.append(ic)
    mean_ic = np.mean(ics)
    tag = "✅ 新" if col in ["fr_level","fr_chg","taker_pct","taker_dev"] else "  旧"
    status = "✅" if abs(mean_ic) >= 0.02 else "❌"
    print(f"  {col:12s}  IC={mean_ic:+.4f}  {status}  {tag}")

# ── 多因子 Ridge ──
print("\n" + "="*50)
print("多因子 Ridge IC")
print("="*50)
rics, lics_old, lics_new = [], [], []
X_old = ["ret_5","ret_20","ma_dev"]
X_new = ["fr_level","fr_chg","taker_pct","taker_dev"]

for i in range(0, len(data) - window - step, step):
    train, test = data.iloc[i:i+window], data.iloc[i+window:i+window+step]
    if len(test) < 10: break
    
    # All 7
    sc = StandardScaler().fit(train[X_cols])
    m = Ridge(alpha=1.0).fit(sc.transform(train[X_cols]), train[y_col])
    pred = m.predict(sc.transform(test[X_cols]))
    ic, _ = spearmanr(pred, test[y_col])
    if not np.isnan(ic): rics.append(ic)
    
    # Only old
    sc_o = StandardScaler().fit(train[X_old])
    m_o = Ridge(alpha=1.0).fit(sc_o.transform(train[X_old]), train[y_col])
    pred_o = m_o.predict(sc_o.transform(test[X_old]))
    ic_o, _ = spearmanr(pred_o, test[y_col])
    if not np.isnan(ic_o): lics_old.append(ic_o)

print(f"  3个旧因子:  IC={np.mean(lics_old):+.4f}  std={np.std(lics_old):.4f}  IC>0={(np.array(lics_old)>0).mean():.1%}")
print(f"  7个全因子:  IC={np.mean(rics):+.4f}    std={np.std(rics):.4f}    IC>0={(np.array(rics)>0).mean():.1%}")

improvement = np.mean(rics) - np.mean(lics_old)
print(f"\n  提升: {improvement:+.4f}")
