第 21 课 价值、质量、动量与多因子排序¶
因子研究不急着猜一只股票的精确价格。它在同一个历史时点公平比较许多资产,再检查高分与低分是否呈现可重复差异。
因子先回答同一天谁更像某种特征¶
假设同一天有五家公司。小岚想研究“价格相对于公司盈利较便宜的股票,未来是否更容易表现较好”。她不会先预测甲公司下月上涨 3.2%,而是为五家公司使用同一种估值计算,排出相对便宜与相对昂贵,再观察随后一段时间的表现是否随排序发生系统差异。
能够在许多资产之间用相同定义比较的特征叫作因子。估值、盈利质量、公司规模、过去收益和历史波动都能形成因子。原始字段本身未必就是可交易因子,研究还要规定日期、候选池、异常处理、方向、排序、订单和组合。
因子值表示资产在某项特征上的位置,因子暴露表示组合对这项特征有多强的倾向。若历史上高暴露组合相对于低暴露组合得到某种长期收益差,这种差异常被称为因子收益或因子溢价。历史溢价可能来自风险补偿、投资者行为或样本选择,名称不会自动证明未来仍然存在。
五个常见家族观察不同公司特征¶
| 因子家族 | 常见度量 | 朴素研究假设 | 首要风险 |
|---|---|---|---|
| 价值 | 盈利收益率、账面市值比、现金流收益率 | 相对便宜可能补偿风险或过度悲观 | 价值陷阱、周期与行业差异 |
| 质量 | 盈利能力、现金流质量、杠杆、盈利稳定 | 经营更健康的公司可能更能承受冲击 | 财务滞后、估值已经过高 |
| 动量 | 中期相对收益、盈利预期修正 | 信息扩散与行为延续可能持续 | 拥挤与快速反转 |
| 低风险 | 历史波动、市场敏感度、特质波动 | 投资约束可能让高风险资产定价过高 | 防御行业与利率暴露 |
| 规模 | 总市值、自由流通市值 | 小公司可能获得流动性等风险补偿 | 微盘成本、退市与容量 |
一个家族可以有许多定义。“价值”既可以使用账面市值比,也可以使用盈利收益率或企业价值相对于经营现金流。分母接近零、盈利为负和行业资本结构不同,会让同一指标出现完全不同含义。研究卡必须写公式、字段与处理,不能只写一个家族名称。
Fama 与 French 的三因子研究把市场、规模和账面市值比放进共同框架,是现代因子研究的重要基础文献之一。后来学术与行业提出了大量候选,也增加了多重检验与重复命名问题。文献入口收录在参考资料中。
价值因子怎样从市盈率变成可排序方向¶
市盈率等于价格除以每股盈利,常用来描述投资者为一单位盈利支付多少价格。市盈率较低通常被称为较便宜,但盈利为负时,负市盈率很难按普通大小解释;盈利接近零时,比率还会变得极端。
研究中可以把分子分母倒过来,使用盈利收益率,也就是每股盈利除以价格。公司甲每股盈利 1 元、价格 10 元,盈利收益率为 10%;公司乙每股盈利 2 元、价格 40 元,盈利收益率为 5%。在这个单一指标下,甲相对更便宜,而且高分可以统一表示更偏好。
盈利收益率仍然没有解决盈利质量、周期性和负值问题。银行、制造业与早期科技公司的资产结构不同,直接混排可能主要选择某些行业。研究者可以行业内比较,也可以使用多种价值指标交叉验证,任何处理都会改变原始问题。
质量因子先问盈利是怎样产生的¶
质量没有唯一公式。净资产收益率把净利润与股东投入账面资本比较,能够描述一单位净资产产生多少利润;经营现金流与净利润之比可以检查账面盈利是否得到现金支持;负债率则反映资本结构与偿债压力。
高净资产收益率可能来自真正较强经营,也可能来自很小的净资产分母或较高杠杆。单独使用一个漂亮比率会把原因混在一起。质量组合常把盈利能力、稳定性、现金流和杠杆放在同一张卡中,每一项先统一方向,再检查它们是否重复。
质量公司也可能价格昂贵。因子策略只说明某项特征的相对位置,账户结果还受买入估值、行业与市场环境影响。把价值和质量结合,是多因子研究的一个自然问题,不是“好公司一定是好投资”的证明。
因子研究的第一道门仍然是信息时间¶
公司第一季度在三月末结束,财报可能四月下旬才正式披露。若程序从三月三十一日开始使用其中利润,就让过去获得了尚未公开的数据。数据库中只有报告期、没有公告时间时,也不能默认市场在期末已经知道结果。
一条财务记录至少要保留报告所属时期与实际可见时间。每个交易日只能匹配在当时已经公开的最近一份财报。若只知道大致披露规律,可以采用保守固定延迟作为教学近似,同时必须说明数据不足,并比较不同延迟下结果。
下面代码假设 prices 包含交易日与股票代码,fundamentals 包含股票代码、字段值和 available_time。任务是为每个价格日期向过去寻找最近已公开财报,绝不向未来匹配。运行后应抽查公告前一日与公告后一日,确认新数值只在公告之后出现。
panel = pd.merge_asof(
prices.sort_values("date"),
fundamentals.sort_values("available_time"),
left_on="date",
right_on="available_time",
by="ticker",
direction="backward",
)
merge_asof 会寻找时间上最近的记录,direction="backward" 强制只向当前日期以前查找。代码仍要确认时区、收盘后公告和下一可交易时点。公告在周五夜间出现时,周五白天不能使用,日期粒度不足还需保守延迟到下一个交易日。
用五只股票走完一次截面排序¶
下面是某个虚构日期当时可交易的五家公司。为了演示,价值分数先直接使用盈利收益率,质量分数使用简化净资产收益率,动量分数使用过去二十日收益。所有数字都由本书编写。
| 股票 | 行业 | 盈利收益率 | 净资产收益率 | 二十日动量 |
|---|---|---|---|---|
| 甲 | 制造 | 8% | 12% | 6% |
| 乙 | 制造 | 4% | 18% | 2% |
| 丙 | 金融 | 10% | 9% | -1% |
| 丁 | 科技 | -2% | 25% | 12% |
| 戊 | 科技 | 6% | 15% | 4% |
只看价值,丙排名最前,甲第二,戊第三,乙第四,丁因盈利为负需要按照事先规则处理。只看质量,丁排名最前;只看动量,丁又排名最前。不同因子给出冲突信息,多因子组合的任务就是在不混淆单位与方向的情况下整合这些比较。
缺失与极端值要保留原因¶
财务比率极端可能来自真正公司差异,也可能来自分母接近零或字段错误。负盈利让盈利收益率有明确负值,却让传统市盈率难以排序;新上市公司缺少一年动量,停牌资产则缺少可成交价格。三类空白含义不同,不能统一填成行业平均以后假装样本完整。
缩尾会把截面两端超过预定分位点的值压回边界,减少单个极端值主导标准化。阈值要在每个历史日期用当时截面计算,并保存哪些样本被修改。删除极端公司也可能系统性排除亏损、微盘或困境资产,候选池会随之改变。
下面代码以每个日期的 1% 与 99% 分位点为上下界。任务只是在当日截面压缩极端值,输出后应统计每个日期有多少值被改动,而不是只保留处理后的漂亮分布。
lower = factor.groupby("date").transform(lambda x: x.quantile(0.01))
upper = factor.groupby("date").transform(lambda x: x.quantile(0.99))
clipped = factor.clip(lower=lower, upper=upper)
统一方向以后才能比较高分含义¶
盈利收益率、质量和动量通常把较大值解释为更偏好,历史波动与负债率则可能把较小值解释为更偏好。多因子相加以前要统一方向,让高分始终表达同一种偏好。可以把低波动因子乘以负 1,或者使用从低到高的反向排名。
方向统一属于研究假设。低负债是否总是更好,动量高是否在当前市场值得偏好,都要由机制与证据支持。程序把符号翻转很容易,解释为什么翻转才是策略卡的内容。
标准化让不同单位进入共同尺度¶
价值使用百分比,市值可能以亿元计,波动又是小数。直接把原始值相加会让数值尺度较大的字段占据组合。标准化把每个日期的因子减去当日平均,再除以当日标准差,得到与 Z 分数相似的截面位置。
假设同日三个价值值为 4%、6% 和 8%,平均值为 6%。最低值低于平均 2 个百分点,最高值高于平均 2 个百分点。再除以这组三项的标准差后,三者被放到围绕 0 的共同尺度。质量和动量也各自在同日完成相同步骤。
\(x_{i,t}\) 是日期 \(t\) 上资产 \(i\) 的原始因子,\(\bar x_t\) 与 \(s_t\) 是同日候选池平均值和标准差。它与时间序列 Z 分数的区别在于,这里同一日期横向比较资产,不沿一项资产的历史窗口计算。
下面代码输入包含日期索引的因子列,任务是逐日计算截面均值与标准差。不能使用完整历史的平均值,因为那会混合未来日期与不同市场状态。
cross_section_mean = factor.groupby("date").transform("mean")
cross_section_std = factor.groupby("date").transform("std").replace(0, np.nan)
zscore = (factor - cross_section_mean) / cross_section_std
标准化不会让坏数据变好,也不会消除行业差异。候选池只有少量资产时,均值与标准差还会非常不稳定。输出以后要检查分布、缺失比例与每个行业占比。
行业中性化会改变原研究问题¶
银行常有与科技公司不同的资产负债表和估值范围。若价值高分组几乎都是银行,未来收益差可能主要来自行业,而不是同行公司之间的价值差异。行业内排名会让每家公司只与同一行业对象比较,回归方法也可以剔除行业和规模暴露。
中性化表示尽量减少某些已知暴露,使研究关注剩余差异。它不是免费的清洗步骤。原问题“便宜股票是否表现不同”会变成“在同一行业或相近规模中,更便宜的股票是否表现不同”。中性化也可能删除真实可获得的信息,报告应同时展示原始与中性化结果。
行业分类本身具有历史版本。今天行业标签不能随意回填到过去,公司主营业务改变以后,早期分类也可能不同。拿不到时点分类时要明确局限。
分组检验先看排序是否有层次¶
最透明的因子检验会在每个日期把资产按分数分成五组,随后观察各组在事先定义持有期内的收益。若因子具有稳定排序信息,组别从低到高可能呈现大致单调变化。单调表示高一组通常比低一组更好,不要求每组每期都严格排列。
只比较最高组与最低组会隐藏中间形状。若中间四组完全无序,优势只来自最极端的少数微盘股,可能存在非线性,也可能是数据或容量问题。分组数越多,每组样本越少;五组与十组要根据候选池大小和交易可行性选择。
下面代码先对同日分数进行稳定排名,再用 qcut 分成五组。运行后应逐日检查每组数量,并确认分组只使用当日分数,未来收益没有参与切组。
group = score.groupby("date").transform(
lambda x: pd.qcut(x.rank(method="first"), 5, labels=False)
)
标签收益要从信号之后的可成交时点开始。收盘因子若下一日开盘才能建立组合,就不能用信号日收盘到下一日收盘的变化冒充完整持有收益。分组只是研究工具,加入真实订单、费用与权重以后,可交易组合通常会比纯分组结果更弱。
信息系数先比较两张同日排名表¶
分组把连续分数切成几档,研究者还可以直接比较因子排名与未来收益排名。假设五只股票因子从高到低排名为甲、乙、丙、丁、戊,随后收益从高到低为乙、甲、丙、戊、丁。两张顺序大体一致,因子高分往往对应较高未来表现,但并非完全相同。
| 股票 | 因子排名 | 随后收益排名 | 排名关系 |
|---|---|---|---|
| 甲 | 1 | 2 | 都靠前 |
| 乙 | 2 | 1 | 都靠前 |
| 丙 | 3 | 3 | 完全一致 |
| 丁 | 4 | 5 | 都靠后 |
| 戊 | 5 | 4 | 都靠后 |
把同一日期的因子分数与未来收益计算截面相关,得到的信息摘要常叫作信息系数,英文缩写 IC。若使用两边排名计算 Spearman 秩相关,常称 Rank IC。正值表示高因子分数倾向对应较高未来收益,负值表示方向相反,接近零表示该日没有明显线性或排序关系。
概念出现以后再看代码会更清楚。输入是按日期保存的 score 与已经严格按未来持有区间计算的 forward_return,任务是逐日计算秩相关。每个日期只横向比较当日资产。
单日 IC 噪声很大,不能只挑最高日期。报告会查看时间序列平均、波动、正值比例、滚动变化和不同市场状态。五日未来收益会让相邻标签共享多天价格,IC 序列因此可能自相关,统计显著性不能把每个日期当成完全独立样本。
因子衰减说明信息可能持续多久¶
同一因子可以分别与未来一日、五日、二十日收益排名比较。若一日 IC 较高,五日明显减弱,二十日接近零,说明当前样本中的排序信息衰减较快。再平衡太慢可能错过信号,太快又会付出更高成本。
这种比较叫作因子衰减。每个未来期限都必须从可成交时点开始,并在训练、验证边界处清除重叠。衰减图帮助提出持有期,不能根据所有期限结果反复挑出最佳点而忽略多重检验。
多因子先用等权标准分作基线¶
价值、质量与动量已经统一方向并标准化后,最简单组合是把三项 Z 分数取平均。资产甲价值分 1.0、质量分 0.5、动量分负 0.3,综合分就是三者相加除以 3,得到 0.4。
对于资产 \(i\)、日期 \(t\) 和 \(K\) 个因子,等权综合分可以写成下面的形式。
\(z_{i,t}^{(k)}\) 表示第 \(k\) 个已经统一方向的标准分。等权没有声称每个因子同样重要,它提供一个透明基线。根据历史表现优化权重会增加自由度,必须在滚动训练中完成,并与等权版本公平比较。
因子之间可能重复。高股息与价值、低杠杆与质量、价格动量与分析师修正可能表达相近信息。组合前应查看相关、持仓重合与边际贡献,因子数量增加不代表信息维度等量增加。
从高分名单到可交易组合还有一段距离¶
高分组可能集中在同一行业、微盘或低流动性资产。组合层需要决定选择比例、个股上限、行业偏离、成交量限制、再平衡频率和换手预算。每加一项约束,最终持仓都会离原始排序更远。
研究报告可以并列三层结果。第一层是纯因子分组,用来观察现象;第二层加入下一时点成交与费用,得到可交易近似;第三层再加入行业、流动性和风险上限,得到最终组合。三层差异说明信号在哪里被现实约束削弱。
第 22 课会详细学习仓位与风险预算。本课可以先使用高分组等权作为基线,并且把组合持仓与候选池行业分布并排检查。

