量化选股学习笔记(九):一个失败的因子——分析师评级变动
上一篇的盈余公告后漂移在大公司里有效,这一篇再试一个经典的新信号:分析师上调或下调评级。结果是失败的:评级变动确实是新闻,但两天内就被价格吸收,之后的漂移只剩在小公司里。顺带发现,一份标着“每月”的数据,2025 年以前大部分月份其实是冻结的。
这是我学习量化选股的第九篇笔记。上一篇加入了一个新信息——盈余公告后漂移(SUE),它在老因子全部失效的大公司里依然有效。这一篇用同样的流程再试一个新信号:分析师评级变动。结果是失败的,但失败的原因比成功更有教育意义。代码仍然由 Claude Code 编写,我负责提问、读代码和决定方向。
本文是学习记录,不构成任何投资建议。
2026-10-25 更新:本文最后提到的市值错误已经修正,评级变动的结果也在修正后的数据上重跑了,文中的数字和图已经更新。结论不变:评级变动在 10 亿美元以上的公司里作为月度信号无效。变化最大的是第五课“有人关注”的例子,见那一节。
为什么选分析师评级
一开始我想过期权数据(隐含波动率、看涨看跌比),但 FMP 的套餐里没有历史期权数据,要另外买。分析师评级是 FMP 现成就有的,而且也是一个经典的异象:
- 券商分析师会给股票“买入 / 持有 / 卖出”这样的评级,并时不时上调或下调。
- Womack(1996)发现,评级变动当天股价会跳,之后几周还会沿着同一个方向继续漂移,下调之后的漂移尤其长。
- 它和 SUE 一样描述的是“刚刚发生了什么”,但信息来源不同:SUE 来自公司自己公布的财报,评级来自外部分析师的判断。
FMP 有两个接口:一个是每次评级变动的记录(日期、券商、旧评级、新评级),另一个是每个月各个评级有多少分析师。6,073 个代码,一共 12,208 次请求,约一个半小时,0 个错误。
第一课:先把 500 家券商的说法统一
不同券商用词不一样。高盛说 Buy,摩根士丹利说 Overweight,还有人说 Outperform,意思都是“看好”。46.5 万条记录来自约 500 家券商,一共 42 种说法。Claude 建了一张对照表,统一成 1(卖出)到 5(强烈买入),最后只有 8 条记录对不上。
检查数据时有三个发现:
- 大部分记录是“维持”。券商重复原来的评级,通常只是改了目标价,占全部记录的 66–90%,而且每年从 1.3 万条涨到 4.9 万条。这是 FMP 收集得越来越全,不是分析师行为变了。如果信号去数“有多少条记录”,就会被这种增长带偏。所以只用真正的上调和下调,每年稳定在 5,000–7,000 次。
- 覆盖跟着公司大小走。过去 90 天里有上调或下调的,大公司是 52%,微型股只有 5%。全部公司-月份里,80% 什么都没发生。又一次遇到了“同分”问题:80% 的股票并列 0,没法像别的因子那样分成五组,只能分成“被上调 / 没变 / 被下调”三组。
- 27% 的评级变动发生在财报后 10 天以内。分析师是在对同一条新闻(业绩超预期还是不及预期)做反应。这部分其实是 SUE 换了个说法。
第二课:评级变动是新闻,但两天就被吸收了
和上一篇一样,先做事件研究:把每次评级变动前后几十个交易日的股价,和市场平均比较,看反应在哪一天。

日期是对的:反应集中在变动当天,说明大部分报告在当天收盘前就已经发出,FMP 的日期没有记错。评级变动也确实是新闻:即使不在财报附近,上调和下调当天也差了约 5 个百分点。但公司越大,反应越小:小公司当天差 15 个百分点,100 亿美元以上的公司只差 4 个。
真正决定这个因子成败的,是第二天以后还有没有漂移。我们是在月底调仓,等用上信号时,距离评级变动已经过去 0 到 30 天了,只有之后的漂移我们才吃得到:

- 小公司(10 亿美元以下)有漂移:之后 60 天又多拉开约 2.4 个百分点,和 Womack 当年发现的一样。
- 10 亿美元以上的公司完全没有:两条线一直在 0 附近来回晃(−0.4 到 +0.3),就是噪音。
关注一家公司的人越多,消息被吸收得越快。大公司的评级变动,当天就被价格吸收完了。
第三课:日期标在 1 号,不代表是那天的数据
第二份数据是每个月各个评级有多少分析师,每一行都标着“某年某月 1 号”。我本来想用它算“平均评级比 3 个月前变了多少”。
成绩单上出现了一个太好的结果:在 100 亿美元以上的公司里,平均评级下降的股票,每个月比平均差 1.5%。一年下来差 18%,这不可能是真的。回头查数据,才发现这份“每月”数据大部分月份根本没有更新:

2021 到 2024 年,大部分月份只有不到 5% 的公司有变化,只是把上个月原样复制一遍;隔一段时间再一次性刷新 50–95% 的公司。2025 年起才是真正的每月更新。所以“标着 9 月的那一行”其实是 FMP 上次刷新时的样子,不是分析师 9 月的看法。那个 −1.5% 来自数据冻结的月份:100 亿以上的公司里,只有 2 到 6 只股票的平均评级“下降”,几只股票的涨跌就决定了结果。
这份数据最后没有用。教训:日期标在哪一天,不代表数据就是那一天的快照。要检查它是不是真的在按时间变化。 一个“太好”的结果,最常见的原因是数据有问题,而不是发现了宝藏。
第四课:成绩单
用上一篇同样的方法,算每个月的行业内 IC:

- IC 几乎为零:过去 30 天的净上调次数,全部股票只有 0.004,100 亿美元以上 0.008(t 值 1.5,不显著),最多只有 SUE 的三分之一,全部股票里只有六分之一。
- 只看有评级变动的股票,信号是真的:IC 有 0.024(t 值 3.0)。但公司越大越弱:10 亿以上 0.013,100 亿以上 0.003。和老因子一样,只在买不起的小公司里有效;SUE 则在大公司里也有效。
- 而且只在 2021 年有效,2023 年以后约等于 0。
第五课:“有人关注”的陷阱
把股票分成被上调、没变、被下调三组,看下个月的收益。一个奇怪的现象:被上调的和被下调的,都跑赢了股票池的平均。比如在全部股票里(过去 90 天的净上调),上调组每月比平均多 0.33%,下调组也多 0.10%。
原因是:“有分析师来改评级”这件事本身,就说明这是一家更大、更多人关注的公司。所以“上调组跑赢平均”有一部分来自“有人关注”,不是来自“被上调”:被下调的也跑赢了平均。
修正市值错误之前,这个陷阱更明显:上调组扣成本后每月跑赢平均 0.35%(t 值 2.3),看起来像一个可以用的策略;修正后只剩 0.18%(t 值 1.4)。不管哪个数字,比较都应该是上调组对下调组,而不是上调组对平均。
比较一定要找对对照组:要看上调组和下调组之间的差,而不是上调组和全部股票的差。上调减下调,在 10 亿美元以上的公司里每月只有 +0.19%(t 值 0.9),100 亿以上约为 0。
这个因子适合什么样的交易?
我问 Claude:这个因子是不是适合高频交易,只有消息一出来才有效?它的回答是:方向对,但要分清“速度”和“信息”。
- 评级变动的价值几乎全在第 0、1 天。我们的月度调仓横截面选股抓不到它,它属于事件驱动的交易:消息出来以后几分钟到一两天之内交易。
- 但真正的门槛可能是“谁先拿到报告”,而不是“谁下单更快”。券商的报告通常先发给付费的机构客户,公开新闻出来时,价格多半已经动了。我们只有每天的收盘价,分不出第 0 天的反应是开盘跳空还是盘中慢慢涨上去的,要回答这个问题需要分钟级的数据。
- 有研究发现,很多评级变动本身是跟在公司新闻后面的,自己带的新信息并不多(Altınkılıç 和 Hansen,2009)。我们数据里 27% 的变动紧跟财报,和这个发现一致。
所以对一个普通的个人投资者来说,评级变动更像是“已经发生的新闻”,而不是可以交易的信号。
和学界的对照
- 评级变动后的漂移(Womack 1996):在 2021–2026 年的数据里,只在 10 亿美元以下的小公司里还能看到,大公司里已经没有了。
- 分析师信息很快被吸收(Altınkılıç 和 Hansen 2009):大公司的反应集中在第 0 天,第 2 天以后约为 0。
- 评级变动比评级水平更有信息(Jegadeesh 等 2004):我们没能检验,因为每月评级人数那份数据是冻结的。
踩过的坑
- 冻结的“月度”数据:上面第三课。最危险的是它看起来完全正常:每个月都有一行,日期整整齐齐。
- 又是同分:80% 的股票净上调次数是 0。之前股息率、是否盈利都遇到过,分组前一定要先看值的分布。
- 同名文件:P10 和 P11 各有一个
build_signals.py,P11 导入 P10 的代码时会互相覆盖,最后只能改名。 - 顺带发现的数据错误:查异常值时发现,有些后来做过反向拆股的公司,市值被放大了几十到几千倍,比如一家小生物科技公司在 2022 年 12 月被记成 239 亿美元。原因是拆股调整后的价格乘上了当时的股数。这会把小公司错放进“100 亿以上”那组。现在已经修复,第四到第八篇和本文的数字都在修正后的数据上重跑过了。上一篇“踩过的坑”里那只股价 0.53 美元、市值却有 364 亿的股票,数据自相矛盾,现在仍然修不了。
结论和下一步
- 失败也是结果。分析师评级变动在 2021–2026 年、10 亿美元以上的公司里,作为月度信号基本无效。这是事先选定的经典信号,按同样的标准测下来没有通过,我就不再为它调参数、换窗口去“救”它。原计划的“和 SUE 比有没有新信息”和“只做多组合”两步也跳过了:没有可交易的信号,再测下去只会增加多重检验的次数。
- 信息被吸收的速度决定了因子的周期。SUE 的漂移持续约两个月,适合月度调仓;评级变动的信息两天就被吸收完了,只适合事件驱动的交易。选因子之前,先问一句:它的信息多久会被价格吸收?
- 一个太好的结果,先怀疑数据。−1.5% 每月的“发现”,最后查出来是数据冻结。
下一步是 P12:先修好市值的错误,重跑大公司的结果,然后做模拟盘——每月月底按规则生成组合并记录下来,用之后的真实收益检验。