跳转至

M10 预测与信息分析

层级:L3 组合管理 | 优先级:★★ | 预计学时:12 小时 对应原书:GK 第 10–13 章;因子 7.1;黑箱第 3 章的混合模型 前置知识:M06 的去极值和正交化;M09 的 IC 与广度。 读书笔记:GK 第 10 章的预测公式 状态:reviewed 数据截至:2026-08|最近复核:2026-10-28


学习目标

  1. 把 α = IC × σ × z 的三个输入放在同一个期限上,并手算期限放错时的差。
  2. 用当月截面的中位数和 MAD 做去极值,正交化之后再标准化。
  3. 手算两条相关信号等权、按 IC 加权和按协方差加权之后的相关系数。
  4. 把持有期 IC 换成扣费后的年化 α,看出月度和季度谁更高取决于换手假设。
  5. 区分「得分的截面相关」和 M07 里两条因子收益的时间序列相关。
  6. 把一条信号的原始值缩放到绝对均值 10,再按只做多截到 [0, 20],并映射成 f/10。

本章知识拓扑图

flowchart TB
    RAW["形成日已经知道的特征"] --> CLIP["当月截面去极值"]
    CLIP --> Z["截面 z,均值 0、标准差 1"]
    Z --> NEU["对行业和市值投影,再标准化"]
    NEU --> MIX["按信号协方差合成"]
    MIX --> ALPHA["α = IC × σ × z,期限一致"]
    ALPHA --> PORT["M12 用 α/σ² 决定主动权重"]
    COST["换手 × 单边成本"] --> ALPHA

M06 回答特征有没有下期的单调差。本章把已经留下来的得分收成每只股票的预期残差收益。收成之前,得分不能用到下期收益。


🟢 入门层:预测要和波动相称

1. 三个输入共用一个期限

Grinold 的 α = IC × σ × z 是截面多股的横比尺子:先把分数收成当天截面的 z,再乘这只股票自己的残差波动。 波动大的名字,同样的 z 代表更大的预期残差,不能按原始分数直接下单。 IC、σ、z 必须是同一个期限。月频 IC 乘年波动,单位就错了。 负 z 在只做多账户里是不持有,空头那一侧的 α 不进净值。

Grinold 与 Kahn 的预测公式是

αᵢ = IC × σᵢ × zᵢ

符号 含义
zᵢ 股票 i 的得分。截面均值 0,标准差 1
σᵢ 同一期限上、残差收益的波动
IC z 和该期限残差收益的相关系数
αᵢ 该期限的预期残差收益

IC 小,是把嘈杂的得分往 0 拉。z = 2 不会被写成「两倍波动」的预期收益,只会写成 2 × IC × σ。这是公式里的收缩,不是另加一个贝叶斯先验。

手算:IC 是和年残差收益的相关,年残差波动 25%,z = 1.5。

α = 0.04 × 0.25 × 1.5 = 0.015

年化预期残差收益是 1.5%。标准正态下,P(Z > 1.5) = 0.0668,大约 6.7% 的右尾。尾部 6.7% 对应的预期也只有 1.5%。若有人把明年的超额写成 30%,反推出来的 IC 是

0.30 / (0.25 × 1.5) = 0.80

0.80 不是第 4 节那种 0.04 附近的得分相关。模型写出 30% 时,先检查期限和 IC,而不是先加杠杆。

2. 月频 IC 不能乘年波动

若 IC = 0.03 是和下个月残差收益的相关,年残差波动 25%,月份独立,则月波动是

σ_月 = 0.25/√12 = 0.0722

α_月 = 0.03 × 0.0722 × 1.5 = 0.00325

乘 12 得到算术年化 3.90%。若误把月频 IC 乘上年波动,

0.03 × 0.25 × 1.5 = 0.01125

会把 3.90% 写成 1.125%。√12 ≈ 3.46,两个结果大约差这个倍数。秩相关(M06 的 Spearman)也不是这个公式里的 IC。动量 Plus 实验室的季频秩相关均值 0.0086 不能直接乘上某只股票的波动。


富途自选里,银行股的市盈率和软件股的 12 个月涨幅会并排出现。两个原始数字不能直接比谁该买。 横截面先收成当天的 z,再乘这只股票自己的残差波动。时序信号则先缩放到平均绝对值 10,那是第 7 节的油门,不是这一节的尺子。 只做多时,负 z 和负的油门都是现金,不是空头。空头腿上的预期残差不要写进账户。

🟡 进阶层:截面处理、合成和持有期

