M10 预测与信息分析¶
层级:L3 组合管理 | 优先级:★★ | 预计学时:12 小时 对应原书:GK 第 10–13 章;因子 7.1;黑箱第 3 章的混合模型 前置知识:M06 的去极值和正交化;M09 的 IC 与广度。 读书笔记:GK 第 10 章的预测公式 状态:reviewed 数据截至:2026-08|最近复核:2026-10-28
学习目标¶
- 把 α = IC × σ × z 的三个输入放在同一个期限上,并手算期限放错时的差。
- 用当月截面的中位数和 MAD 做去极值,正交化之后再标准化。
- 手算两条相关信号等权、按 IC 加权和按协方差加权之后的相关系数。
- 把持有期 IC 换成扣费后的年化 α,看出月度和季度谁更高取决于换手假设。
- 区分「得分的截面相关」和 M07 里两条因子收益的时间序列相关。
- 把一条信号的原始值缩放到绝对均值 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 附近,红线和蓝线几乎贴在一起。
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 是平均仓的倍数 |
费曼自测¶
- 为什么预测公式里乘 IC 可以叫收缩,但又不是一个带先验方差的贝叶斯公式?
- 等权合成的相关只有 0.0404。把两个 z 相加却不除标准差,组合构建会多算什么?
- 右图月度净 α 高于季度。把「每次换手都是 40%」拿掉之后,这个排序还在吗?
- 行业中性化之后 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. 概念题¶
- 写出预测公式,并说明 IC、σ、z 必须对齐的是哪一个期限。
- 为什么去极值的分位数不能用全样本?正交化之后为什么还要标准化?
- 等权信号合成和 DeMiguel 等人的 1/N 是同一张表吗?
- 残差动量处理的是得分里的哪一种混合?
B. 计算题¶
- IC 与年残差相关,波动 25%,z = 1.5。计算 α。若预测写成 30%,反推 IC。P(Z > 1.5) 是多少?
- 月频 IC = 0.03,年波动 25%,z = 1.5。计算对齐期限的月 α 和乘 12 的算术年化,以及误用年波动得到的数。
- IC = (0.04, 0.03),ρ = 0.5。等权、按 IC 加权、最优加权的合成相关各是多少?0.07 是最优值的多少倍?
- 用第 5 节的表,比较月度和季度在 15 bps 与 25 bps 下的净 α。A、B 两只股票的 α/σ² 谁更大?
- 四期原始信号 2, −4, 12, −2。计算绝对均值、k、对称截断、只做多截断,以及 f/10。截断之后的绝对均值为什么不再是 10?
C. 编程实战题¶
- 运行
figures/M10/plot_alpha_forecast.py,核对合成相关 0.0404、0.0411、0.0416,以及月度毛 α 4.33%、拖累 1.44%。 - 把残差 −0.5, 0.5, −0.5, 0.5 的样本标准差打出来,确认再标准化得到 ± 0.866。
- 写一个只用当月截面的 z 分数函数。估计 IC 时,下一月收益用
shift(-1)对齐到形成月,并在注释里说明持仓权重为什么仍要shift(1)。
D. 个人实战思考题¶
- 你只有价值得分和动量得分,持仓 15 到 25 只,只做多。协方差加权相对等权的 0.0012,和印花税、杠杆上限比,哪一项先绑定?
- 一个主观规则是「业绩会连续超预期的公司再拿一个季度」。把它写成信号时,持有期 IC 和换手要先定哪两个数,才能用第 5 节的表?
- 实验记录里的 α 若来自这条公式,应该附上哪四个输入,才不会把秩相关或因子收益相关误代进去?
完整参考答案与解析
**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)
📌 章节知识总结¶
一句话核心洞察¶
- α = IC × σ × z 的三个输入共用一个期限。月频 IC 0.03、z = 1.5、年波动 25% 时,对齐后的算术年化是 3.90%,错乘年波动得到 1.125%。
- 年 IC 0.04、年波动 25%、z = 1.5 的 α 是 1.5%。写成 30% 等于把 IC 写成 0.80。
- 两条 IC 为 0.04 和 0.03、相关 0.5 的信号,最优合成相关是 0.0416。把 IC 相加得到的 0.07 大约是它的 1.68 倍。
- 在每次单边换手都是 40% 的假设下,1 个月持有期的净 α 高于 3 个月。换手假设变了,排序可以变。
- 权重看 α/σ²。波动 40% 的股票 α 更大,风险调整后的系数却更小。
- 原始信号 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
