跳转至

第 21 课 价值、质量、动量与多因子排序

因子研究不急着猜一只股票的精确价格。它在同一个历史时点公平比较许多资产,再检查高分与低分是否呈现可重复差异。

适合谁已经理解截面动量,准备加入财务与组合信息的读者
前置知识历史候选池、财务披露时间、截面排名与时间验证
建议用时150 分钟,可分三次完成
本课成果从原始字段完成因子清洗、同日排序、分组检验和多因子组合草图

因子先回答同一天谁更像某种特征

假设同一天有五家公司。小岚想研究“价格相对于公司盈利较便宜的股票,未来是否更容易表现较好”。她不会先预测甲公司下月上涨 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 的共同尺度。质量和动量也各自在同日完成相同步骤。

\[ z_{i,t}=\frac{x_{i,t}-\bar x_t}{s_t} \]

\(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,任务是逐日计算秩相关。每个日期只横向比较当日资产。

rank_ic = score.groupby("date").corr(
    forward_return,
    method="spearman",
)

单日 IC 噪声很大,不能只挑最高日期。报告会查看时间序列平均、波动、正值比例、滚动变化和不同市场状态。五日未来收益会让相邻标签共享多天价格,IC 序列因此可能自相关,统计显著性不能把每个日期当成完全独立样本。

因子衰减说明信息可能持续多久

同一因子可以分别与未来一日、五日、二十日收益排名比较。若一日 IC 较高,五日明显减弱,二十日接近零,说明当前样本中的排序信息衰减较快。再平衡太慢可能错过信号,太快又会付出更高成本。

这种比较叫作因子衰减。每个未来期限都必须从可成交时点开始,并在训练、验证边界处清除重叠。衰减图帮助提出持有期,不能根据所有期限结果反复挑出最佳点而忽略多重检验。

多因子先用等权标准分作基线

价值、质量与动量已经统一方向并标准化后,最简单组合是把三项 Z 分数取平均。资产甲价值分 1.0、质量分 0.5、动量分负 0.3,综合分就是三者相加除以 3,得到 0.4。

对于资产 \(i\)、日期 \(t\)\(K\) 个因子,等权综合分可以写成下面的形式。

\[ S_{i,t}=\frac{1}{K}\sum_{k=1}^{K}z_{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 描述分数与后来收益的关系,等权多因子则提供一条透明基线。走完这条顺序,模型分数还只是排序依据,尚未回答账户究竟投入多少钱。