3. 去极值只用当月,正交化之后要再标准化

M06 的五数例子:特征 1, 2, 3, 4, 100,中位数 3,未放缩的 MAD 是 1,界限 [−2, 8],100 被截成 8。界限若用全样本的 1% 和 99% 分位,以后的极端值会改写今天的截断。每个形成日只用当天已经在截面里的股票。

正交化沿用 M06:z = (1, 2, 3, 4) 对 x = (1, 1, 2, 2) 回归,残差是 −0.5, 0.5, −0.5, 0.5。残差的样本标准差是 0.5774,不是 1。再标准化:

(± 0.5) / 0.5774 = ± 0.866

不做这一步,后面的 α 会把 0.5774 当成 1,预期收益大约缩到 58%。中性化去掉的是行业或市值上的线性部分。若收益本来就来自银行低市盈率,中性化会把要下的注先删掉。残差和 x 相关为 0 只说明投影做完了,不说明增量有经济价值。

import pandas as pd


def cross_section_z(raw: pd.DataFrame) -> pd.DataFrame:
    """每个形成日单独做 MAD 和 z。全样本分位数会把以后的极端值写进今天。"""

    def one_month(col: pd.Series) -> pd.Series:
        med = col.median()
        mad = (col - med).abs().median()
        clipped = col.clip(med - 5.0 * mad, med + 5.0 * mad)
        std = clipped.std(ddof=1)
        if std == 0 or pd.isna(std):
            return clipped * 0.0
        return (clipped - clipped.mean()) / std

    return raw.apply(one_month, axis=1)


def forward_month(ret: pd.DataFrame) -> pd.DataFrame:
    # 得分已经落在形成月。shift(-1) 把下一月收益对齐到这个形成月,用来估计 IC。
    # 这和持仓权重必须 shift(1) 不是同一件事。权重不能提前用到下一月。
    return ret.shift(-1)

4. 两条信号相加之前要先看相关

两条标准化得分 s₁, s₂,彼此相关 ρ,与标准化残差收益的相关分别是 IC₁, IC₂。权重 w 合成 g = w₁ s₁ + w₂ s₂ 之后,和收益的相关是

IC(g) = (w′ IC) / √(w′ Σ w), Σ = [[1, ρ], [ρ, 1]]

使这个相关最大的权重满足 w ∝ Σ⁻¹ IC。最大相关等于 √(IC′ Σ⁻¹ IC)。

手算:IC = (0.04, 0.03),ρ = 0.5。

Σ⁻¹ IC = 1/0.75[[0.025], [0.010]] = [[0.0333], [0.0133]]

两条权重都是正的,比例大约 2.5 比 1。

权重 合成后的相关
等权 (1, 1) 0.0404
按 IC 比例 (0.04, 0.03),忽略 ρ 0.0411
Σ⁻¹ IC 0.0416
只用较好的那条 0.0400
按 IC 的信息比率 (0.4, 0.6) 0.0390

按 IC 的信息比率加权,用的是 IC 的时间序列稳定性,不是上面那个使合成相关最大的 Σ⁻¹ IC。教学输入:第一条 IC 的均值 0.04、标准差 0.10,比值 0.40;第二条均值 0.03、标准差 0.05,比值 0.60。权重按 0.4 比 0.6,也就是 (0.4, 0.6)。代回同一条公式,分子是 0.034000,分母是 0.871780,合成相关是 0.039001,四舍五入到 0.0390。它低于等权的 0.0404。更稳的那条 IC 更小,把权重倒向它,合成相关会下降。IC 的信息比率回答「这条 IC 自己稳不稳」,Σ⁻¹ IC 回答「怎样让合成相关最大」。两列不能因为都叫加权就写成同一个数。

import math

import numpy as np


def blend_ic(ic: np.ndarray, rho: float, weights: np.ndarray) -> float:
    cov = np.array([[1.0, rho], [rho, 1.0]])
    return float(weights @ ic) / math.sqrt(float(weights @ cov @ weights))


def gram_schmidt(target: np.ndarray, other: np.ndarray) -> np.ndarray:
    # 去掉能被另一条得分解释的部分。相关变 0,不保证残差 IC 还是原来的数。
    beta = float(target @ other) / float(other @ other)
    return target - beta * other

