8.7 行业中性化与市值中性化
课前导读
本节目标
你将学会:为什么一个看起来有效的因子,可能只是碰巧买到了强势行业或大市值股票。
适合基础:已经知道价值、质量、成长、动量等因子,也见过 IC、RankIC 或分层检验的读者。
难度:intermediate
预计用时:约 40 分钟
想象一所学校要评选“跑步进步最快的学生”。
如果把全年级所有学生直接放在一起比较,体育班学生大概率排在前面。
这时你很难判断:他们是真的“进步快”,还是本来训练条件就更好。
更公平的办法,是先在同年级、同班级里比较,再看每个人相对本班同学是不是更优秀。
因子研究里的“中性化”,本质上就是这种“同班比较”。
它不是为了让结果变复杂,而是为了让因子少占不该占的便宜。
知识正文
1. 为什么需要中性化
在 A 股里,不同行业的股票经常像不同班级。
银行、煤炭、电力这类行业,估值可能长期偏低。
医药、电子、计算机这类行业,估值和成长预期可能经常被市场给得更高。
如果你用“市盈率低”做价值因子,直接在全市场排序,排在前面的可能大量都是银行、地产、煤炭。
如果随后这几个行业刚好上涨,回测会告诉你:“低市盈率因子很厉害。”
但老师要追问一句:
这个收益到底来自“低估值股票更好”,还是来自“你重仓了某些行业”?
这就是行业暴露的问题。
所谓“暴露”,可以理解为你的策略无意间把资金集中到了某个共同特征上。
行业暴露,是指组合对某些行业特别偏重。
市值暴露,是指组合特别偏向大盘股或小盘股。
如果不处理这些暴露,因子就可能“偷吃”行业红利或市值红利。
常见误区
因子收益高,不等于因子本身有效。它可能只是借了行业行情、市值风格或市场阶段的光。
2. 行业中性化:先在同一个行业里排队
行业中性化的直觉很简单:
不要让银行股和芯片股直接比“谁估值低”。
先让银行和银行比,芯片和芯片比,再把每个行业里相对更低估的股票找出来。
这就像同班排名。
一个学生在体育班跑第 10 名,另一个学生在普通班跑第 1 名,直接比较秒数可能不公平。
先看他们在各自班级里的相对位置,才能更接近“个人特征”。
在因子研究中,可以把某只股票的原始因子值,减去它所在行业的平均因子值。
例如:
| 股票 | 行业 | 原始估值得分 | 行业平均得分 | 行业中性后得分 |
|---|---|---|---|---|
| 甲银行 | 银行 | 82 | 75 | 7 |
| 乙银行 | 银行 | 70 | 75 | -5 |
| 丙电子 | 电子 | 62 | 55 | 7 |
| 丁电子 | 电子 | 45 | 55 | -10 |
甲银行和丙电子的中性后得分都是 7。
这表示它们都比本行业平均水平更突出。
行业中性化后,我们比较的是“相对同业是否便宜或优秀”。
关键心得
行业中性化不是说行业不重要,而是先把行业这层背景擦干净,再观察因子自己的信息。
3. 市值中性化:别让大个子天然占优势
市值中性化可以用“身高体重分组体测”来理解。
如果让小学生和高中生直接比篮球投篮力量,高中生优势很大。
但这不一定说明训练方法更好,只是身体基础不同。
A 股中,大市值公司通常交易更活跃、研究覆盖更多、信息披露更稳定。
小市值公司可能波动更大,也可能在某些年份有明显小盘风格行情。
如果一个因子选出来的全是小盘股,回测收益很高,研究者必须判断:
收益是来自因子,还是来自小盘股整体上涨?
市值中性化就是尽量剥离“公司大小”带来的影响。
常见做法不是简单按大中小分组,而是用统计方法把因子值中能被市值解释的部分拿掉。
你可以先记住一个生活化版本:
先看公司大小对因子分数的平均影响,再看每只股票剩下的“超出大小解释之外的分数”。
这个“剩下的部分”,常被叫作残差。
残差不是残次品,而是“去掉已解释背景后留下的特征”。
4. 一个简化的 pandas 思路
下面的代码不需要真实外部数据,只是展示研究流程。
它的核心意思是:先按行业做相对比较,再避免市值影响过强。
import pandas as pd
sample = pd.DataFrame({
"stock": ["甲银行", "乙银行", "丙电子", "丁电子"],
"industry": ["银行", "银行", "电子", "电子"],
"market_cap": [3000, 1800, 900, 500],
"value_score": [82, 70, 62, 45],
})
sample["industry_mean"] = sample.groupby("industry")["value_score"].transform("mean")
sample["industry_neutral_score"] = sample["value_score"] - sample["industry_mean"]
print(sample[["stock", "industry", "industry_neutral_score"]])这段代码只做了最基础的行业中性化。
真实研究中,量化开发通常会进一步检查:
- 行业分类是否使用当时可获得的分类;
- 市值是否取调仓日前已经可见的数据;
- 极端值是否会把行业平均值拉偏;
- 中性化前后因子排序是否变化过大;
- 中性化后组合是否仍然集中在少数行业。
不要被代码吓到。
你真正要掌握的是判断顺序:
先问“因子是不是混入了别的共同特征”,再决定要不要中性化。
5. 中性化不是万能清洁剂
中性化可以帮助你看清因子本身,但它也会带来代价。
如果你的投资逻辑本来就包含行业观点,过度行业中性化可能会把有用信息抹掉。
例如,你明确判断新能源产业链景气度改善,并用基本面因子在新能源内部挑公司。
这时你需要的是“行业内精选”,而不是假装完全不看行业。
再比如,小市值效应在某些阶段可能本身就是研究对象。
如果你研究的是“小公司成长弹性”,强行市值中性化可能把主题拿掉。
所以,中性化的关键不是机械执行,而是写清楚研究目的。
从专业老师角度看,它是公平考试。
从投资者角度看,它是防止自己误以为找到了金矿。
从量化开发角度看,它是把信号、行业、市值这些来源拆开,方便后续监控。
6. A 股案例:低估值策略的“银行味”
假设你做一个低市净率选股策略。
每月从沪深 A 股中选择市净率最低的 50 只股票。
第一次回测发现,策略在某一年表现很好。
你兴奋地打开持仓明细,却发现组合里大量是银行、建筑、地产链公司。
这时不能直接下结论说“低市净率因子有效”。
你至少要再做三步:
- 看组合行业权重,判断是否集中;
- 在每个行业内部挑相对低市净率股票;
- 比较中性化前后的收益、回撤和换手变化。
如果中性化后表现大幅消失,说明原来收益很可能来自行业配置。
如果中性化后仍然有稳定优势,才更像因子自身有解释力。
风险提醒
中性化后的结果更“干净”,但不保证未来赚钱。它只能减少误判来源,不能消除市场风险。
7. 一张流程图看懂中性化
graph TD
A[拿到原始因子分数] --> B[检查行业分布]
B --> C{是否明显集中在少数行业}
C -->|是| D[做行业内相对比较]
C -->|否| E[继续检查市值分布]
D --> E
E --> F{是否明显偏向大盘或小盘}
F -->|是| G[剥离市值影响]
F -->|否| H[进入因子检验]
G --> H
H --> I[比较中性化前后结果]这张图的重点不是技术细节,而是研究习惯。
不要一上来就相信漂亮的收益曲线。
先拆背景,再看信号。
交互实验室
练习 1:手工做一次行业中性化
请你把下面 6 只股票当作一个小样本。
| 股票 | 行业 | 因子分数 |
|---|---|---|
| A银行 | 银行 | 80 |
| B银行 | 银行 | 68 |
| C银行 | 银行 | 74 |
| D医药 | 医药 | 60 |
| E医药 | 医药 | 48 |
| F医药 | 医药 | 54 |
请按步骤计算:
- 银行业平均分是多少?
- 医药行业平均分是多少?
- 每只股票的“因子分数 - 行业平均分”是多少?
- 中性化后,哪只股票在本行业里最突出?
参考答案:
- 银行业平均分:74;
- 医药行业平均分:54;
- A银行为 6,B银行为 -6,C银行为 0;
- D医药为 6,E医药为 -6,F医药为 0;
- A银行和 D医药都比本行业平均高 6 分。
这个练习说明:
原始分数最高的是 A银行。
但行业中性化后,A银行和 D医药同样突出。
这就是“同班比较”的力量。
练习 2:写下你的研究检查句
请在研究日志里补完三句话:
- 我的因子是否集中在某些行业?如果是,可能原因是:______。
- 我的因子是否明显偏向大市值或小市值?如果是,可能影响是:______。
- 中性化前后结果差异很大时,我不会立刻说因子失效,而会先检查:______。
你不需要写得学术化。
只要能提醒未来的自己别被表面结果带偏,就是有效的研究记录。
核心复盘
知识清单:
- [ ] 我能用“同年级同班比较”解释行业中性化。
- [ ] 我知道行业暴露会让因子偷吃行业行情。
- [ ] 我知道市值暴露会让因子混入大盘或小盘风格。
- [ ] 我能理解中性化前后结果都要看,而不是只看更好看的那一个。
- [ ] 我知道中性化不是万能规则,要服从研究目的。
金句总结
好因子不是在全校大喊“我第一”,而是在同班比较后依然站得住。