主题
第28章:因子预处理
第27章把数据表洗干净了:每条记录的身份、日期和版本都能对得上。但干净不等于能用。
经过前面九章的积累,你的因子表里大概已经有这些列:EP(盈利收益率)是百分比,ROE 是百分比,20 日累计涨幅是百分比,20 日日均成交额以亿元计,总市值也以亿元计。它们每一个单独看都没问题,放在一起却有三个麻烦:单位不同所以不能相加,分布形状不同所以不能直接比大小,首尾还坐着几个"数字很极端、公司本身并不极端"的记录。
这一章就是处理这几件事。它是第29章检验前的最后一道工序,也是第31章合成综合评分的前提——因为排名不能相加、百分比和亿元也不能相加,必须先变成同一种东西。
但本章要讲的重点不是方法,而是代价。第27章的清洗有客观对错:把报告期当成可用日是错的,把负净资产填成 0 是错的。预处理却不是这样——截断极端值、扣掉行业平均、把数值换成名次,每一步都在删信息,而且删哪一部分是你的选择。这个选择会改变这一列数字的含义。
所以本章围绕三个问题展开:一列原始数字怎样变成可比、可相加的分数;把行业和市值的影响扣掉以后,这个因子还表达原来的投资逻辑吗;同一列数字里的"水平""变化"和"相对位置",分别在测量什么。
原始数字不能直接比较,预处理是在改写因子含义
现象。 下面这几列数字来自同一张因子表的同一天,每只股票的每一列都算得对,但没有人能把它们直接放在一起:
| 列 | 单位 | 典型范围 |
|---|---|---|
| EP(盈利收益率) | 百分比 | −50% 到 +20% |
| ROE | 百分比 | −80% 到 +40% |
| 20 日累计涨幅 | 百分比 | −60% 到 +300% |
| 20 日日均成交额 | 亿元 | 0.02 到 300 |
| 总市值 | 亿元 | 0.5 到 28000 |
单位不同时,数字大的那一列会独占结果
第31章要把价值、质量、成长、动量合成一个总分。如果直接做加权平均,总市值那一列是以"万"为单位的数字,它会独占结果;把单位从"亿元"换成"元",同一个策略选出的股票就完全不同。
一个结论依赖单位,就说明它错了——因为单位是你随手选的,投资逻辑不该跟着变。这和第20章讲的"分组与加权方式会改变结果"是同一种病的更早一层:那次是加权方式的问题,这次连单位都没统一。
分布形状不同时,差值相同不代表意义相同
总市值是典型的右偏分布,少数大公司把尺度拉得很开。2025 年末 A 股市值最大的工商银行总市值约 2.8 万亿元,而当时市值最小的上市公司只剩 0.58 亿元——两者相差近五万倍(数据时点 2025-12-31)。
这意味着"市值增加 100 亿元"对小公司是脱胎换骨,对工商银行是零头。用原始市值做线性比较或加权,等于让少数几只巨无霸决定整个组合在市场大小上的位置。EP、成交额、股价都有同样的形状问题。
极端值会挤在排序的最前面
一只净资产快归零的公司,BP 可以是几十倍;一家微利公司,PE 可以上千倍(第12章、第27章)。这些数字都合法,而且能通过任何"数值校验"。问题在于它们会排在因子的最前面,于是模型挑走的不是"最便宜的公司",而是分母最不可靠的公司。
预处理不是清洁,是重写
所以预处理要做几件事:先选定这一列测的是什么,再判断并处理缺失与极端值,然后做行业与市值中性化,最后统一刻度。
但比方法更重要的是它的性质。第27章解决的是"这个数字对不对",本章解决的是"这个数字还表示原来那件事吗"。 缩尾把极端股票之间的差距压平了,中性化把行业和规模能解释的部分减掉了,标准化把百分比换成了"离平均值几个标准差"——这些都改变了数值的含义,只是不像 bug 那样会报错。
落到决策: 每做一步加工,都要能回答两个问题——这一步删掉了什么信息,做完之后这一列数值越高代表什么。回答不了的加工就不该做。
先确定这一列数字在测什么:水平、变化还是相对位置
现象。 第22章讲质量因子时用 ROE。现在有两家公司:A 公司 ROE 是 12%,去年同期 15%;B 公司 ROE 是 8%,去年同期 5%。哪一家质量更好?这个问题没有唯一答案:A 现在回报更高但在变差,B 现在更差但在变好,而"质量"可以被写成四个不同的数字。
| 写法 | 这一列数字 | 它回答的问题 |
|---|---|---|
| 水平值(原始值) | 当期 ROE = 12% | 现在有多好 |
| 变化值 | 12% − 15% = −3 个百分点 | 在变好还是变差 |
| 同比值 | 12% ÷ 15% − 1 = −20% | 相对去年同期变化了多少 |
| 相对值 | 12% − 行业内中位数 9% = +3 个百分点 | 和同行比处在什么位置 |
四个数字都叫"质量",但它们测的不是同一件事,而且各自带着不同的假设:
- 水平值最直观,也最容易被行业和规模污染。 银行 ROE 长期高于多数制造业,用原始 ROE 排序,选出来会集中在少数几个行业(第15章);大公司和小公司的盈利水平分布也不同(第20章)。
- 变化值天然受基数影响。 一家公司从 0.2% 恢复到 2%,"变化"是 1.8 个百分点,看着很大,但这只说明它从"几乎没有利润"变成"利润很少"(第23章的低基数问题)。变化值适合问"在改善吗",不适合单独问"好不好"。
- 同比值把"变化"换算成了比例,所以同样幅度的改善,小基数的公司看起来更惊人。它和第23章讲的各种增长率是同一件事。
- 相对值已经把同行当成了基准。 这一点特别要注意:用"ROE 减行业中位数"当因子,等于已经做了一次行业中性化。如果后面再执行本章第五节的操作,就是把同一件事扣了两次,行业的影响被过度删除。
落到决策:在动手做任何数值变换之前,先为这一列写一句话——数值越高代表什么。 这句话不是文档工作,它是后面所有加工的验收标准。如果写不出来,标准化和中性化只会把这个说不清的东西原样传给第31章;等合成成综合评分之后,你更查不出原因。
第19章的因子定义表里有一条"数值越高代表什么,怎样排序或分组",说的就是这件事。
边界。 形态可以叠加,但不要一次叠太多。"行业内 ROE 的同比变化"把三件事压在一起,它回答的问题很具体,能满足条件的股票也更少(同比需要去年同期数据、行业需要分类、变化需要两期报表)。选形态的唯一依据是你的投资观点在问什么,而不是哪种写法回测更好看。
极端值和缺失值,先判断性质再决定动作
这两件事看着都像"数据不干净",但它们的共同点是:在决定动作之前,必须先判断这一格属于哪一类。 第27章给了判断标准,这里讲动作。
极端值:压到分位点上,而不是删掉
现象。 某一列因子,四千多只股票挤在 1 到 6 之间,最高的一个值是 60。这个 60 是谁,决定了你该怎么处理它。
三种成因对应三种完全不同的动作:
- 真实事实:周期顶部的低 PE(第12章)、刚出过事公司的低 PB。这家公司确实处在这个状态,不能当成错误数据删掉;如果它离谱到会把排序压偏,就用缩尾把它的影响限制在尾部,而不是把这家公司赶出样本;
- 构造问题:分母接近零。净资产接近零 → BP 爆表;成交额极小 → Amihud 爆表(第25章)。数字算得没错,错的是你把它当成可以跨股票比较的量,这类要在指标构造层面处理;
- 数据错误:口径不匹配、合并范围变化、单位错位。这类要回第27章去修,不是这里压一压就行。
对前两类里确实该保留但过于离谱的值,最常用的动作是缩尾(winsorize):不删除,把超出边界的分位点值拉回到边界上。例如取 1% 和 99% 两个分位点,所有超过 99% 分位的值都改成 99% 分位那个值,低于 1% 分位的同理。这样这只股票还留在样本里(它的其他因子仍然可用),但它在这一列上不再比别人多出几十倍的权重。
为什么缩尾一般直接用分位数,而不是
另一种动作是取对数。 市值、成交额、股价这类右偏变量先取自然对数,再进入标准化或回归。"相差 100 倍"变成"相差约 4.6"(因为
代价。 缩尾会改掉极端股票之间的排序:压完之后,最便宜的两家公司在这一列上并列了。如果这个因子的收益恰好来自最极端的那一小撮股票(第20章的微盘股、第21章的困境反转),缩尾会把这段收益删掉。所以截断比例本身就是一个需要检查的参数,不能直接抄一个常用值(第30章的参数敏感性)。
缺失值:怎么补,等于替公司做了一个判断
现象。 你的因子表里,EP 这一列有几只股票是空的。排序之前总得给它们一个位置——而你填进去的那个数字,其实是你替这些公司做的判断。
第27章区分过缺失的三种来源,它们对应的动作完全不同:
| 缺失来源 | 该做的动作 | 为什么 |
|---|---|---|
| 不适用 | 排除在这一列之外 | 负净资产的公司没有有意义的 BP,填补会造出一个不存在的数字 |
| 未披露 | 保留缺失,必要时单独做一个"是否缺失"的标记 | 缺失本身可能是信息(第26章:不发业绩预告不等于业绩平淡) |
| 抓取失败或口径不匹配 | 去修数据,而不是填数据 | 这是工程问题,不需要也不应该让模型去猜 |
如果哪个都不判断、直接统一填补,那么填什么值就等于替这家公司做了一个判断:
- 填中位数 = 告诉模型"它和大家一样,不差不缺";
- 填最差 = 告诉模型"它很可疑",但这是你的假设,不是事实;
- 填 0 是最危险的一种。第27章那个例子:负净资产公司的 BP 被填成 0 之后,在全市场排序里成了"最便宜的价值股",被送进组合。
落到决策:报告这一列的覆盖率,也就是有多少比例的股票拿到了有意义的非缺失值。覆盖率会直接改变因子的可用范围——一个只覆盖大公司的因子,选出来的组合会系统性偏大盘,那就是第20章的规模污染换了一条路进来。因子的覆盖率是它自己的属性,第29章会把它列为一项单独的检验。
标准化、排名和分位数保留的信息不一样
现象。 EP 是 8%,ROE 是 12%。想做一个等权平均,能不能直接算 10%?不能。因为"8%"在这两列各自分布里的位置不同:EP 的 8% 可能已经排在全市场前 10%,ROE 的 12% 可能只是中游。
把不同尺度的数字放到同一把尺子上,有三种做法,它们删掉的信息不同。
z 分数保留距离,排名只保留次序
z 分数(标准化)。 把每个值减去这一列的平均值,再除以标准差:
排名与百分位。 把这一列从大到小排好,每只股票拿到一个名次,再换算成 0 到 100 的百分位:
分位数分组。 直接切成五组或十组,同一组里的股票在这一列上不再区分。最粗,最省事,也最不怕异常值。
一句话说清三者的区别:z 分数保留"差多少",排名只保留"谁在前"。 这个区别带来两个实际后果。
标准化不改变任何排序,所以先想清楚拿它做什么
z 分数是线性变换,它不改变任何一只股票的先后顺序。 所以如果策略只是"按这一列取前 50 名",标准化和不标准化选出来的完全是同一批股票——这一步是白做的。
标准化真正有用的场合是加权合成、分层汇总和回归(第31章),因为那时候需要让几个因子处在可加的刻度上。先想清楚这一列接下来要做什么,再决定要不要标准化,能省掉很多无用功,也能避免一种常见的自欺:以为做了标准化就等于做了"更科学的处理"。
排名的价值在另一头:它对异常值完全免疫。 一个涨了 55% 的股票和一个涨了 15% 的股票,在百分位里可能只差一两个名次;在 z 分数里却差出好几个标准差。所以如果这一列的首尾坐着大量不太可靠的数值(换手率、Amihud、增速),排名往往比标准化更稳。代价是它把"远贵"和"稍贵"抹平了。
下面这张图用七只股票的 20 日累计涨幅把这件事画出来。
读图:两幅图用的是完全相同的七个涨幅值(示意),区别只在横轴用什么定位。左图按"差多少"定位——先看原始值,再看标准化后;七只股票的间距由数值差决定,所以最高的那只(+55%)被推到最右边,它和倒数第二只(+15%)之间的距离,比前面六只股票加起来的总跨度还大。右图按"排第几"定位——同样的七只股票,每个点之间的距离完全相同,只看这张图已经看不出它们差了多少。图要说明的是:标准化只是换单位,它不改变顺序,也不改变距离之间的比例,所以单因子按排序取前 N 名时它不起任何作用;而排名和分位数会把距离压平,换来的是对异常值免疫。
标准化必须在同一天、同一个股票池内做
一条必须遵守的纪律: 每个形成日单独计算一次平均值和标准差,这叫截面标准化。
如果你用整段历史一起算,那么这个均值里含有未来股票的信息——2019 年某只股票的分数,是根据包括 2024 年在内的数据算出来的(第27章的前视偏差)。它不会报错,只会让历史成绩变好。
反过来也要记住:经过截面标准化的分数,含义是"相对当天全市场的位置",不是一个可以跨日期直接比较的水平值。三个月前的 z 分数是 +1,今天的 z 分数也是 +1,两者代表的公司特征可能完全不同(第17章讲风格暴露时遇到过同一个问题)。
行业中性化:只在同行之间比较
现象。 第16章说过毛利率不能跨行业比较。估值也一样:银行 PB 常年低于 1 倍,软件公司 PB 可以十几倍。如果你把全市场按 PB 从低到高排序,取最便宜的那 10%,结果里必然挤满少数几个低倍数行业的公司。这不是"买到了便宜的好公司",而是"买了一把金融地产"。
第21章讲价值陷阱时说过,全市场比较和行业内比较测量的是两件不同的事:前者量的是行业配置能力,后者量的才是同类公司里的选择能力。行业中性化就是强制用后一种口径来看这个因子。
做法:把行业平均当作基准,只保留个股相对行业的偏离。 三种常见实现,效果相同:
- 行业内标准化:在每个行业内部单独算 z 分数,银行和银行比,软件和软件比;
- 减去行业中位数:
,其中 是第 只股票的原始因子值,右边第二项是它所属行业的中位数; - 加行业哑变量回归再取残差:把行业当成一组开关(第26章讲过哑变量:属于某个行业取 1,否则取 0),拟合出"这个因子的高低平均会受到行业多大影响",再只保留行业解释不了的那部分。下一节会用市值做例子,把这种做法的式子完整写出来。
举一个简化例子。某银行 PB 是 0.6,全部银行的 PB 平均值是 0.8,它相对同行低 0.2;某软件公司 PB 是 12,软件行业平均是 15,它相对同行低 3。在全市场按原始 PB 排序时,软件公司永远排在银行后面;换成行业内比较,两家公司都是"同行里偏便宜"的那个。 你要问的问题不同,答案就不同,这里的加工只是把问题固定成"谁在同行里更便宜"。
落到决策: 中性化把"行业配置"和"行业内选股"拆成了两件事,做完之后你测的是选股能力,代价是放弃了行业配置可能带来的收益。所以如果你本来就想表达"看好某个行业",就不要对它中性化——应当像第20章对待小盘暴露那样,把它当成一项主动暴露来管理,在归因里单独记账(第38章)。
边界。 ① 成分股很少的行业(第15章分类里那些只有十几家公司的三级行业),行业平均值本身就不稳定,一两家公司就能定义整个行业,此时"相对同行"这个基准不可信;② 行业分类体系的口径会变,用今天的行业名单回溯十年前,会把公司放错行业,这是第15章讲过的前视风险;③ 有公司同时经营多个行业,划到哪个行业都会引入误差。
市值中性化:把规模能解释的部分从因子里去掉
现象。 第20章留过一个例子:一个名为"反转"的因子看起来有效,但收益可能大部分来自"它顺便买了一堆小盘股"。要判断这个因子自己还有没有用,就得先把"公司有多大"能解释的那部分数值减掉——这个动作叫市值中性化。
第20章给过两种做法:按市值分层、在层内比较;或者估计"同一市值水平上应该有什么样的因子值",再看实际值偏离多少。分层那里已经写过汇总公式,这里补上第二种的算法。
做法:在每个形成日做一次截面回归,把因子值对市值(取自然对数)回归,然后取残差当作新的因子值。
符号含义:
残差的含义就是这一节的全部重点:在同市值水平上,这家公司的因子值比"应该有的水平"高出或低于多少。 它已经和市值无关了——这正是"中性化"三个字的字面意思。
一个例子:原始排序靠后,中性化之后跑到前面
某因子全市场平均是 6%。一家小市值公司的因子值是 5%,看起来低于平均,按原始值排序会被排在后面。但它的同市值公司平均因子值只有 3.5%——也就是说,配上它这个市值,"应该"只有 3.5%,实际给了 5%,残差是 +1.5 个百分点。它在自己这一档里其实是偏高的。
原始排序把它放在后半段,中性化之后它会跑到前半段。同一家公司、同一个因子,两个结果都是对的,只是回答的问题不同:原始值回答"它和全市场比贵不贵",残差回答"它和同规模公司比贵不贵"。
先缩尾再回归,而且残差不再是百分比
- 先缩尾,再回归。 回归对极端值敏感:一两个异常的市值或因子值就能把斜率
拉偏,从而改掉所有股票的残差。这就是为什么上一节的动作要排在这一节前面,顺序不能交换。 - 中性化之后的数字不再是原来的百分比。 回到第19章那句话:+1.5 这个残差表示"相对同规模公司高 1.5 个百分点",它不表示"这只股票的 EP 是 1.5%"。后面所有"因子值是百分之几"的描述都要跟着改。
和分层的区别。 分层只做粗分组,层内不再区分谁更极端;回归给每一只股票一个连续的调整量,所以层内还能继续排序。代价是回归需要假设"因子值与对数市值呈线性关系",而分层不需要任何函数形式假设。如果这个关系明显不是直线(例如某些因子的收益在市值最小的一档突然变化),直线给出的调整量会把位置摆错。
边界。 用总市值、流通市值还是自由流通市值,会得到不同的中性化结果(第20章);回归只能去掉"能被对数市值线性解释的部分",市值与其他因子的交互、以及非线性关系都不在这里处理。
中性化会删掉信息,也会改掉因子之间的关系
前两节把行业和市值的影响扣掉了。这种"扣掉"不是免费的,有三件事必须提前知道。
被删掉的,可能正是收益本身
如果某个因子的历史收益主要来自小盘暴露,中性化之后它的收益会大幅缩水甚至消失。这不是失败,而是一次识别:它告诉你原来那个"有效"里有多少是规模。
行业中性化同理——收益消失,说明原来赚的是行业配置的钱。知道收益来自哪里,比继续拿着一个说不清来源的漂亮曲线有用得多(第36章、第38章)。
中性化会改变因子之间的关系
这点容易被忽略。中性化市值之后,动量因子和反转因子的表现都会变,因为小盘股的价格行为和市值本来就纠缠在一起;两个原本看起来不同的因子,中性化之后可能变得高度相关——它们各自"剩下"的部分,很可能是同一种东西。
第31章讲因子冗余和正交化时会回到这里:中性化不是只作用在一个因子上,它会同时改变因子之间的相关性结构。 所以调整了一个因子的预处理方式,原来的相关性检查就作废了,必须重做。
中性化控制的是已知差异,不会提高数据质量
风险暴露控制比中性化更宽。 除了行业和市值,你还可以控制 Beta、波动率、上市板块、其他风格因子(第17章、第25章)。做法完全一样:把要控制的变量放到回归的右边,取残差。要控制几项就放几项,每多控制一项,就多删掉一部分信息。
但中性化修不好错误的数据(第27章)、补不上缺失值、更不会消除前视偏差。它是一个"在已知差异上做条件比较"的工具,不是数据质量的解决方案。
落到决策:原始结果和中性化结果都要报告,而且都要解释。 只报告好看的那一个,等于把第30章要防的错提前犯了一次。判断标准也很清楚:本来不想承担这个暴露,就中性化;本来就想承担并管理这个暴露,就保留它、单独记账。 第20章对小盘暴露说过同样的话——主动承担一个暴露,和稀里糊涂承担一个暴露,区别就在有没有记账。
把加工排成一条流水线,再回头检查因子含义
前面几节是按问题分开讲的。真正跑起来时,它们是一条流水线,而且顺序不能随便交换。
读图:流水线自上而下五步,每一步右侧标注了它对这一列数字做了什么。第一步只定含义,不改数值——先写下"数值越高代表什么";第二步判断并处理缺失与极端值,它决定的是哪些股票有资格参与这一列的比较;第三步做行业与市值中性化,去掉的是你不准备承担的暴露;第四步把不同尺度的因子放到同一把尺子上,注意这一步只换刻度、不改次序,除非你选择排名,那时丢掉的是"差多少";第五步得到的是可以送进第29章检验、第31章合成的因子值。图要说明的是:第 2、3、4 步都在删信息,而删掉哪一部分是可以选的——这就是"预处理会改写因子含义"的具体位置。
顺序上最要紧的三条:
- 缺失判断必须排在所有计算之前。 "不适用"的那部分股票(比如负净资产公司)一旦参与排序,会占据因子的极端位置;而如果把它们的值填成 0 再标准化,等于给了这个凭空造出来的数字一个具体位置。
- 缩尾必须排在回归之前。 回归对极端值比你想的敏感得多:极端值在自变量(这里是市值)上的位置离其他点很远,它会像一个支点一样把斜率拉向自己,从而改掉所有股票的残差。缩尾在分位点上正好把这种支点拉回来。
- 缩尾和标准化谁先谁后,改的是刻度而不是次序。 两者都是保序变换,所以对单因子排序没有任何影响;但先标准化再缩尾,会让这一列的离散程度变得小于 1,等第31章和其他因子等权合成时,它分到的实际分量就被悄悄改小了。稳妥的做法是把顺序固定下来:缩尾 → 中性化 → 标准化。
回头检查:这一列现在还表示什么
这是本章的交付物,也是第29章检验之前必须过的一遍。
| 加工步骤 | 删掉了什么 | 做完后这一列表示什么 | 怎么检查没改坏 |
|---|---|---|---|
| 选定因子形态 | 其他三种写法的信息 | 你写下的那句话 | 能不能一句话说清"数值越高代表什么" |
| 缺失判断 | 一部分股票的参与资格 | 含义不变,但覆盖面变小 | 报告覆盖率,并检查留下的样本是不是只来自某一类公司 |
| 缩尾 | 极端股票之间的相对差距 | 含义不变,首尾被压平 | 换一个截断比例,结论是否还在(第30章) |
| 行业中性化 | 行业之间的水平差异 | "相对同行高多少" | 检查选出来的结果是否还集中在少数行业 |
| 市值中性化 | 市值能线性解释的部分 | "相对同规模公司高多少" | 检查残差与市值之间还有没有单调关系 |
| 标准化或排名 | 尺寸信息(z 分数)/距离信息(排名) | 相对全市场的位置,没有单位 | 确认它是在同一个形成日、同一个股票池内算的 |
这张表和第27章那张表回答的是不同的问题。 第27章问"这个数字对不对",本章问"这个数字还表示原来那件事吗"。一个因子在过了六道加工之后,如果没人说得清它现在测的是什么,它就不该被送进第31章的合成——因为合成之后,你会更找不到原因。
对 ETF 的适用边界。 本章讲的加工对个股因子和指数成分因子同样成立,因为指数因子归根到底也是"某只成分股 × 某天"的数字。但 ETF 产品层面的筛选条件不是因子:费率、成交额、买卖价差、折溢价都是产品属性,没有行业和市值的分布,不需要也无法中性化——给一只行业 ETF 做行业中性化是没有意义的,它本来就只持有一个行业。分层要分清:底层指数用本章的方法,产品本身用第18章和第32章的方法。
本章小结
- 干净不等于能用。EP、ROE、市值、成交额放在一起有三个问题:单位不同不能相加,分布形状不同不能直接比大小,首尾的极端值会挤在排序的最前面。
- 预处理不是清洁,是重写。 第27章问"这个数字对不对",本章问"这个数字还表示原来那件事吗"。缩尾、中性化、标准化每一步都在删信息,删哪一部分是你的选择。
- 先确定这一列测的是什么:水平值问"现在多好",变化值问"在变好还是变差",同比值把变化换算成比例,相对值已经把同行当成了基准——用相对值当因子,等于已经做过一次行业中性化,不要再扣第二遍。
- 极端值要先分清是事实、构造问题还是数据错误,再决定动作。缩尾是把超出分位点的值拉回边界,不是删除。一般用分位数而不是
倍标准差:分位数让你指定"截掉多少只股票",标准差倍数则把"截多少"交给了分布形状,换一列因子就失效。代价是极端股票之间的排序被压平,所以截断比例是需要检验的参数。 - 缺失值分"不适用""未披露""抓取失败"三类,动作分别是排除、保留标记、修数据。填什么值就等于替这家公司做了一个判断,填 0 会让负净资产公司变成"最便宜的价值股"。覆盖率要单独报告。
- z 分数保留"差多少",排名只保留"谁在前"。z 分数是线性变换,不改变任何排序,所以单因子按排序取前 N 名时标准化不起作用;它的用处在加权合成和回归。排名对异常值免疫,代价是丢掉距离信息。
- 标准化必须在同一个形成日、同一个股票池内做(截面标准化)。用整段历史一起算均值和标准差,等于把未来的分布放进了过去的分数;而且截面标准化的分数只有"相对当天的位置"这个含义,不能跨日期直接比较水平。
- 行业中性化就是只在同行之间比。它把"行业配置"和"行业内选股"拆开,做完测的是选股能力,代价是放弃行业配置的收益——想表达行业观点时不该做它。
- 市值中性化可以用截面回归取残差:
,残差表示"在同样市值水平上,这家公司比应有的水平高或低多少"。必须先缩尾再回归,因为回归斜率会被极端值拉偏;中性化后的数字不再是原始百分比。 - 中性化会删掉真实的收益(如果它本来就来自那个暴露),也会改变因子之间的相关性,让两个原本不同的因子变得重复。它只控制已知差异,修不好错误数据、缺失值和前视偏差。原始结果和中性化结果都要报告。
- 顺序也有约束:缺失判断排在所有计算之前,缩尾排在回归之前;缩尾与标准化之间的先后只改刻度、不改次序,却会影响它在第31章等权合成时分到的分量,所以要固定成一个顺序。全部做完之后回到那句话——能不能一句话说清这一列数值越高代表什么。
下一章开始检验。有了这张可比、可控、说得清含义的因子表,才能回答第29章的问题:这个因子在不同分组下是否单调,它的排名和未来收益到底有多相关,以及这种关系在牛市、熊市和震荡市里是不是一回事。