Gram–Schmidt 把第二条得分里能被第一条解释的部分去掉。M06 已经有一次投影:z = (1, 2, 3, 4) 对 x = (1, 1, 2, 2) 的残差是 −0.5, 0.5, −0.5, 0.5,再除以样本标准差 0.5774,得到 ± 0.866。投影之后两条得分的样本相关是 0,不是原来的 0.5。若残差信号的 IC 仍然是 0.03、第一条仍然是 0.04,正交之后的理论上限是

√(0.04² + 0.03²) = 0.050000

这比相关 0.5 时的 0.0416 高。高出来的部分有一个前提:去掉公共成分之后,残差的 IC 没有变小。这个前提本章没有测量。残差的 IC 若掉到 0,正交化只是删掉一条信号。0.050000 是「IC 原样留下」的代数上限,不是 2009 年或实验室里测到的合成 IC。

等权和最优只差 0.0012。若把两个 IC 直接相加,得到 0.07,是最优相关 0.0416 的 1.68 倍。重复计分指的是这一种:公共部分被加了两次,又没有除以合成得分的标准差。

ρ 升到 0.95 时,最优权重是 (0.1179, −0.0821),较弱的那条信号变成空头。右图红线在右侧翘起,就是这条空头。这要求 0.04 和 0.03 的差距已知且稳定。IC 本身是估计时,这个角落不是把两条价值信号对冲掉的理由。ρ = 0.5 附近,红线和蓝线几乎贴在一起。

左:合成相关随信号相关下降;右侧翘起是做空较弱信号。右:持有期公式下的年化 α,每次调仓单边换手都设为 40%。

DeMiguel, Garlappi & Uppal (2009, RFS 22(5)) 比较的是组合权重:若干数据集上,样本外 1/N 经常不输给用历史均值和协方差优化出来的权重。把这个结论挪到信号权重上,只是类比。本章的数是上表,不是他们的表。信号很少、IC 接近时,等权后再标准化和协方差加权差在第三位小数。

5. 持有期 IC 要配上该期限的波动和换手

下面四个 IC 是和未来 1、3、6、12 个月收益的相关,不是每个月增量收益的相关。年残差波动 25%,月份独立,z = 1。持有 h 个月的波动按 √(h/12) 缩放,算术年化再乘 12/h:

α_年 = ICₕ × 0.25 × √(12/h)

每次调仓的单边换手都设为 40%,不管持有期长短。这是一个偏严的假设:慢信号若更黏,单次换手会低于 40%。单边成本 15 bps 时,年化拖累是 2 × (12/h) × 0.40 × 0.0015。港股在教学里把单边加成 10 bps 印花税,单边 25 bps。印花税的法定税率以 M00 为准。

持有期 IC 毛 α 15 bps 的拖累 净 α 25 bps 的净 α
1 个月 0.05 4.33% 1.44% 2.89% 1.93%
3 个月 0.035 1.75% 0.48% 1.27% 0.95%
6 个月 0.02 0.71% 0.24% 0.47% 0.31%
12 个月 0.01 0.25% 0.12% 0.13% 0.05%

在这组数字里,月度的净 α 仍高于季度。原因是 1 个月的 IC 配上 √12 之后,毛 α 从 4.33% 掉到季度的 1.75%,成本只从 1.44% 降到 0.48%,补不回这个落差。若季度信号每次只换手 10% 而不是 40%,或者这些 IC 只是秩相关,排序会变。表不构成「个人账户应该月度调仓」的指令。

信息半衰期是另一个对象。它问的是:得分放旧一个月,对下一个月收益的 IC 还剩多少。教学衰减取每过一个月减半:刚形成时 0.05,放旧一个月是 0.025,放旧两个月是 0.0125。半衰期就是 1 个月,因为 0.05 × ½ = 0.025。三个月里若一直用同一份旧得分,三个 IC 的平均是 (0.05 + 0.025 + 0.0125) / 3 = 0.029167。这个 0.029167 不是表里的 0.035。表里的 0.035 是和未来三个月收益的相关,而且每次调仓都换上新得分。把半衰期的平均和持有期表相减,得不出「应该改成季度」。两边的 IC 定义不同,换手假设也不同。半衰期只说明旧得分会很快失去对下一月的相关;持有期表说明,在印刷的那四行里,月度净 α 仍然最高。

高波动股票的 α 更大,主动权重却不必更大。IC = 0.03 是年相关,z = 2。

股票 年残差波动 α α/σ²
A 40% 0.03 × 0.40 × 2 = 0.024 0.024/0.16 = 0.15
B 15% 0.03 × 0.15 × 2 = 0.009 0.009/0.0225 = 0.40

