多因子研究统计指标与实现 SOP

生成时间:2026-09-13 15:49:34;适用数据:股票-日期面板 (i,t),因子在 t 日可得,收益在未来取得。

总原则:因子暴露必须使用 t 日及以前的信息,预测收益必须从 t+1 开始。严禁未来函数(look-ahead bias)。所有指标先在每个日期做横截面计算,再沿时间聚合。日频结果要考虑自相关、异方差、交易成本和多重检验。

1. 统一符号和数据准备

符号定义
i, t股票和形成日;横截面股票数为 N_t。
x_{i,t}t 日收盘后可获得的因子暴露,例如 vol_30、ivo_60。
r_{i,t+h}从 t+1 到 t+h 的未来累计收益。简单收益为 P_{i,t+h}/P_{i,t}-1;若每日收益为 r_d,则累计收益为 prod(1+r_d)-1。
x^w横截面 winsorize 后的因子,例如按 1% 和 99% 分位数截尾。
z_{i,t}横截面标准化:(x_{i,t}-mean_t(x))/sd_t(x)。
# pandas 伪代码:先构造未来收益,再对齐因子
df = df.sort_values(["instrument", "datetime"])
df["ret_1d_fwd"] = df.groupby("instrument")["close"].shift(-1) / df["close"] - 1
# 绝不能使用当前日之后才知道的值作为当前因子
df["factor_lag"] = df.groupby("instrument")["factor"].shift(1)  # 仅当原 factor 在收盘后形成时需要

2. IC、Rank IC、ICIR 和 IC 胜率

2.1 截面 IC

每个形成日 t,在股票横截面计算因子和未来收益的相关系数:

IC_t = Corr_i(x_{i,t}, r_{i,t+h})。

通常使用 Pearson 相关。样本估计量为:

IC_t = sum_i[(x_i-xbar)(r_i-rbar)] / sqrt(sum_i(x_i-xbar)^2 sum_i(r_i-rbar)^2)。

它衡量线性预测关系;IC=0 不代表不存在非线性关系。

2.2 Rank IC

先把因子和收益替换为横截面排名:

RankIC_t = Corr_i(rank(x_{i,t}), rank(r_{i,t+h}))。

Rank IC 等价于 Spearman 秩相关,衡量单调关系,对极端值比 Pearson 更稳健。因子研究中通常优先报告 Rank IC。

2.3 平均 IC、IC 标准差和 ICIR

设有效形成日共有 T 个:

meanIC = (1/T) sum_t IC_t

sdIC = sqrt[sum_t(IC_t-meanIC)^2/(T-1)]

ICIR = meanIC / sdIC。

ICIR 是 IC 的信噪比,不是收益 Sharpe。若把 IC 按独立同分布近似,t(meanIC) = meanIC/(sdIC/sqrt(T)) = ICIR*sqrt(T);但日频 IC 往往自相关,推断应使用 HAC/Newey-West 标准误。

2.4 IC 胜率

IC Hit Rate = (1/T) sum_t 1(IC_t > 0)。

也可以定义为有效期中 IC 与理论方向一致的比例。胜率高但 IC 很小,仍不代表经济价值高;必须和 mean IC、ICIR 一起看。

2.5 IC 的实现

def daily_ic(g, factor, future_return):
    x, y = g[factor], g[future_return]
    return x.corr(y, method="spearman")  # Rank IC

ic = df.dropna(subset=["factor", "ret_20d_fwd"]).groupby("datetime").apply(
    daily_ic, factor="factor", future_return="ret_20d_fwd"
)
mean_ic = ic.mean()
sd_ic = ic.std(ddof=1)
icir = mean_ic / sd_ic
hit_rate = (ic > 0).mean()

3. 分组组合和单调性

每个 t 按因子分为 K 组。第 k 组未来收益为:

R_{k,t} = sum_{i in k} w_{i,t} r_{i,t+h},其中等权 w=1/n_{k,t};市值加权为形成日市值除以组内市值总和。

多空收益通常定义为:

R_{H-L,t} = R_{K,t} - R_{1,t}。

统计量包括平均收益 mean(R)、年化收益、年化波动率、Sharpe、t 值和最大回撤。年化因子为 A=252(日频)或 12(月频):

Annualized Return ≈ A * mean(R);Annualized Vol = sqrt(A)*sd(R);Sharpe = sqrt(A)*mean(R)/sd(R)。

严格的复合年化收益为 (prod(1+R_t))^(A/T)-1,日频高波动时优先使用复合定义。

单调性不应只看最高组减最低组,还应检查组均值随因子排序是否近似单调,可报告相邻组差异和组号回归:

R_{k,t} = a_t + b * k + error。b 的时间平均及其 HAC t 值衡量组合收益的排序趋势。

4. Fama-MacBeth 横截面回归

第一步,对每个 t 做横截面回归:

r_{i,t+h} = a_t + lambda_{1,t} z_{1,i,t} + ... + lambda_{K,t} z_{K,i,t} + epsilon_{i,t+h}。

第二步,对每个风险价格取时间平均:

lambda_bar_k = (1/T) sum_t lambda_{k,t}。

经典标准误为 sd(lambda_{k,t})/sqrt(T);因 lambda_{k,t} 可能自相关,建议对其时间序列使用 Newey-West HAC 标准误和 t 值:

t_k = lambda_bar_k / SE_HAC(lambda_bar_k)。

应依次报告单因子、同类因子联合、经典因子控制和完整模型。加入多个高度相关的 30/60/120 日指标后,系数可能因多重共线性变得不稳定。

# 概念实现
for date, g in df.groupby("datetime"):
    X = sm.add_constant(g[["z_vol", "z_ivo", "z_mdd"]])
    y = g["ret_20d_fwd"]
    lambda_t[date] = sm.OLS(y, X, missing="drop").fit().params
mean_lambda = lambda_t.mean()
nw_result = sm.OLS(lambda_t["z_vol"], np.ones(len(lambda_t))).fit(
).get_robustcov_results(cov_type="HAC", maxlags=5)

5. 时间序列 alpha 和因子暴露

先构造因子多空组合收益 R^p_t,再回归:

R^p_t = alpha + beta' F_t + epsilon_t。

F_t 可以包含市场超额收益、SMB、HML、RMW、CMA、Momentum、Liquidity 等。

alpha 是控制这些共同因子后的平均异常收益。报告 alpha、年化 alpha、beta、R²、HAC 标准误和 t 值。alpha 消失,说明组合收益可能只是已有风险暴露;alpha 仍显著,才有增量解释的证据。

6. 风险、交易和容量统计

指标严格定义解释
最大回撤DD_t = V_t/max_{s≤t}V_s - 1;MaxDD=min_t DD_t。从历史峰值到之后低点的最大跌幅。
换手率常用定义:Turnover_t = 0.5 * sum_i |w_{i,t}^{new}-w_{i,t}^{old}|。半换手定义下,调仓买卖一侧的交易比例。
交易成本后收益R_net,t = R_gross,t - c * Turnover_t;更细致时按股票使用 bid-ask、冲击和佣金。判断信号是否可交易。
最大损失日min_t R_t。识别尾部风险;可补充 VaR 和 Expected Shortfall。
容量根据 ADV、参与率、冲击成本估算可交易资金;例如单股交易额不超过过去平均成交额的固定比例。避免回测收益依赖不可实现的成交。

7. 因子冗余、多重共线性和增量价值

同时计算暴露相关性 Corr_i(x^a_{i,t},x^b_{i,t}) 和因子组合收益相关性 Corr_t(R^a_t,R^b_t)。二者含义不同,不可互相替代。

VIF 定义为:

VIF_j = 1/(1-R_j^2),其中 R_j^2 是用其他解释变量回归第 j 个因子的决定系数。VIF 越大,系数方差膨胀越严重;常见提示线为 5 或 10,但不是定理。

增量价值可用 spanning regression:

R^new_t = alpha + beta' R^{old}_t + epsilon_t。

检验 alpha=0。也可比较加入新因子前后的 OOS R²、组合 Sharpe、最大回撤和成本后收益。

8. 稳健性、样本外和多重检验

样本外预测可报告:

OOS R² = 1 - sum_t(r_t-rhat_t)^2 / sum_t(r_t-rbar_train)^2。

OOS R² 为负并不一定说明因子完全无效,但表示相对于训练期均值基准没有改善预测。

9. 推荐的最小研究输出表

表必须包含
因子描述统计均值、标准差、分位数、缺失率、横截面和时间序列样本数。
IC 表预测期、mean IC、sd IC、ICIR、IC 胜率、HAC t 值。
分组收益表各分位组收益、H-L、年化收益、波动率、Sharpe、t 值。
Fama-MacBeth 表单因子、同类联合、经典控制、完整模型的平均 lambda、HAC t 值。
时间序列表CAPM/FF3/FF5 alpha、beta、HAC t 值、R²。
可交易性表换手率、交易成本前后收益、最大回撤、容量近似。
稳健性表时间段、股票池、分组、持有期、权重和样本外结果。

10. 最小执行顺序

  1. 审计股票-日期唯一性、日期范围、缺失值、停牌、新股和收益定义。
  2. 用 t 日因子构造 t+1、t+5、t+10、t+20、t+60 未来收益。
  3. 做横截面 winsorize/rank,并记录规则。
  4. 计算 Pearson IC、Rank IC、ICIR 和 IC 胜率。
  5. 做 5 分位和 10 分位组合,计算 H-L、风险、换手和成本后收益。
  6. 做 Fama-MacBeth,并使用 HAC 推断。
  7. 对多空组合做 CAPM、FF5 和增量 alpha 回归。
  8. 检查相关性、VIF、spanning、分阶段和样本外结果。
  9. 在预先固定的规则下汇总结论,不因结果显著与否临时更改方法。

注:公式中的日历年化因子应与实际收益频率一致;A 股交易日通常取 252,但最终应按样本实际交易日历核对。所有 t 值都应明确标准误类型。