国泰君安 191 因子,2026 年还剩哪些有效?
2014 年,国泰君安证券发布了一份研究报告,系统整理了面向 A 股市场的 191 个短周期 alpha 因子。十二年过去,T+1 交收制度依旧,行业轮动格局已两度翻转,散户资金流处于数十年来的高位——这些公式里还有多少能产生可靠的信号?我们在沪深300 上、以 2018–2025 年为区间,对全部 191 个因子做了基准测试,得到的答案远比一个数字更耐人寻味。
2026-09-29 修订。本文第一版(2026-05-17)使用的 Tushare 价格未做除权除息复权——跨越除权日的收益率读到的是机械性的价格缺口,而且总是偏向下跌——并且把最新的沪深300 成分名单套用到了整个窗口。这两个问题已于 2026-08-04 修复;自 2026-09 起,某根 K 线上只要因子的任一输入缺失,因子就不输出值,而不是用缺失数据生成信号。第一版报告的是存活 10 个、反转 15 个、失效 165 个;下文所有数字均来自在当前代码上的重新运行。
要点速览
国泰君安 2014 年发布的 191 个短周期 alpha 因子中,在沪深300、2018–2025 年区间上,只有 8 个(4%)仍能通过我们的存活筛选——平均 IC 为正且高于 0.02、t 统计量高于 2、且至少 55% 的交易日 IC 为正。另有 14 个(7%)方向反转且具有统计显著性,如今成了反向信号。另外 168 个(88%)在两个方向上都已不再显著;还有 1 个(gtja191_138)完全无法检验:它的输出 99% 是 NaN。8 个存活因子中有一半带有微观结构 / K 线形态标签,这是各主题中最高的存活率,而不是我们原先预期的原始量价交互一族。具体数量见下文;方法刻意保守,局限性也不容忽视。
下文数字来自 2026-09-29 的一次 bench 运行(Vibe-Trading 0.1.16:沪深300 时点成分、复权价格,2018–2025),可用文末的 CLI 命令复现。
背景
国泰君安 2014 年的这份研究报告——题为《191 个短周期交易型 alpha 因子》(英文译名 191 Short-Period Transactional Alpha Factors)——问世于中国量化发展的一个特殊时点。当时市场刚走出多年的横盘震荡,散户参与度正在回升,而“公式化 alpha”模板要到一年后,才借由 Kakushadze 2015 年的 arXiv 预印本 101 Formulaic Alphas 在国际上流行开来。回头看,国泰君安团队拿出的是迄今针对 A 股公开发布的最系统的短周期因子目录之一:191 个编号公式,每个都只是基于日频 OHLCV 与换手率的寥寥几行算子运算。
报告中的公式读起来像是关于市场微观结构的第一性原理假设,被翻译成了便于用 pandas 实现的算术。有些事后看来显而易见(基于排名的五日反转;成交量与收盘价的相关性);另一些则相当奇特(报告中
SUMIF / FILTER / REGBETA
的组合嵌套深达四到五层算子)。用现代量化的话说,它们是一个先验库:每个公式都编码了某个人的判断——哪种微观结构规律可以在 1–5 天的周期上被利用。
这件事在 2026 年之所以重要,原因很简单:短周期 alpha 的衰减速度比任何其他类别都快。长周期的价值或质量因子不做任何调整也可能存活十年;而建立在量价交互上的 1–5 天公式大概做不到。在因子研究的尺度上,十二年的样本外几乎等同于永恒。A 股市场本身也变了:T+1 交收仍在,但机构与散户的结构已经翻转,科创板与创业板注册制改革重新定价了小盘股风险,公募基金带有高频色彩的交易执行也压缩了许多明显的均值回归窗口。
于是我们做了这次检验:先讲方法,再给数字。
方法
这次检验刻意做成截面信息系数(IC)研究,而不是完整回测。要回答的问题是:这个 alpha 对股票的排序,是否在整个窗口内平均而言、稳健地与次日收益相关?更高保真度的策略回测(含交易成本、仓位限制、行业中性化、按衰减系数加权的组合)是另一个问题,不在本文讨论范围内。
股票池
沪深300:流动性最好的 300 只 A 股,由指数公司每半年调整一次成分。每个交易日的截面,取 Tushare 月末成分名单中当日有效的指数成分,因此一只股票只在它属于指数的期间计入——窗口期内共有 348 只股票曾是成分股。价格已做除权除息前复权。
区间
2018-01-02 至 2025-12-31。八个日历年,约 1,940 个交易日,相对 2014 年的报告完全处于样本外。窗口刻意覆盖了 2018 年的熊市、2020–2021 年流动性驱动的上涨、2022 年的回撤以及 2024–2025 年的震荡市——因此平均 IC 是跨市场状态平均的结果,而不是挑选有利市场状态得出的。
信号定义
对每个 alpha 和每个交易日 t,我们计算股票池内每只股票的因子值,再在截面上做排名变换,映射到 [0, 1]。远期收益为从 t 日收盘到 t+1 日收盘的 1 日简单收益率,同样做截面排名变换。第 t 日的 Spearman IC 即两条排名序列的 Pearson 相关系数。我们报告所有有效交易日的平均 IC、IC 序列的 t 统计量,以及 IC 为正的交易日占比。
分类标准
- 存活。平均 IC > 0.02、t-stat(IC) > 2,且 IC > 0 的交易日占比 ≥ 55%。三个条件须同时满足。
- 反转。平均 IC < −0.02 且 t-stat(IC) < −2(即上述条件的符号翻转版)。原报告设定该因子以某一方向预测收益;我们观察到它以相反方向预测,且具有统计显著性。
- 失效。其余所有能够计算的情况:|平均 IC| ≤ 0.02,或 |t-stat| ≤ 2,或 IC 为正的交易日不足 55%。输出中 NaN 占比超过 95% 的因子完全不参与检验,单独列出。
方法本身带来的局限
以下三个刻意的选择限定了结果应当如何解读:
- IC 为向前 1 日,不做衰减平滑。decay-3 或 decay-5 IC(原报告偏好的周期)会得出略有不同的数字;我们会在后续文章中发布。
- 不做交易成本调整。一个高 IC、每日调仓换手率接近 100% 的因子,在扣除 5–10 bps 的现实双边成本后,实际上无法盈利。bench 不测量换手率,这里的存活分类也没有考虑它。
- 不做行业中性化。国泰君安 191 因子没有一个需要行业标签,因此这里所有 IC 都是在原始截面上测得的。
所用工具
$ vibe-trading alpha bench --zoo gtja191 --universe csi300 \
--period 2018-2025 --top 20
一条命令即可。它会在 ~/.vibe-trading/reports/ 下写一份 HTML 报告,列出按 IR 排名靠前的因子(平均 IC、IC 标准差、IR、IC 为正的交易日占比、交易日数),以及无法计算的因子。复现方法见文末。
结果
总体存活情况
再列一次核心数字:
让我们意外的不是失效数量——衰减人人都预料得到——而是反转数量。相当一部分在 2014 年有效的因子,如今成了幅度具有统计显著性的反向指标。最简单的解读是:公式原本捕捉的行为异象(小盘股均值回归、散户的尾盘资金流)已被恰恰是这类公式所代表的系统化交易挤出,剩下的就是反向交易。
分主题拆解
每个因子在注册表元数据里带有一到两个主题标签——即它最倚重的那组算子。带两个标签的因子在两行中都会计入,因此各行数量之和超过 190。下表数字为各主题内的存活率:
| 主题 | 定义 | 数量 | 存活率 |
|---|---|---|---|
| 量价交互 | 成交量与收盘价、高低价振幅的相关性 / 协方差 | 81 | 4% (3/81) |
| 短周期波动率 | 5-20 日窗口上的滚动标准差 / 振幅 | 26 | 8% (2/26) |
| 反转 | 1-5 日周期上取负号的收益信号 | 38 | 8% (3/38) |
| 动量 | 10-60 日周期上取正号的收益信号 | 63 | 0% (0/63) |
| 换手 / 流动性 | 成交量比率、换手率变换 | 2 | 0% (0/2) |
| 微观结构 / 振幅 | 开收高低价分解、日内振幅代理变量 | 18 | 22% (4/18) |
| 情绪 | 市场下跌日中个股上涨的占比(仅 gtja191_075 一个因子,基准为代理变量) |
1 | 0% (0/1) |
重新运行的结果是:微观结构 / 振幅类因子是最突出的存活者(22%,18 个中 4 个)。反转和短周期波动率其次,都是 8%(38 个中 3 个、26 个中 2 个),原始量价交互为 4%(81 个中 3 个)。动量类 63 个无一存活——其中 5 个如今以相反方向预测——规模很小的换手类 2 个也无一存活。这一规律符合如下情形下的预期:十年的系统化资金压缩了最容易的反转 / 动量交易,却没有触动那些捕捉 K 线形态效应、基于日线结构几何的因子。
存活因子 Top 5
窗口内 IR(平均 IC 除以其标准差)最高的五个因子,按降序排列,公式均为注册表中的原样(对应 Python 模块的 __alpha_meta__["formula_latex"])。
((RANK(DELAY(((HIGH-LOW)/(SUM(CLOSE,5)/5)),2)) * RANK(RANK(VOLUME))) / (((HIGH-LOW)/(SUM(CLOSE,5)/5))/(VWAP-CLOSE)))
在沪深300 / 2018–2025 窗口上,平均 IC = 0.0606,IR = 0.2926。公式逐字取自注册表(gtja191_114 的 __alpha_meta__["formula_latex"])。
-1*((l-c)*(o^5))/((c-h)*(c^5))
在沪深300 / 2018–2025 窗口上,平均 IC = 0.0435,IR = 0.2299。公式逐字取自注册表(gtja191_171 的 __alpha_meta__["formula_latex"])。
rank(vwap-close)/rank(vwap+close)
在沪深300 / 2018–2025 窗口上,平均 IC = 0.0452,IR = 0.2119。公式逐字取自注册表(gtja191_120 的 __alpha_meta__["formula_latex"])。
sma(v*((c-l)-(h-c))/(h-l),11,2)-sma(v*((c-l)-(h-c))/(h-l),4,2)
在沪深300 / 2018–2025 窗口上,平均 IC = 0.0355,IR = 0.1888。公式逐字取自注册表(gtja191_111 的 __alpha_meta__["formula_latex"])。
rank(((-1*ret)*mean(v,20))*vwap*(high-close))
在沪深300 / 2018–2025 窗口上,平均 IC = 0.0342,IR = 0.1674。公式逐字取自注册表(gtja191_163 的 __alpha_meta__["formula_latex"])。
三个如今方向相反的因子
平均 IC 最负的三个因子。三者都在反转一栏:它们如今以与报告设定相反的方向预测收益,且具有统计显著性。
(close-vwap)/decay_linear(rank(tsmax(close,30)),2)
平均 IC = -0.0518,IR = -0.2516。在沪深300 / 2018–2025 上,是 gtja191 因子集中平均 IC 最负的因子。
(c-delay(c,1))/delay(c,1)*v
平均 IC = -0.0329,IR = -0.1644。平均 IC 第二负。
16*((c-dc1+(c-o)/2+dc1-do1)/MAX_term) * MAX(abs(h-dc1), abs(l-dc1))
平均 IC = -0.0300,IR = -0.1464。平均 IC 第三负。MAX_term 是报告中分三段取值的分母,由 |h − dc1|、|l − dc1|、|h − dl1| 和 |dc1 − do1| 构成(dc1、do1、dl1 分别为前一日的收盘价、开盘价和最低价);完整定义见模块代码。
一段反思
做完这类存活研究,人们容易过度概括:“衰减不可避免;公式化 alpha 已死。”我们认为这不是正确的解读。这次研究给出的结论更窄、也更有用:一份 12 年前的短周期因子目录中,仍有一小部分——190 个中的 8 个——能产生信号;存活者集中在一个可解释的主题里(K 线几何:开收高低价分解),失效者也同样集中在可解释的主题里(动量类无一存活、5 个方向翻转,以及简单的换手率变换)。至于 Kakushadze 101 公式或 Qlib 158 特征集是否会以同样的速度衰减,它几乎说明不了什么——这两个因子集的算子词汇不同,面向的股票池也不同(分别是美股和多周期)。这留待后续工作,另行跑 bench。
局限与注意事项
解读这些结果时有几项限制。每一项都不容忽视,其中任何一项都可能让核心数字变动数十个因子。
1 日 IC 不等于盈利能力
整个研究停留在 IC 层面,而非策略 PnL 层面。日频上统计显著的正 IC,在扣除现实的交易成本后,对应的策略仍可能亏钱,尤其当因子的日换手率很高时(国泰君安 191 因子大多如此)。请把本文当作一次信号质量扫描,而不是对盈利能力的论断。包含交易成本建模、仓位限制和行业中性化的正式 PnL 回测,是另一项独立的工作。
仅限沪深300
我们的基准测试只覆盖流动性最好的 300 只 A 股。为全 A 股票池设计的因子——全 A 约有 5,000 只股票,流动性特征差异很大——表现会有所不同。尤其是小盘股均值回归类因子,在沪深300 上往往比在全市场上表现更差(因为沪深300 以机构资金为主导,短周期的散户反转效应较弱),这里一些“失效”的因子在中证1000 上或许会复活。
Tushare 数据范围
我们的数据源是 Tushare 日终 OHLCV 与成交额,已做除权除息前复权,VWAP 由成交额推算;不含日内逐笔或订单簿数据。有 5 个国泰君安 191 因子引用了面板中没有的输入——基准指数收盘价(gtja191_075、_149、_181、_182)或多因子回归残差(gtja191_030)——改用了代理变量:截面平均收盘价,或日收益率平方的加权平均,各因子的说明中均有写明。这 5 个因子在这里应视为未经充分检验,而不是“失效”。
8 年窗口偏短
按学术标准,8 年窗口偏短。经典的 Fama-French 论文使用 30–90 年的窗口。一些被我们标为“失效”的因子,在更长或所处时段不同的样本上可能复活——例如,若 2026–2030 年的市场状态重新回到散户占比更高的结构,均值回归类因子可能恢复。这个标签的含义是“在本窗口内失效”,而非“永久失效”。
股票池中的幸存者偏差
本文第一版把最新的沪深300 成分名单套用到整个 2018–2025 窗口,每只股票之所以在列,都是因为它存活到了最后——这是一个事后挑选的集合,会使 IC 偏高。重新运行时,每个交易日的截面都按当日有效的成分名单筛选(窗口期内共有 348 只股票曾是成分股)。sp500 股票池仍使用今天的成分名单,因此在它上面做的任何跨因子集比较都适用同样的提醒——它的 bench 报告会写明这一点——那里较低的存活数应理解为“衰减加上幸存者偏差”,而不是该因子家族的干净失败。
190 个公式,各测一次
在同一窗口上检验 190 个公式,总会有一些仅凭运气显得不错。bench 会报告:如果所有公式都不含任何信号,预期的最高 IR 有多大——这里是 0.204。实际最高的 IR 为 0.293(gtja191_114),通过了这一校正(概率 0.9999)。另有两个存活因子高于 0.204——gtja191_171(0.230)和 gtja191_120(0.212);其余五个的 IR 在 0.130 到 0.189 之间,低于这一水平,应视为候选信号而非已确认的信号。
未按市场状态分组
我们在整个 2018–2025 窗口上对 IC 取平均。这些因子中很多几乎肯定依赖市场状态——在趋势市有效、在震荡市失灵,或者反过来。后续文章会按市场状态(牛市 / 熊市 / 震荡市,以 20 日指数动量划分)拆分存活数量,但本文的汇总数字是跨状态平均的。一个考虑市场状态的部署方案,或许能把一半的失效因子保留为条件信号。
自己动手复现
整个 bench 只需在开源安装之上执行一条 CLI 命令。完整源码在 GitHub 的 HKUDS 组织下;PyPI 上的包名是 vibe-trading-ai。
pip install vibe-trading-ai
export TUSHARE_TOKEN=your_token_here
vibe-trading alpha bench --zoo gtja191 \
--universe csi300 \
--period 2018-2025 \
--top 20
你会得到一份保存在 ~/.vibe-trading/reports/ 的 HTML 报告,列出按 IR 排名靠前的因子,以及无法计算的因子。同一命令也适用于 --zoo alpha101(Kakushadze 的 101 Formulaic Alphas,忠实于论文、据 2015 年 arXiv 预印本重写)和 --zoo qlib158(微软 Qlib 特征库,依 Apache-2.0 许可并注明出处使用)。跨因子集比较通过 alpha compare 运行。
如果你发现某个因子的存活分类出乎意料——尤其是我们没有列入前 5 名的存活者,或你原本以为会存活却落入反转一栏的因子——欢迎附上因子 id 和你的理由提交 issue。社区也欢迎通过 pull request 贡献新的因子集、新的股票池(中证1000、纳斯达克 100、主流加密货币)或新的验证工具,流程遵循 CONTRIBUTING.md 中的 DCO 规范。
来源引用:国泰君安证券,《191 个短周期交易型 alpha 因子》(191 Short-Period Transactional Alpha Factors),2014 年。重新实现的
agent/src/factors/zoo/gtja191/ 仅使用报告中的公式内容;报告的叙述性正文、样本内表格和图表均未复制。完整的出处说明见该目录下的
LICENSE.md。