α/σ² = (IC × z) / σ。A 的预期残差收益是 B 的 2.7 倍,风险调整后的权重系数只有 B 的 0.375 倍。M12 用的是后一列。


🔴 深入层:筛选、混合和残差

6. 候选名单先过 M08,再进公式

因子 7.1 的顺序是:写下候选、用排序和 IC 筛选、合成预测、留出样本外。筛选的尝试次数仍然记在实验模板里。本章不另设一个 t 值门槛,也不把「夏普大于 1」写回 docs/workflow.md。

黑箱第 3 章把多个 Alpha 加在一起,价值在于低相关的来源,不在于把每个来源的 IC 相加。上表里 0.07 和 0.0416 的差别就是这个意思。条件加权——按市场状态切换信号——会增加尝试次数。状态若是看完收益再划分的,M08 的 m 要把这些划分算进去。

Blitz, Huij & Martens (2011, Journal of Empirical Finance 18(3)) 在计算动量之前先对三因子回归取残差。他们讨论的是总收益动量里的市场和风格暴露。公式里的 σ 用残差波动,得分用残差上的排序,是同一方向的处理。不做的时候,z 里会混进基准。

Gu, Kelly & Xiu (2020, RFS 33(5)) 用一大组公司特征和宏观变量比较机器学习模型。他们的变量重要性讨论集中在价格趋势、流动性和波动这一类。月频上量价类变量更常排在前面,同时衰减也快,所以第 5 节的持有期不能省。

7. 连续预测值的标准化缩放与截断(Carver Forecast Scaling & Capping)

Carver 的尺子服务时序上的多条信号,不是当天的横截面。 每条原始信号先缩放到样本内绝对均值为 10,平均大小的多头是 +10,允许的极端是 20,再截断。 只做多账户把负数再截到 [0, 20],f/10 是油门:10 是一倍平均仓,20 是两倍平均仓。 两倍是信号层的倍数。账户层权重仍非负,一行的和不超过 1,放大上限也是 1。

第 1 节的 z 是形成日截面上的标准差。Carver 的 Systematic Trading(2015)用的是同一条信号自己的时间序列。趋势、利差、回归残差的原始值 s_(i,t) 不在同一个数量级上,直接平均会让数字大的那条盖过其余。个人系统化交易先算样本内绝对均值

MAV = E[|s|]

再乘缩放系数 k = 10/MAV,令 f = ks。这样样本内 E[|f|] = 10。预测 +10 是平均大小的多头,−10 是平均大小的空头,± 20 是平均的两倍,也是允许的极端。先缩放,再截断到 [−20, +20]。截断之后绝对均值会低于 10,不再回头重算 k。重算会把截断刚刚压住的极端值又放大。

本仓库的账户只做多。对称区间里的负数不表示可以卖空,而是把预测再截到 [0, +20]:负信号的目标仓位是 0,现金留着。映射到目标仓位比例用 fᵢ/10。f = 10 对应 1 倍平均仓,f = 20 对应 2 倍平均仓。2 倍是信号层的倍数。账户层仍要求权重非负、一行权重的和不大于 1,target_volatility_scale 的放大上限也是 1。f/10 = 2 不能写成两倍净值的杠杆。

手算用四期已经能看见的原始信号 2, −4, 12, −2。这四期就是教学样本,不把样本外的原始值算进绝对均值。

MAV = (2 + 4 + 12 + 2) / 4 = 5, k = 10/5 = 2

缩放后是 4, −8, 24, −4。24 越过 20,对称截断得到 4, −8, 20, −4。绝对均值变成

(4 + 8 + 20 + 4) / 4 = 9

只做多再把负数截成 0,得到 4, 0, 20, 0。绝对均值进一步变成 (4 + 0 + 20 + 0) / 4 = 6。仓位比例是

4/10 = 0.4, 0, 20/10 = 2.0, 0

0.4 是平均仓的四成。2.0 是截断允许的最大倍数。负的那两期在只做多账户里不建仓。

import numpy as np


def scale_forecast(raw: np.ndarray, center: float = 10.0, cap: float = 20.0):
    """先按绝对均值缩放到 center,再截断。只做多账户把负预测截成 0,不解释成空头。"""
    mav = float(np.mean(np.abs(raw)))
    scale = center / mav
    scaled = raw * scale
    symmetric = np.clip(scaled, -cap, cap)
    long_only = np.clip(symmetric, 0.0, cap)
    return mav, scale, symmetric, long_only


