仓位长官6767价值资金异动
由bq6gp3ee创建,最终由bq6gp3ee 被浏览 3 用户
"""
敏感性:prefactors 里 roe_avg_ttm 恰好为 0、但最近一次公告值非 0 的样本(疑似缺失被填 0),
从 IC 计算中剔除后,RankIC 是否明显变化。只是事后剔除的近似:因子本身仍是含这些行一起中性化的结果。
"""
import json
import numpy as np
import pandas as pd
from scipy import stats
from bigquant import dai
panel = pd.read_parquet("panel_ic.parquet")
panel["date"] = pd.to_datetime(panel["date"])
m = dai.query("""SELECT p.date AS date, p.instrument AS instrument, p.roe_avg_ttm AS pre_roe,
f.roe_avg_ttm AS asof_roe
FROM cn_stock_prefactors p
ASOF JOIN (SELECT \* FROM cn_stock_financial_profitability WHERE shift = 0) f
ON p.instrument = f.instrument AND p.date >= f.date
QUALIFY p.date = max(p.date) OVER (PARTITION BY date_trunc('month', p.date))""",
filters={"date": \["2018-06-01", "2026-10-28"\]}, engine="aistudio").df()
m["date"] = pd.to_datetime(m["date"])
flag = m[(m["pre_roe"] == 0) & m["asof_roe"].notna() & (m["asof_roe"] != 0)][["date", "instrument"]].assign(flag=1)
p = panel.merge(flag, on=["date", "instrument"], how="left")
p["flag"] = p["flag"].fillna(0).astype(int)
def monthly_ic(df):
out = {}
for d, g in df.groupby("date"):
s = g\[\["fac", "fwd_ret"\]\].dropna()
if len(s) > 10:
out\[d\] = stats.spearmanr(s\["fac"\], s\["fwd_ret"\])\[0\]
return pd.Series(out)
ic_all = monthly_ic(p)
ic_clean = monthly_ic(p[p["flag"] == 0])
flagged = p[p["flag"] == 1]
ic_flag = monthly_ic(flagged) if len(flagged) > 0 else pd.Series(dtype=float)
res = {
"n_rows_panel": int(len(p)),
"n_rows_flagged": int(p\["flag"\].sum()),
"share_flagged": float(p\["flag"\].mean()),
"ic_mean_all": float(ic_all.mean()),
"ic_mean_excluding_flagged": float(ic_clean.mean()),
"ic_mean_flagged_only": float(ic_flag.mean()) if len(ic_flag) else None,
"n_months_flagged_only": int(len(ic_flag)),
"flagged_mean_fwd_ret": float(flagged\["fwd_ret"\].mean()) if len(flagged) else None,
"unflagged_mean_fwd_ret": float(p\[p\["flag"\] == 0\]\["fwd_ret"\].mean()),
"note": "事后剔除的近似,未重新做中性化;被剔样本的因子值来自把 0 当作真实 ROE 的合成结果。",
}
print(json.dumps(res, ensure_ascii=False, indent=1))
json.dump(res, open("sens_roe0.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)