因子投资-09-投资组合排序法

QUANT RESEARCH NOTE LESSON 09

一个因子值怎样变成收益证据?投资组合排序先按当期特征把股票分组,再比较各组未来收益。它透明、接近可交易组合、能发现非线性,但结果会被断点、权重、股票池、持有期和重叠方式显著改变。

类型核心课程
模块研究方法
阅读约 7 分钟
材料10 节 · 1 段代码

本节解决什么问题

一个因子值怎样变成收益证据?投资组合排序先按当期特征把股票分组,再比较各组未来收益。它透明、接近可交易组合、能发现非线性,但结果会被断点、权重、股票池、持有期和重叠方式显著改变。

前置知识与学习目标

需要第 05 讲组合权重和第 08 讲点时数据。学完后你应该能:

  • 手算单变量三分组与高减低 H-L 收益;
  • 区分独立双排序和条件双排序;
  • 解释等权、市值加权与参考断点的经济含义;
  • 正确处理持有期、重叠组合和 Newey–West 滞后;
  • 判断排序收益是否被微盘股或不可交易股票支配。

直觉与手算

在 t 月末有 6 只合格股票,signal 越高代表预测收益越高;next_return 是 t+1 月可实现收益:

直觉与手算 6 行 × 4 列
股票 signal 市值 next_return
A 1 10 1%
B 2 20 -2%
C 3 30 0%
D 4 40 2%
E 5 50 4%
F 6 100 3%

按 signal 排三组,每组两只。等权收益:

  • Low:A、B,(1%-2%)/2=-0.5%;
  • Mid:C、D,(0%+2%)/2=1%;
  • High:E、F,(4%+3%)/2=3.5%;
  • H-L:3.5%-(-0.5%)=4%。

若组内按市值加权,Low=-1%,High=3.333%,H-L=4.333%。同一股票与同一信号,仅改变权重就得到不同因子收益,因为问题从“平均股票”变成“平均资金”。

定义与公式

单变量排序

每个形成日 t:

  1. 在当期合格股票池内计算信号 x(i,t);
  2. 用预先规定断点划分 G 组;
  3. 以等权或价值权重形成组合;
  4. 在 t+1 或指定持有期记录收益;
  5. 构造高组减低组。

组 g 的收益:

分组成员和权重在 t 已知,收益发生在未来。H-L 是零净投资模拟组合时,还要报告多空两腿总敞口、融资和做空成本。

独立双排序

分别用变量 X、Z 的边际断点独立分组,再取交叉单元。例如规模 2 组×价值 3 组得到 6 个组合。它能观察交互,但某些单元可能很小;两个信号相关时,极端组合的经济含义会混合。

条件双排序

先按 X 分组,再在每个 X 组内部按 Z 分组。它回答“控制 X 的组内相对 Z 效应”,每个 X 组都有 Z 的高低股票,但不同 X 组的 Z 绝对水平可能不同。先 X 后 Z 与先 Z 后 X 不是同一问题。

断点

全市场分位数会被数量庞大的微盘股决定。Fama–French 常用 NYSE 参考断点,使断点代表更可投资股票的分布。A 股可以预先定义大中盘参考集合,但必须报告参考市场、日期和覆盖率,不能为提高结果事后选择。

等权与价值加权

等权 w=1/n 强调平均股票,对小盘股、换手和成本敏感;价值加权 w(i)∝ME(i) 更接近资金可扩展组合,但大股票支配结果。两者应并列而非互相替代。

持有期与重叠组合

若每月形成信号、持有 K 个月,常同时持有 K 个不同形成月的子组合。月 t 总收益是存续子组合的平均。重叠使收益至少呈现机械序列相关,传统标准误偏小;Newey–West 滞后可从 K-1 起做基线,并对更大滞后做敏感性,而非把 K-1 当万能规则。

Python 最小实验

PYTHON 可复现实验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
import numpy as np

frame = pd.DataFrame({
"asset": list("ABCDEF"),
"signal": [1, 2, 3, 4, 5, 6],
"market_cap": [10, 20, 30, 40, 50, 100],
"next_return": [0.01, -0.02, 0.00, 0.02, 0.04, 0.03],
})
frame["group"] = pd.qcut(frame["signal"], 3, labels=["Low", "Mid", "High"])