raw = np.array([2.0, -4.0, 12.0, -2.0])
mav, scale, symmetric, long_only = scale_forecast(raw)
position = long_only / 10.0
print("forecast_mav", f"{mav:.10f}")
print("forecast_k", f"{scale:.10f}")
print("forecast_symmetric", " ".join(f"{value:.10f}" for value in symmetric))
print("forecast_long_only", " ".join(f"{value:.10f}" for value in long_only))
print("forecast_position", " ".join(f"{value:.10f}" for value in position))
print("forecast_abs_after_cap", f"{float(np.mean(np.abs(symmetric))):.10f}")
print("forecast_abs_long_only", f"{float(np.mean(np.abs(long_only))):.10f}")

真实案例

案例 1:把 30% 的预测收成 IC

1.5% 和 0.80 是第 1 节的同一条公式。2020–2021 年不少叙事把个别成长股的「预期超额」写成远高于残差波动乘一个很小的 IC。本章不引用某只基金的收益率。能核对的是反推:年波动 25%、z = 1.5 时,30% 的 α 要求 IC = 0.80。M09 里 IC = 0.05、每年 12 个独立赌注的信息比率上界只有 0.17。0.80 和 0.05 不是同一类数。个人账户先把预测写成三个输入,再决定要不要交易。

案例 2:2009 年春天的原始动量得分

M06 的市值加权十分位高减低,2009-03 是 −39.19%,2009-04 是 −45.18%。那条排序用的是总收益,空头腿是过去的输家。反弹里输家涨得更多时,原始 z 的空头不是残差空头。α = IC × σ × z 若把 σ 取成总波动、把 z 取成总收益得分,就把基准暴露写进了「纯 α」。Blitz 等人的残差动量是针对这种混合。本章没有一条残差动量在 2009 年 4 月的替代跌幅。已知的事实是:总收益得分和残差得分不是同一个 z。

案例 3:因子收益的负相关,还不是得分的负相关

M07 里,1963-07 至 2026-08,HML 与 Mom 的收益相关是 −0.190。各持一半的夏普是 0.66,高于两条各自的 0.34 和 0.49,年化只有 5.34%。Asness, Moskowitz & Pedersen (2013, JF 68(3)) 讨论的是价值和动量在多类资产上的负相关。−0.190 是这两列 French 收益的时间序列相关,不是同一天截面上两个得分的 ρ。

第 4 节的公式要的是得分相关。收益相关为负,说明两条研究组合放在一起能降波动。它不自动说明把两个 z 等权相加会得到 IC 0.055。后一个数要另测截面相关。测的时候,相关只用形成日的得分,不能用下期收益来决定 ρ。


方法论来源

概念 / 模型 核心文献或规范出处
预期公式 α = IC × σ × z,三个输入同一期限
1/N DeMiguel, Garlappi & Uppal (2009), RFS 22(5)。他们比的是资产权重
残差动量 Blitz, Huij & Martens (2011), Journal of Empirical Finance 18(3)
特征重要性 Gu, Kelly & Xiu (2020), RFS 33(5)。样本外 R² 沿用 M16 的表
价值与动量 Asness, Moskowitz & Pedersen (2013), JF 68(3)
预测缩放与截断 Robert Carver, Systematic Trading(2015)。绝对均值缩到 10,再截到 ± 20;只做多再截到 [0, 20]
图 figures/M10/plot_alpha_forecast.py

💡 思考回顾与巩固

核心认知纠偏

误区 反例 用法
月频 IC = 0.03 乘上年波动 25%,就是年化 α 对齐期限后算术年化是 3.90%。错乘得到 1.125% 三个输入同一个期限
z = 1.5 大约在前 7%,所以 α 应该很大 右尾概率 6.68%,配套的年化 α 是 1.5% 先乘 IC
全样本 1% 分位更稳健 分位用了以后的极端值 只用当月截面的 MAD
正交化残差可以直接当 z 样本标准差是 0.5774,标准化后才是 ±0.866 投影之后再除标准差
两个 IC 相加就是合成 IC 0.04 与 0.03、ρ = 0.5 时,最优相关是 0.0416,不是 0.07 除以合成得分的波动
协方差加权总是明显更好 同一例子里等权是 0.0404,最优是 0.0416 IC 接近时差别在第三位
图右侧红线上升,说明高度相关的信号更值得优化 ρ = 0.95 时较弱信号的权重为负 估计误差下不要做这条空头
高 α 的股票应配更大的权重 A 的 α 是 2.4%,α/σ² 只有 0.15;B 是 0.40 权重看 α/σ²
HML 和 Mom 的收益相关 −0.19 就是两个 z 的 ρ 一个是时间序列,一个是截面 公式里写明是哪一个
实验室秩相关 0.0086 可以乘波动得到 α 它是季频 Spearman,而且股票池有幸存者 不代入预测公式
把截面 z 乘 10 就是 Carver 的预测 z 的标准差是 1。Carver 的 10 是时间序列绝对均值 两套尺度分开用
截断之后绝对均值仍是 10 四期例子对称截断后是 9,只做多后是 6 k 在截断之前算
f/10 = 2 就可以把账户加到两倍 放大上限是 1,一行权重的和不能超过 1 2 是平均仓的倍数

