← 返回报告库
行业动量 × 超预期 · 全 A 剔 ST 剔北交所 · 2017–2026 · 月频回测

在行业动量里叠超预期,
能到 25% 吗?

我们已经有一个跑得不错的行业动量轮动(隔夜动量选行业)。这次的问题很直接:在动量选出的行业里,再用「是否超分析师预期」挑股票,能不能拼出一个年化 25% 的真实长仓策略?答案是拼不出来——但过程里验证出一个真 alpha,也钉死了三个反直觉的用法边界。这是一次诚实的封顶实验:先说结论,25% 那个量级,长仓「行业 + 基本面」给不了。

全 A(剔 ST / 剔北交所 4·8·9 开头)2017-01 – 2026-06|行业 = 申万一级 31 个|行业动量 = 隔夜跳空聚合到行业、navON/navON.shift(180)−1、月频取 top-K|选股 = 行业内「是否超预期」过滤 / 按幅度排序|等权、月频调仓、0.2%/边(往返 0.4%)|持仓收益用 daily.pct_chg(复权口径)|train<2022 / test≥2022
真 alpha · 超预期符号过滤 +11.6pp · Sharpe 0.78 > 已部署 0.73 封顶 · 长仓行业 + 超预期到不了 25% · 25% 只有小市值引擎给
+11.6pp超预期符号过滤 vs 基线全成分(全期 2.6%→14.2%)
0.78超预期版全期 Sharpe——超过已部署行业动量的 0.73
−1.0按幅度浓缩到 10–15 只的 Sharpe(train/test 双负)
8.5%超预期版 OOS(2022+)CAGR——衰减但仍正
一句话结论。把行业动量选出的行业当股票池,只保留「实际年报净利超过分析师一致预期」的成分股、等权持有,是一个真实、稳健、跑赢基线的 alpha:全期 CAGR 从基线 2.6% 提到 14.2%、Sharpe 从 0.23 提到 0.78(比已部署行业动量轮动的 0.73 还高一点),而且 K2/K3/K5 选几个行业都成立。但它到不了 25%:train 段 19.8%、test 段掉到 8.5%,长仓「行业 + 基本面」这个框架的天花板就在 ~14% 全期 / ~8.5% OOS。25% 那个量级在 A 股基本只有规模(微盘)引擎给得到,而这次我们刻意不倚重小市值——所以这是一篇「造强策略失败、但收获真 alpha」的诚实记录。

核心表:三种超预期用法 × 选几个行业

配置(月频 · 0.2%/边)全期 CAGR全期 Sharpetrain<22test≥22MDD
top5 · 全成分(基线)+2.6%0.23+0.6%+4.9%−46%
top5 · 超预期>0 过滤+14.2%0.78+19.8%+8.5%−33%
top5 · 按幅度取 topN/行业+8.2%0.47+7.8%+9.0%−46%
top3 · 超预期>0 过滤+14.3%0.75+23.0%+5.8%−37%
top2 · 超预期>0 过滤+15.3%0.76+26.9%+4.2%−44%
top5 · 幅度浓缩到全池 15 只−2.2%−1.16−1.3%−3.2%−20%
top5 · 幅度浓缩到全池 10 只−1.6%−0.58−1.0%−2.1%−18%
三条读数。超预期符号过滤是全场唯一的赢家,K2/K3/K5 全期都在 14–15%、Sharpe 0.75–0.78,稳稳把基线的 2.6% 抬起来 ~11.6pp;②越集中越靠 train——top2 的 train 高达 26.9% 但 test 只有 4.2%,top5 更均衡(train 19.8 / test 8.5),做实盘该用 top5(分散);③下面三行是负知识:按幅度排序、尤其浓缩到十几只,直接把正 alpha 打成负 Sharpe。为什么?下一节。

为什么「符号」赢「幅度」,「宽」赢「窄」?

符号(超没超)> 幅度(超多少)

简单的「有没有超预期」全期 14.2%,按「超了多少」排序取头部只有 8.2%。原因很干净:极端大幅超预期基本是噪声——一致预期基数很小时,一点点利润就是几倍「超预期」;还混着预告口径操纵、一次性收益、资产处置。方向(有没有超)是稳健信号,尾部幅度是陷阱。这与本站 PEAD分析师修正的结论一致:市场认边际方向,不认耸动幅度。

宽(几十只)> 窄(十几只)

符号过滤保留了行业里所有超预期的票(几十只)、等权,分散掉了个股噪声;一旦按最大幅度浓缩到 10–15 只,就等于专挑那批最可疑的极端超预期——train/test 双双负 Sharpe(约 −1),是全场最坏。这个 alpha 的载体是「宽度 + 方向」,不是「精选 + 集中」。想靠浓缩放大收益的直觉在这里彻底反向。