图中原始价格与财务字段先通过时点检查,再经过清洗、方向统一和同日标准化形成分数。排序进入组合以后,还要经过行业、流动性、换手与风险限制,最终持仓不会等同于原始高分名单。
树模型是因子排序的一种扩展¶
线性综合分为每个因子安排固定方向和权重,难以表达“动量只有在质量不差时更有用”这类条件关系。树模型能够沿特征阈值分支,学习非线性与交互,再输出未来相对收益分数或排名。
复杂表达能力也更容易记住历史噪声。模型仍要使用公告时间正确的特征,未来标签只能用于训练目标,每轮预处理与模型拟合只看过去,预测分数再按同日截面进入组合。公平基线依次可以是单因子、等权多因子、带约束线性模型和浅层树。
树模型可以在因子排序中寻找门槛与特征交互,再把分数送入分组组合。它应当站在比较梯子的后面。先完成单因子、等权多因子和线性模型,再让受限制的树模型使用相同滚动验证、费用与风险条件参加比较。若复杂版本没有稳定增加样本外证据,简单版本仍然更适合解释研究结论。
因子研究最容易出现哪些错觉¶
| 研究步骤 | 容易发生的问题 | 最低检查 |
|---|---|---|
| 财务匹配 | 报告期末提前使用后来公告数字 | 保存实际披露时间并抽查边界日 |
| 候选池 | 用今天股票清单回填多年历史 | 重建当日上市、退市与可交易状态 |
| 异常处理 | 随意删除负值与微盘,或用全历史分位点 | 记录缺失原因、修改数量和时点阈值 |
| 因子选择 | 从数百指标中只留下冠军 | 保存全部主要尝试与机制依据 |
| 分组评价 | 只展示最高与最低组 | 展示全部组别、单调性和容量 |
| 组合构建 | 高分集中在行业与低流动性资产 | 对比中性化、流动性和权重限制 |
| 权重优化 | 测试数据参与因子权重选择 | 每轮只在过去拟合,与等权比较 |
因子研究排雷清单¶
- 每个因子写明公式、方向、字段来源、单位与最早可见时间。
- 历史候选池包含当时上市、退市、停牌与可交易状态。
- 缺失与极端处理按原因分类,并保存被修改对象。
- 标准化在每个日期横向完成,没有使用未来日期统计量。
- 原始、行业内与中性化版本并列,说明问题怎样变化。
- 五组或更多分组完整展示,不只保留两端赢家。
- IC 在首次出现处定义,标签从可成交时点开始,并考虑重叠。
- 因子衰减、参数定义、财报延迟与流动性进入压力检查。
- 等权多因子是主要基线,复杂权重与树模型证明增量。
- 从纯分组到最终组合的行业、成本、换手与容量损失得到展示。
容易弄错的地方¶
| 常见误解 | 为什么不成立 | 应怎样重写问题 |
|---|---|---|
| 因子高分等于未来一定上涨 | 因子通常描述相对排序,证据带有概率与误差 | 高分组是否在同口径下平均优于低分组 |
| 财报属于第一季度,所以三月底可用 | 市场可能四月以后才看到 | 按实际披露时间进入下一可交易时点 |
| 标准化以后行业差异自然消失 | 全市场 Z 分数仍会保留行业结构 | 行业内排名或明确中性化后再比较 |
| IC 是模型准确率 | IC 是同日分数与未来收益的相关摘要 | 同时查看分布、时期、衰减和可交易组合 |
| 因子越多,组合信息越丰富 | 多项因子可能高度重复并增加选择 | 检查相关、持仓重合和边际增量 |
一分钟自测¶
价值高分组全是银行,低分组全是科技。组间收益差能否直接归因于价值?
查看答案
不能。差异可能主要来自行业暴露。应查看行业分布,在行业内排序或做中性化对照,并说明处理后研究问题已经变成同行业内的相对价值。本课术语¶
| 词语 | 先这样理解 |
|---|---|
| 因子 | 能在同一时点对许多资产使用同一定义比较的特征 |
| 因子暴露 | 资产或组合对某项特征的倾向程度 |
| 因子溢价 | 历史上不同因子暴露组合之间观察到的收益差 |
| 截面标准化 | 在同一日期把多个资产的因子放到共同尺度 |
| 中性化 | 尽量减少行业、规模等已知暴露对因子比较的影响 |
| 分组检验 | 按因子分数切组并比较随后表现的方法 |
| 信息系数 | 同日因子分数与未来收益的截面相关摘要 |
| Rank IC | 使用两边排名计算的信息系数 |
| 因子衰减 | 因子与不同未来期限结果之间关系的变化 |
| 多因子 | 把多项已经处理的因子整合为一个分数或模型 |
课后练习¶
1 计算价值方向¶
公司甲每股盈利 2 元、价格 20 元,公司乙每股盈利 3 元、价格 60 元。两者盈利收益率分别是多少,谁在这一指标上更便宜?
提示
盈利收益率等于每股盈利除以价格。答案
甲为 10%,乙为 5%。只按这一指标,甲相对更便宜;仍需检查盈利质量、行业和负值处理。2 判断财务时间¶
年报在 4 月 20 日收盘后公布,4 月 20 日白天的选股能否使用其中利润?
提示
信息要等何时才向市场公开?答案
不能。收盘后公布的信息最早只能影响后续可交易时点,不能回到 4 月 20 日白天。3 解释 IC¶
某日 Rank IC 为正,能够说明什么,又不能说明什么?
提示
它比较的是同日两张排名表。答案
它说明该日高因子排名倾向对应较高未来收益排名。单日结果不能证明长期稳定,也不能替代成本、组合和时间验证。4 动手组合¶
某资产价值 Z 分数为 1.2、质量为 0.6、动量为负 0.3。计算等权综合分,并说明它仍然缺哪些组合决定。
提示
三项相加后除以 3。答案
综合分为 0.5。它仍缺选择比例、订单时间、权重、行业与流动性限制、换手、费用和退出。5 开放思考¶
树模型在验证期高于线性模型时,为什么仍可能保留线性版本?
评价要点
增量可能不稳定、样本有限、解释与维护成本更高,树模型还可能增加换手或记住噪声。应在滚动时期、严格成本、参数限制和最终测试中比较,不能只依靠一次验证成绩。参考资料¶
价值、质量、动量、低风险、Fama 与 French 因子框架以及信息系数相关资料统一列在参考资料中。阅读时请优先记录因子定义、财务可见时间、候选池、分组方式和费用口径。
原始财务与价格字段先检查可得时间,再处理缺失和极端值,统一分数方向以后才在同一天标准化。分组和 IC 描述分数与后来收益的关系,等权多因子则提供一条透明基线。走完这条顺序,模型分数还只是排序依据,尚未回答账户究竟投入多少钱。