equal = frame.groupby("group", observed=True)["next_return"].mean()
weighted_return = frame["next_return"] * frame["market_cap"]
value = (
weighted_return.groupby(frame["group"], observed=True).sum()
/ frame["market_cap"].groupby(frame["group"], observed=True).sum()
)

assert np.isclose(equal["High"] - equal["Low"], 0.04)
assert np.isclose(value["High"] - value["Low"], 0.0433333333333333)
print(equal, value)

真实数据中 qcut 遇到大量相同信号可能减少组数或报错。应事先定义并记录并列值规则,不要随机拆分相同经济信号。

A 股实现注意事项

  1. 形成股票池。 在信号日使用历史上市、ST、停牌和板块状态;收益期发生的退市不能从形成池回删。
  2. 微盘与壳价值。 等权尾组可能集中极小市值和壳公司,需报告排除最小市值比例后的结果。
  3. 可成交延迟。 收盘信号最早下一可交易时点成交;涨停高信号买不到、跌停低信号卖不出会形成方向性偏差。
  4. 权重基准。 市值使用形成日点时总市值或自由流通市值,二者对应不同资本组合。
  5. 断点稳定。 全市场分位数会随新股数量和板块扩容变化;保存每期断点、组内数量和市值覆盖。
  6. 做空腿。 A 股 H-L 常是研究因子而非直接可交易策略。融券范围、借券费、召回和数量约束必须单列。
  7. 退市与停牌收益。 组合在持有期遇到事件时继续按真实规则计价,不能把该股票从历史组合重算删除。

常见错误与边界

  • 用 t+1 收益或市值决定 t 期分组。
  • 形成日收盘信号按同一收盘成交。
  • 每期分组数不一致,却仍把标签叫十分位。
  • 只报告 H-L,不展示各组单调性、数量、权重和两腿收益。
  • 等权结果很好就忽略市值加权、换手和容量。
  • 双排序没有说明独立还是条件,导致无法复现。
  • 持有 K 月但标准误仍假设月收益独立。
  • 参考断点随结果改变,构成研究者自由度。

排序的边界是离散化:组内信号差异被丢弃,断点附近股票因微小测量误差换组,统计功效可能低于回归。优点是非线性透明、结果接近组合收益。排序与回归应互相验证。

原书与论文

原书第 2、3 章(PDF 文件页 27–157)涵盖因子模型、实证方法和因子策略。第 6 章(224–290)可对照中国市场的排序实现。

Fama 与 French(1993)是规模—价值组合构造的核心来源:DOI 10.1016/0304-405X(93)90023-590023-5)。Jegadeesh 与 Titman(1993)展示形成期、跳过期、持有期和重叠动量组合:DOI 10.1111/j.1540-6261.1993.tb04702.x。

练习

  1. 用六只股票手算五分组为什么不可取;每组样本太少会带来什么不稳定?
  2. 将 F 的 next_return 改为 -10%,比较等权与价值加权 H-L,解释大市值极端收益的影响。
  3. 设计规模 2×价值 3 的独立双排序,并写出价值因子如何跨规模组平均。
  4. 把排序顺序改为“先规模后价值”与“先价值后规模”,说明条件问题不同。
  5. 每月形成、持有 6 个月时画出第 8 月同时存续的子组合,并给 Newey–West 滞后设置基线。

校验:原始小样本等权 H-L=4%,价值加权 H-L≈4.333%。

小结与下一步

组合排序把当期特征映射为未来组合收益。断点、权重、双排序顺序、持有期和重叠规则都是研究问题的一部分,不是无关实现细节。至少并列报告组别单调性、等权/价值权重、两腿收益、换手和可交易性。

下一讲用时序与截面回归估计 Alpha、暴露和风险价格,并把 Newey–West、GRS 与多重检验放进同一推断框架。


因子投资-09-投资组合排序法
https://www.polarishaw.top/2026/07/17/因子投资-09-投资组合排序法/
作者
Polaris
发布于
2026年7月17日
许可协议