费曼自测

  1. 为什么预测公式里乘 IC 可以叫收缩,但又不是一个带先验方差的贝叶斯公式?
  2. 等权合成的相关只有 0.0404。把两个 z 相加却不除标准差,组合构建会多算什么?
  3. 右图月度净 α 高于季度。把「每次换手都是 40%」拿掉之后,这个排序还在吗?
  4. 行业中性化之后 IC 下降,什么时候是删掉了重复,什么时候是删掉了你要的配置?
自测要点 1. 乘 IC 把 z 拉向 0,因为 IC 远小于 1。完整的贝叶斯更新还要写先验方差和信号方差。这里没有那两项,只有「相关 × 波动 × 标准化得分」。期限不一致时,收缩的倍数是错的,1.125% 和 3.90% 就是这个错。 2. 相加不标准化,相当于把 IC 当成 0.07 而不是 0.0416,预期收益大约放大 1.68 倍。公共部分在两条价值信号里被算了两次。M12 会把这个放大的 α 放进优化,误差最大化跟着变大。 3. 不在。4.33% 对 1.75% 用的是给定的持有期 IC,再假设每次调仓都换掉净值的 40%。慢信号若更黏,季度的拖累会低于 0.48%,月度优势会缩小。表只在这组假设下月度更高。 4. 低市盈率若只是「银行」的另一个名字,中性化删的是重复。若策略的收益来源就是行业配置,中性化删的是要下的注。两种情况 IC 都会下降。区别要在看收益之前写在假设里。

四维习题

A. 概念题

  1. 写出预测公式,并说明 IC、σ、z 必须对齐的是哪一个期限。
  2. 为什么去极值的分位数不能用全样本?正交化之后为什么还要标准化?
  3. 等权信号合成和 DeMiguel 等人的 1/N 是同一张表吗?
  4. 残差动量处理的是得分里的哪一种混合?

B. 计算题

  1. IC 与年残差相关,波动 25%,z = 1.5。计算 α。若预测写成 30%,反推 IC。P(Z > 1.5) 是多少?
  2. 月频 IC = 0.03,年波动 25%,z = 1.5。计算对齐期限的月 α 和乘 12 的算术年化,以及误用年波动得到的数。
  3. IC = (0.04, 0.03),ρ = 0.5。等权、按 IC 加权、最优加权的合成相关各是多少?0.07 是最优值的多少倍?
  4. 用第 5 节的表,比较月度和季度在 15 bps 与 25 bps 下的净 α。A、B 两只股票的 α/σ² 谁更大?
  5. 四期原始信号 2, −4, 12, −2。计算绝对均值、k、对称截断、只做多截断,以及 f/10。截断之后的绝对均值为什么不再是 10?

C. 编程实战题

  1. 运行 figures/M10/plot_alpha_forecast.py,核对合成相关 0.0404、0.0411、0.0416,以及月度毛 α 4.33%、拖累 1.44%。
  2. 把残差 −0.5, 0.5, −0.5, 0.5 的样本标准差打出来,确认再标准化得到 ± 0.866。
  3. 写一个只用当月截面的 z 分数函数。估计 IC 时,下一月收益用 shift(-1) 对齐到形成月,并在注释里说明持仓权重为什么仍要 shift(1)。

D. 个人实战思考题

  1. 你只有价值得分和动量得分,持仓 15 到 25 只,只做多。协方差加权相对等权的 0.0012,和印花税、杠杆上限比,哪一项先绑定?
  2. 一个主观规则是「业绩会连续超预期的公司再拿一个季度」。把它写成信号时,持有期 IC 和换手要先定哪两个数,才能用第 5 节的表?
  3. 实验记录里的 α 若来自这条公式,应该附上哪四个输入,才不会把秩相关或因子收益相关误代进去?
