Skip to content

8.7 行业中性化与市值中性化

课前导读

本节目标

你将学会:为什么一个看起来有效的因子,可能只是碰巧买到了强势行业或大市值股票。

适合基础:已经知道价值、质量、成长、动量等因子,也见过 IC、RankIC 或分层检验的读者。

难度:intermediate

预计用时:约 40 分钟

想象一所学校要评选“跑步进步最快的学生”。

如果把全年级所有学生直接放在一起比较,体育班学生大概率排在前面。

这时你很难判断:他们是真的“进步快”,还是本来训练条件就更好。

更公平的办法,是先在同年级、同班级里比较,再看每个人相对本班同学是不是更优秀。

因子研究里的“中性化”,本质上就是这种“同班比较”。

它不是为了让结果变复杂,而是为了让因子少占不该占的便宜。


知识正文

1. 为什么需要中性化

在 A 股里,不同行业的股票经常像不同班级。

银行、煤炭、电力这类行业,估值可能长期偏低。

医药、电子、计算机这类行业,估值和成长预期可能经常被市场给得更高。

如果你用“市盈率低”做价值因子,直接在全市场排序,排在前面的可能大量都是银行、地产、煤炭。

如果随后这几个行业刚好上涨,回测会告诉你:“低市盈率因子很厉害。”

但老师要追问一句:

这个收益到底来自“低估值股票更好”,还是来自“你重仓了某些行业”?

这就是行业暴露的问题。

所谓“暴露”,可以理解为你的策略无意间把资金集中到了某个共同特征上。

行业暴露,是指组合对某些行业特别偏重。

市值暴露,是指组合特别偏向大盘股或小盘股。

如果不处理这些暴露,因子就可能“偷吃”行业红利或市值红利。

常见误区

因子收益高,不等于因子本身有效。它可能只是借了行业行情、市值风格或市场阶段的光。

2. 行业中性化:先在同一个行业里排队

行业中性化的直觉很简单:

不要让银行股和芯片股直接比“谁估值低”。

先让银行和银行比,芯片和芯片比,再把每个行业里相对更低估的股票找出来。

这就像同班排名。

一个学生在体育班跑第 10 名,另一个学生在普通班跑第 1 名,直接比较秒数可能不公平。

先看他们在各自班级里的相对位置,才能更接近“个人特征”。

在因子研究中,可以把某只股票的原始因子值,减去它所在行业的平均因子值。

例如:

股票行业原始估值得分行业平均得分行业中性后得分
甲银行银行82757
乙银行银行7075-5
丙电子电子62557
丁电子电子4555-10

甲银行和丙电子的中性后得分都是 7。

这表示它们都比本行业平均水平更突出。

行业中性化后,我们比较的是“相对同业是否便宜或优秀”。

关键心得

行业中性化不是说行业不重要,而是先把行业这层背景擦干净,再观察因子自己的信息。

3. 市值中性化:别让大个子天然占优势

市值中性化可以用“身高体重分组体测”来理解。

如果让小学生和高中生直接比篮球投篮力量,高中生优势很大。

但这不一定说明训练方法更好,只是身体基础不同。

A 股中,大市值公司通常交易更活跃、研究覆盖更多、信息披露更稳定。

小市值公司可能波动更大,也可能在某些年份有明显小盘风格行情。

如果一个因子选出来的全是小盘股,回测收益很高,研究者必须判断:

收益是来自因子,还是来自小盘股整体上涨?

市值中性化就是尽量剥离“公司大小”带来的影响。

常见做法不是简单按大中小分组,而是用统计方法把因子值中能被市值解释的部分拿掉。

你可以先记住一个生活化版本:

先看公司大小对因子分数的平均影响,再看每只股票剩下的“超出大小解释之外的分数”。

这个“剩下的部分”,常被叫作残差。

残差不是残次品,而是“去掉已解释背景后留下的特征”。

4. 一个简化的 pandas 思路

下面的代码不需要真实外部数据,只是展示研究流程。

它的核心意思是:先按行业做相对比较,再避免市值影响过强。

python
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 只股票。

第一次回测发现,策略在某一年表现很好。

你兴奋地打开持仓明细,却发现组合里大量是银行、建筑、地产链公司。

这时不能直接下结论说“低市净率因子有效”。

你至少要再做三步:

  1. 看组合行业权重,判断是否集中;
  2. 在每个行业内部挑相对低市净率股票;
  3. 比较中性化前后的收益、回撤和换手变化。

如果中性化后表现大幅消失,说明原来收益很可能来自行业配置。

如果中性化后仍然有稳定优势,才更像因子自身有解释力。

风险提醒

中性化后的结果更“干净”,但不保证未来赚钱。它只能减少误判来源,不能消除市场风险。

7. 一张流程图看懂中性化

mermaid
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

请按步骤计算:

  1. 银行业平均分是多少?
  2. 医药行业平均分是多少?
  3. 每只股票的“因子分数 - 行业平均分”是多少?
  4. 中性化后,哪只股票在本行业里最突出?

参考答案:

  • 银行业平均分:74;
  • 医药行业平均分:54;
  • A银行为 6,B银行为 -6,C银行为 0;
  • D医药为 6,E医药为 -6,F医药为 0;
  • A银行和 D医药都比本行业平均高 6 分。

这个练习说明:

原始分数最高的是 A银行。

但行业中性化后,A银行和 D医药同样突出。

这就是“同班比较”的力量。

练习 2:写下你的研究检查句

请在研究日志里补完三句话:

  • 我的因子是否集中在某些行业?如果是,可能原因是:______。
  • 我的因子是否明显偏向大市值或小市值?如果是,可能影响是:______。
  • 中性化前后结果差异很大时,我不会立刻说因子失效,而会先检查:______。

你不需要写得学术化。

只要能提醒未来的自己别被表面结果带偏,就是有效的研究记录。


核心复盘

知识清单

  • [ ] 我能用“同年级同班比较”解释行业中性化。
  • [ ] 我知道行业暴露会让因子偷吃行业行情。
  • [ ] 我知道市值暴露会让因子混入大盘或小盘风格。
  • [ ] 我能理解中性化前后结果都要看,而不是只看更好看的那一个。
  • [ ] 我知道中性化不是万能规则,要服从研究目的。

金句总结

好因子不是在全校大喊“我第一”,而是在同班比较后依然站得住。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。