叠择时能救吗?能降回撤,不能提收益

K5 超预期>0 + 宽基均线择时(跌破均线空仓持现金)全期 CAGR全期 Sharpetest CAGRtest Sharpetest MDD
无择时(原版)+14.2%0.78+8.5%0.50−28%
+ 沪深 300 MA60+5.6%0.46+11.7%0.88−16%
+ 创业板指 MA60+9.2%0.68+10.0%0.77−20%
+ 中证 500 MA20+8.0%0.67+7.7%0.64−18%
+ 中证全指 MA20+6.4%0.55+8.7%0.71−13%
择时是「换风险」不是「换收益」。叠一层宽基均线择时(指数跌破均线就清仓持现金),把 OOS 的最大回撤从 −28% 压到 −16%、test 段 Sharpe 从 0.50 提到 0.88——风险体验明显改善;但全期 CAGR 被砍到 6–9%,因为均线择时总是在牛市初期把你踢出场、错过最猛的反弹段。它让曲线更平、更能拿得住,但不会让你更接近 25%。(注:之前误用「微盘 400 指数 MA15」做择时把这个策略打到只剩 1.8%——择时信号必须和策略的 beta 匹配,微盘均线配行业动量是错配,这条坑也记在这。)

为什么造不出 25%:诚实的机制账

A 股长仓策略要到 25%+,收益引擎无非几种:①规模(微盘)——本站微盘系列确实能到 30–40%,但这次刻意不倚重;②杠杆 / 择时放大——长仓不加杠杆、择时只降风险;③极致集中赌右尾——已被上面「浓缩=负 Sharpe」证伪。行业动量本身是个中速 beta(基线全期才 2.6%),超预期作为选股 alpha 稳定加 ~11.6pp,两者叠起来天花板就在 ~14% 全期 / ~8.5% OOS。这不是调参没调好——是长仓「行业 + 基本面」这条路的结构上限。要跨过 25%,只能重新引入规模引擎、上杠杆、或转多空(A 股空腿又拿不到)。所以这篇的价值不在「造出强策略」,而在钉死一个真 alpha 的量级与用法,并诚实标出它的天花板

诚实边界

train ≫ test:超预期版 train 19.8% / test 8.5%,alpha 在 OOS 明显衰减(分析师覆盖变密、超预期被更快 price in),14% 全期是被 2017–2021 拉高的,别拿全期数当未来预期。② 一致预期口径:实际年报净利(forecast/express/income_period 首次披露)vs 报告前 270 日内 ≥3 家券商预测中位,要求 |一致预期|>100 万避免小基数爆炸;换阈值结论方向不变但幅度会动。③ 幸存 / 覆盖偏差:只有被分析师覆盖的票才有超预期分,天然偏大中盘、偏有研究价值的公司——这也正是它不倚重小市值的原因,但同时限制了收益上限。④ 行业动量口径:隔夜跳空聚合、180 日窗、月频取 top-K,与已部署行业动量轮动同源。⑤ 剔 ST / 剔北交所,持仓收益用 daily.pct_chg(复权口径,曾因误用未复权 close 把基线压到 0.6%,已修)。⑥ 0.2%/边成本;⑦ 不做实盘页、不进策略总览——这是研究结论,不是交易建议。

口径与复现

· 数据:全 A 日线(daily.pct_chg 复权口径)+ 申万一级成分(sw_member_full)+ 券商预测(report_rc 约 130 万行)+ 实际净利(forecast / express / income_period 首次披露);超预期 = (实际年报净利 − 一致预期中位) / |一致预期|,一致预期 = 年报公告前 270 日内 ≥3 家券商 Q4 净利预测中位(|一致预期|>100 万)。
· 行业动量:隔夜跳空 (open/pre_close−1) 按 SW 一级聚合 → navON 累乘 → navON/navON.shift(180)−1,月频取 top-K 行业。选股:行业内「超预期>0」过滤 / 按幅度排序 topN / 全池浓缩;等权、月频、0.2%/边。
· 可复现:backtest.py · backtest_result.json(focus + timed 全配置 full/train/test)。
· 关联:行业动量轮动(选行业的底座) · PEAD 盈余漂移(方向>幅度同构) · 分析师修正(拐点 alpha) · 业绩预告事件 · A 股什么真有用(规模引擎)
· 完成于 2026-07-05。
chaoe.net · 行业动量 × 超预期实测:符号过滤是真 alpha(全期 2.6%→14.2%/Sharpe 0.78,超过已部署行业动量);符号>幅度、宽>窄(浓缩到十几只负 Sharpe);择时换风险不换收益(MDD −33%→−16% 但 CAGR 砍半)。诚实封顶:长仓「行业+基本面」到不了 25%,那个量级只有小市值引擎给。