完整参考答案与解析 **A1.** αᵢ = IC × σᵢ × zᵢ。IC 是 z 和该期限残差收益的相关,σ 是同一期限的残差波动,α 就是该期限的预期残差收益。年化时要写明是乘 12/h 的算术年化,还是输入本身已经是年。月频 IC 对年波动是错位。 **A2.** 全样本分位数用到了形成日之后的极端值,截断界限含有未来。当月 MAD 只用当天截面。正交化残差的样本标准差是 0.5774,不除它,z 的尺度就不是 1,α 会缩到大约 58%。 **A3.** 不是。DeMiguel 等人的 1/N 是资产权重在样本外的表现。信号等权是类比。本章能核对的是 ρ = 0.5 时 0.0404 和 0.0416 的差。 **A4.** 总收益动量的得分里混着市场和风格。残差动量先对三因子取残差,再排序。2009 年 3 月和 4 月的 −39.19% 与 −45.18% 是总收益十分位,不是残差动量的替代数。 **B5.** α = 0.015。30% 对应的 IC 是 0.80。P(Z > 1.5) = 0.0668。 **B6.** 月波动 0.0722,月 α = 0.00325,乘 12 为 3.90%。误乘年波动得到 0.01125,脚本按五位小数打印同一数。 **B7.** 等权 0.0404,按 IC 比例 0.0411,最优 0.0416。0.07/0.0416 = 1.68。最优权重约为 (0.0333, 0.0133),都是正的。按 IC 信息比率 (0.4, 0.6) 得到 0.0390,低于等权。正交且 IC 不变时的代数上限是 0.050000,残差 IC 没有测量。 **B8.** 15 bps:月度净 α 2.89%,季度 1.27%。25 bps:1.93% 和 0.95%。在「每次单边换手都是 40%」的假设下,月度更高。A 的 α/σ² = 0.15,B 是 0.40,B 的风险调整权重更大。 **B9.** 绝对均值 (2 + 4 + 12 + 2) / 4 = 5,k = 2。缩放后 4, −8, 24, −4。对称截断 4, −8, 20, −4,绝对均值 9。只做多 4, 0, 20, 0,绝对均值 6。仓位比例 0.4, 0, 2.0, 0。k 在截断之前就定死,截断会削掉极端值,绝对均值因此低于 10。 **C10–C12.** 与 `figures/M10/plot_alpha_forecast.py` 同一契约。合成相关就是 0.0404、0.0411、0.0416。月度毛 α 0.0433,15 bps 拖累 0.0144,净 0.0289;25 bps 时净 0.0193。残差样本标准差 0.5774,± 0.5/0.5774 = ± 0.866。右图是公式,不是回测。红线在高相关处上升,对应较弱信号的权重变负。
import pandas as pd


def cross_section_z(raw: pd.DataFrame) -> pd.DataFrame:
    # 当月截面的 MAD。不用全样本分位数,避免以后的极端值进入今天的界限。
    def one_month(col: pd.Series) -> pd.Series:
        med = col.median()
        mad = (col - med).abs().median()
        clipped = col.clip(med - 5.0 * mad, med + 5.0 * mad)
        std = clipped.std(ddof=1)
        if std == 0 or pd.isna(std):
            return clipped * 0.0
        return (clipped - clipped.mean()) / std

    return raw.apply(one_month, axis=1)
持仓权重仍要对信号 `shift(1)`:形成月收盘才知道的得分,最早在下一期成交。`shift(-1)` 只用于把已经发生的下一月收益对齐回来估计 IC,不能进下单。 **D13.** 先绑定的是印花税和杠杆上限,以及 M09 里独立赌注可能只有每年 12 个。0.0012 的相关差距,要在得分相关被测准、而且两条信号不是同一主题时才值得做。只做多还会改写实际权重,转移系数用持仓和得分的相关去算。15 到 25 只股票上,协方差矩阵比第 4 节的两行更不稳定。 **D14.** 先定持有期是一个季度还是更短,以及每次调仓的单边换手是不是仍接近 40%。然后才有第 5 节那种「IC 对应该期限收益、波动按 √(h/12)、成本按换手」的净 α。超预期要用公告日已经公布的数字。预期若用了持有期结束之后才更新的一致预期,IC 估计含有前视。 **D15.** 四个输入是:期限、该期限的 IC(写明是 Pearson 还是秩相关)、同一期限的残差波动、形成日截面上的 z。因子收益的时间序列相关、实验室的 0.0086,都不填进 IC 这一格。合成时再附上得分之间的 ρ,以及权重是等权还是 Σ⁻¹ IC。

