仓位长官6767价值资金异动

由bq6gp3ee创建,最终由bq6gp3ee 被浏览 1 用户

"""

敏感性: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)

{link}