📌 章节知识总结

一句话核心洞察

  1. α = IC × σ × z 的三个输入共用一个期限。月频 IC 0.03、z = 1.5、年波动 25% 时,对齐后的算术年化是 3.90%,错乘年波动得到 1.125%。
  2. 年 IC 0.04、年波动 25%、z = 1.5 的 α 是 1.5%。写成 30% 等于把 IC 写成 0.80。
  3. 两条 IC 为 0.04 和 0.03、相关 0.5 的信号,最优合成相关是 0.0416。把 IC 相加得到的 0.07 大约是它的 1.68 倍。
  4. 在每次单边换手都是 40% 的假设下,1 个月持有期的净 α 高于 3 个月。换手假设变了,排序可以变。
  5. 权重看 α/σ²。波动 40% 的股票 α 更大,风险调整后的系数却更小。
  6. 原始信号 2, −4, 12, −2 的绝对均值是 5,k = 2。只做多截断后是 4, 0, 20, 0,仓位比例是 0.4, 0, 2.0, 0。

公式与样本

对象 表达式或数值 前提
预测 IC × σ × z 三者同一期限
对齐的月频例子 月 α 0.325%,乘 12 为 3.90% 月 IC 0.03,年波动 25%,z = 1.5
错乘 1.125% 月 IC 乘了年波动
年化例子 1.5% 年 IC 0.04,z = 1.5,右尾 6.68%
30% 的反推 IC = 0.80 同上波动和 z
去极值 中位数 ± 5 × MAD 当月截面;100 截成 8
再标准化 ± 0.5/0.5774 = ± 0.866 M06 的四点残差
合成相关 w′ IC / √(w′ Σ w) ρ = 0.5 时最优 0.0416;IC 信息比率权重得 0.0390
正交上限 √(0.04² + 0.03²) = 0.050000 仅当残差 IC 仍是 0.03;本章未测
半衰期 0.05、0.025、0.0125 每月减半;三月平均 0.029167,不是持有期表的 0.035
持有期年化 ICₕ × 0.25 × √(12/h) 月份独立;z = 1
月度净 α 2.89%(15 bps),1.93%(25 bps) 每次单边换手 40%
收益相关 HML 与 Mom 为 −0.190 不是得分的 ρ
预测缩放 k = 10/MAV 四期例子 MAV = 5,k = 2;对称截断后绝对均值 9
只做多预测 4, 0, 20, 0 负数截成 0;仓位比例 0.4, 0, 2.0, 0

跨模块

结论 交给 位置
当月 MAD 和正交化 增量而不是重复 M06
IC 不是每年 6000 个独立赌注 信息比率上界 M09
尝试次数含放弃的合成方式 状态切换也要计数 M08,../../../docs/workflow.md
α/σ² 主动权重 M12
f/10 与 [0, 20] 只做多预测的仓位倍数 M12 的非负合同
残差波动和因子暴露 风险模型 M11
印花税在 α 之外 换手拖累 M00,后面的 M13
2009-03、2009-04 的十分位 总收益得分不是残差得分 M06

学习指引

概念卡片:信息系数与 ICIR

  • 精读:GK 第 10 章的预测公式和第 13 章的信息期限。第 12 章的信息分析用 IC 时间序列和分组单调性,不要求安装额外的报告库。
  • 对照:合成相关和持有期净 α 以本章脚本为准。HML 与 Mom 的 −0.190 以 M07 为准,不写成得分相关。
  • 项目:研究笔记里的 α 要附期限、IC 的定义、残差波动和形成日的 z。不把 0.0086 的秩相关代进公式。
  • 下一步:M11 把残差波动和因子暴露写成风险。本章的 σ 是那张表里的对角线,不是总波动。

自检清单

  • 能手算年化 α = 1.5%,以及 30% 对应的 IC = 0.80
  • 能把月频 IC 0.03 对齐成算术年化 3.90%,并说出错乘得到的 1.125%
  • 能把正交化残差再标准化成 ±0.866
  • 能复述 ρ = 0.5 时的三个合成相关:0.0404、0.0411、0.0416
  • 能说明月度净 α 高于季度,依赖「每次单边换手 40%」
  • 能把 A 的 α/σ² = 0.15 和 B 的 0.40 放在权重而不是 α 的大小上
  • 能把 2, −4, 12, −2 缩成只做多预测 4, 0, 20, 0,并映射成 0.4, 0, 2.0, 0