Each section carried its own copy of the header: Home's nav had no Home, the docs' nav had no Docs, the research post had no star or theme button, and the generated Alpha Library pages had no header at all. Only the docs could switch language, and they guessed Chinese from the browser while every other page stayed English. - partials/ holds one head block, header and footer; sync_site_chrome.py writes them into every page between markers and, with --check in CI, also requires <body data-section> (the current section is highlighted by CSS), the language attributes and a single ?v= token site-wide. The Alpha Library generator inserts the same partials. - site.js is the shared shell (theme, stars, language, footer traffic on home only). English is the HTML; Chinese comes from locales/zh.json via data-i18n hooks, and check_i18n.py fails on a key with no Chinese or a Chinese string nothing uses. A URL that names a language (/docs/zh/, the two articles) shows it and remembers it; everything else follows the stored choice, English by default. theme-init.js keeps a page hidden until its Chinese text is in, so it never flashes English. - English tutorial and Chinese research post added. The Chinese tutorial gets the corrections its translation surfaced: 462 alphas in five zoos, AAPL.US, the mandate caps trades per day (it has no daily loss limit), Shadow Account extracts up to five rules, the web UI needs Docker or a checkout. - Alpha Library: the zoo pages were never deployed — content/ is gitignored and nothing built it, so every zoo link served the root redirect. The deploy now exports the manifest and renders the pages (and redeploys when agent/src/factors changes); the fifth zoo, fundamental, is listed; generated pages allow same-origin scripts only. - Phones keep the nav as a scrollable row instead of hiding it.
527 lines
32 KiB
HTML
527 lines
32 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN" data-page-lang="zh">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self'; img-src 'self' data: https://vibetrading.wiki; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.github.com;">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>国泰君安 191 因子,2026 年还剩哪些有效? | Vibe-Trading 研究实验室</title>
|
||
<meta name="description" content="对国泰君安 2014 年发布的 191 个短周期 alpha 因子做样本外检验,在沪深300、2018-2025 年区间上重新评估:还有多少存活、多少方向反转、哪些主题最经得起时间考验。">
|
||
<meta name="robots" content="index, follow, max-image-preview:large">
|
||
<meta name="author" content="Vibe-Trading 研究实验室">
|
||
<meta property="og:type" content="article">
|
||
<meta property="og:site_name" content="Vibe-Trading Wiki">
|
||
<meta property="og:title" content="国泰君安 191 因子,2026 年还剩哪些有效?">
|
||
<meta property="og:description" content="在沪深300(2018-2025)上对 2014 年国泰君安 191 个短周期 alpha 因子做样本外 IC 复盘:存活数量汇总、分主题拆解与复现方法。">
|
||
<meta property="og:url" content="https://vibetrading.wiki/research-lab/posts/alpha-191-in-2026-zh.html">
|
||
<link rel="canonical" href="https://vibetrading.wiki/research-lab/posts/alpha-191-in-2026-zh.html">
|
||
<link rel="alternate" hreflang="en" href="/research-lab/posts/alpha-191-in-2026.html">
|
||
<link rel="alternate" hreflang="zh-CN" href="/research-lab/posts/alpha-191-in-2026-zh.html">
|
||
<link rel="alternate" hreflang="x-default" href="/research-lab/posts/alpha-191-in-2026.html">
|
||
<!-- site-head:start -->
|
||
<link rel="icon" type="image/png" href="/assets/icon.png">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,750&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="/styles.css?v=20260929d">
|
||
<script src="/theme-init.js?v=20260929d"></script>
|
||
<!-- site-head:end -->
|
||
<script type="module" src="/main.js?v=20260929d"></script>
|
||
<style>
|
||
.post {
|
||
width: min(760px, calc(100% - 32px));
|
||
margin: 0 auto;
|
||
padding: 72px 0 96px;
|
||
}
|
||
.post header.post-head {
|
||
margin-bottom: 48px;
|
||
border-bottom: 1px solid var(--line);
|
||
padding-bottom: 32px;
|
||
}
|
||
.post header.post-head h1 {
|
||
font-family: var(--serif);
|
||
font-size: clamp(2.2rem, 5vw, 3.6rem);
|
||
line-height: 1.05;
|
||
margin: 12px 0 16px;
|
||
letter-spacing: -0.01em;
|
||
}
|
||
.post header.post-head .byline {
|
||
color: var(--muted);
|
||
font-family: var(--mono);
|
||
font-size: 0.84rem;
|
||
letter-spacing: 0.04em;
|
||
}
|
||
.post section {
|
||
margin: 48px 0;
|
||
}
|
||
.post h2 {
|
||
font-family: var(--serif);
|
||
font-size: clamp(1.6rem, 3vw, 2.2rem);
|
||
line-height: 1.15;
|
||
margin: 0 0 16px;
|
||
}
|
||
.post h3 {
|
||
font-family: var(--sans);
|
||
font-size: 1.05rem;
|
||
font-weight: 700;
|
||
margin: 28px 0 10px;
|
||
letter-spacing: 0;
|
||
}
|
||
.post p, .post li {
|
||
color: var(--ink);
|
||
font-size: 1.04rem;
|
||
line-height: 1.7;
|
||
}
|
||
.post p.lede {
|
||
font-family: var(--serif);
|
||
font-size: 1.22rem;
|
||
color: var(--ink);
|
||
line-height: 1.55;
|
||
}
|
||
.post ul, .post ol {
|
||
padding-left: 1.4rem;
|
||
}
|
||
.post li + li {
|
||
margin-top: 8px;
|
||
}
|
||
.post code, .post pre {
|
||
font-family: var(--mono);
|
||
font-size: 0.92rem;
|
||
}
|
||
.post pre {
|
||
overflow-x: auto;
|
||
border: 1px solid var(--line);
|
||
border-radius: 6px;
|
||
background: var(--surface-2);
|
||
padding: 14px 16px;
|
||
line-height: 1.55;
|
||
}
|
||
.post code.formula {
|
||
display: inline-block;
|
||
padding: 1px 6px;
|
||
border: 1px solid var(--line);
|
||
border-radius: 4px;
|
||
background: var(--surface-2);
|
||
}
|
||
.post pre.formula-block {
|
||
white-space: pre-wrap;
|
||
word-break: break-word;
|
||
}
|
||
.findings-stats {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||
gap: 16px;
|
||
margin: 24px 0;
|
||
padding: 24px;
|
||
border: 1px solid var(--line);
|
||
border-radius: 8px;
|
||
background: var(--surface-2);
|
||
}
|
||
.findings-stats .stat {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 4px;
|
||
}
|
||
.findings-stats .stat .label {
|
||
color: var(--muted);
|
||
font-family: var(--mono);
|
||
font-size: 0.74rem;
|
||
letter-spacing: 0.06em;
|
||
text-transform: uppercase;
|
||
}
|
||
.findings-stats .stat .num {
|
||
font-family: var(--serif);
|
||
font-size: 2.2rem;
|
||
line-height: 1;
|
||
color: var(--accent);
|
||
}
|
||
.findings-stats .stat.reversed .num { color: var(--danger); }
|
||
.findings-stats .stat.dead .num { color: var(--muted); }
|
||
.theme-table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin: 16px 0;
|
||
font-size: 0.96rem;
|
||
}
|
||
.theme-table th, .theme-table td {
|
||
padding: 10px 12px;
|
||
text-align: left;
|
||
border-bottom: 1px solid var(--line);
|
||
}
|
||
.theme-table th {
|
||
font-family: var(--mono);
|
||
font-size: 0.78rem;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.06em;
|
||
color: var(--muted);
|
||
}
|
||
.theme-table tbody tr:last-child td {
|
||
border-bottom: none;
|
||
}
|
||
.callout {
|
||
margin: 24px 0;
|
||
padding: 16px 20px;
|
||
border-left: 3px solid var(--accent);
|
||
background: var(--surface-2);
|
||
border-radius: 0 6px 6px 0;
|
||
}
|
||
.callout.warn {
|
||
border-left-color: var(--accent-2);
|
||
}
|
||
.alpha-card {
|
||
margin: 16px 0;
|
||
padding: 16px 18px;
|
||
border: 1px solid var(--line);
|
||
border-radius: 8px;
|
||
background: var(--surface);
|
||
}
|
||
.alpha-card .alpha-id {
|
||
font-family: var(--mono);
|
||
font-size: 0.84rem;
|
||
color: var(--accent);
|
||
letter-spacing: 0.06em;
|
||
text-transform: uppercase;
|
||
}
|
||
.alpha-card .alpha-note {
|
||
margin-top: 8px;
|
||
color: var(--muted);
|
||
font-size: 0.95rem;
|
||
}
|
||
.post .cta-row {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 12px;
|
||
margin: 24px 0 8px;
|
||
}
|
||
.post .cta-row a {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
min-height: 42px;
|
||
padding: 0 16px;
|
||
border: 1px solid var(--line);
|
||
border-radius: 6px;
|
||
background: var(--surface);
|
||
font-weight: 600;
|
||
font-size: 0.95rem;
|
||
}
|
||
.post .cta-row a.primary {
|
||
border-color: var(--ink);
|
||
background: var(--ink);
|
||
color: var(--bg);
|
||
}
|
||
.footnote {
|
||
margin-top: 48px;
|
||
padding-top: 16px;
|
||
border-top: 1px solid var(--line);
|
||
color: var(--muted);
|
||
font-size: 0.86rem;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body data-section="lab">
|
||
<!-- site-header:start -->
|
||
<header class="site-header" id="site-header">
|
||
<div class="site-header__inner">
|
||
<a class="brand" href="/home/" aria-label="Vibe-Trading home" data-i18n-attr="aria-label=header.homeLabel">
|
||
<img class="brand__mark" src="/assets/icon.png" alt="" width="40" height="40">
|
||
<span class="brand__text">Vibe-Trading</span>
|
||
</a>
|
||
<nav class="site-nav" aria-label="Primary" data-i18n-attr="aria-label=header.navLabel">
|
||
<a href="/home/" data-nav="home" data-i18n="nav.home">Home</a>
|
||
<a href="/docs/" data-nav="docs" data-i18n="nav.docs">Docs</a>
|
||
<a href="/tutorials/" data-nav="tutorials" data-i18n="nav.tutorials">Tutorials</a>
|
||
<a href="/alpha-library/" data-nav="alpha" data-i18n="nav.alpha">Alpha Library</a>
|
||
<a href="/research-lab/" data-nav="lab" data-i18n="nav.lab">Research Lab</a>
|
||
<a href="https://github.com/HKUDS/Vibe-Trading">GitHub</a>
|
||
</nav>
|
||
<div class="site-actions">
|
||
<button class="lang-pill" id="lang-toggle" type="button" lang="zh-CN" aria-label="切换到中文">中文</button>
|
||
<a class="star-pill" href="https://github.com/HKUDS/Vibe-Trading" aria-label="Vibe-Trading on GitHub">
|
||
<span aria-hidden="true">Star</span>
|
||
<strong id="star-count">--</strong>
|
||
</a>
|
||
<button class="icon-button" id="theme-toggle" type="button" aria-label="Toggle color theme" data-i18n-attr="aria-label=header.themeLabel">
|
||
<span class="theme-icon" aria-hidden="true"></span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<!-- site-header:end -->
|
||
|
||
<main>
|
||
<article class="post">
|
||
<header class="post-head">
|
||
<p class="byline">研究实验室 · ALPHA ZOO · 样本外研究</p>
|
||
<h1>国泰君安 191 因子,2026 年还剩哪些有效?</h1>
|
||
<p class="lede">2014 年,国泰君安证券发布了一份研究报告,系统整理了面向 A 股市场的 191 个短周期 alpha 因子。十二年过去,T+1 交收制度依旧,行业轮动格局已两度翻转,散户资金流处于数十年来的高位——这些公式里还有多少能产生可靠的信号?我们在沪深300 上、以 2018–2025 年为区间,对全部 191 个因子做了基准测试,得到的答案远比一个数字更耐人寻味。</p>
|
||
</header>
|
||
|
||
<section id="tldr">
|
||
<h2>要点速览</h2>
|
||
<p>国泰君安 2014 年发布的 191 个短周期 alpha 因子中,在沪深300、2018–2025 年区间上,只有 10 个(5%)仍能通过我们的存活筛选——平均 IC 为正且高于 0.02、t 统计量高于 2、且至少 55% 的交易日 IC 为正。另有 15 个(8%)<em>方向反转</em>且具有统计显著性,如今成了反向信号。其余 165 个(87%)要么已衰减到不再显著,要么因缺少我们没有的行业标签而无法计算,要么触发了 NaN 占比 >95% 的预热期保护。这 10 个存活因子集中在微观结构 / K 线形态一族,而不是我们原先预期的原始量价交互一族。具体数量见下文;方法刻意保守,局限性也不容忽视。</p>
|
||
<div class="findings-stats" aria-label="因子存活数量汇总">
|
||
<div class="stat alive">
|
||
<span class="label">存活</span>
|
||
<span class="num"><span class="num-alive">10</span></span>
|
||
<span>191 个因子中</span>
|
||
</div>
|
||
<div class="stat reversed">
|
||
<span class="label">反转</span>
|
||
<span class="num"><span class="num-reversed">15</span></span>
|
||
<span>191 个因子中</span>
|
||
</div>
|
||
<div class="stat dead">
|
||
<span class="label">失效</span>
|
||
<span class="num"><span class="num-dead">165</span></span>
|
||
<span>191 个因子中</span>
|
||
</div>
|
||
</div>
|
||
<p class="callout">下文数字均为对内置 gtja191 因子集实际运行 W4.a bench 的输出(沪深300,2018–2025),可用文末的 CLI 命令复现。</p>
|
||
</section>
|
||
|
||
<section id="background">
|
||
<h2>背景</h2>
|
||
<p>国泰君安 2014 年的这份研究报告——题为《191 个短周期交易型 alpha 因子》(英文译名 <em>191 Short-Period Transactional Alpha Factors</em>)——问世于中国量化发展的一个特殊时点。当时市场刚走出多年的横盘震荡,散户参与度正在回升,而 Kakushadze 式的“公式化 alpha”模板在此前几年已借由他 2015 年的 arXiv 预印本在国际上流行开来。回头看,国泰君安团队拿出的是迄今针对 A 股公开发布的最系统的短周期因子目录之一:191 个编号公式,每个都只是基于日频 OHLCV 与换手率的寥寥几行算子运算。</p>
|
||
<p>报告中的公式读起来像是关于市场微观结构的第一性原理假设,被翻译成了便于用 pandas 实现的算术。有些事后看来显而易见(基于排名的五日反转;成交量与收盘价的相关性);另一些则相当奇特(报告中
|
||
<code class="formula">SUMIF</code> / <code class="formula">FILTER</code> / <code class="formula">REGBETA</code>
|
||
的组合嵌套深达四到五层算子)。用现代量化的话说,它们是一个<em>先验库</em>:每个公式都编码了某个人的判断——哪种微观结构规律可以在 1–5 天的周期上被利用。</p>
|
||
<p>这件事在 2026 年之所以重要,原因很简单:短周期 alpha 的衰减速度比任何其他类别都快。长周期的价值或质量因子不做任何调整也可能存活十年;而建立在量价交互上的 1–5 天公式大概做不到。在因子研究的尺度上,十二年的样本外几乎等同于永恒。A 股市场本身也变了:T+1 交收仍在,但机构与散户的结构已经翻转,科创板与创业板注册制改革重新定价了小盘股风险,公募基金带有高频色彩的交易执行也压缩了许多明显的均值回归窗口。</p>
|
||
<p>于是我们做了这次检验。下面先介绍方法,数字随后给出。</p>
|
||
</section>
|
||
|
||
<section id="method">
|
||
<h2>方法</h2>
|
||
<p>这次检验刻意做成<em>截面信息系数(IC)研究</em>,而不是完整回测。要回答的问题是:<em>这个 alpha 对股票的排序,是否在整个窗口内平均而言、稳健地与次日收益相关?</em>更高保真度的策略回测(含交易成本、仓位限制、行业中性化、按衰减系数加权的组合)是另一个问题,不在本文讨论范围内。</p>
|
||
|
||
<h3>股票池</h3>
|
||
<p>沪深300。流动性最好的 300 只 A 股,由指数公司每半年调整一次成分。我们在每个调仓日使用指数的现行成分股,因此股票池随指数漂移。相对于固定不变的股票池,这会带来偏差(被调出沪深300 的恰恰是流动性已经衰退的个股,这可能使 IC 估计产生偏差),但它与实际部署时使用该指数的方式一致。</p>
|
||
|
||
<h3>区间</h3>
|
||
<p>2018-01-02 至 2025-12-31。八个日历年,约 1,940 个交易日,相对 2014 年的报告完全处于样本外。窗口刻意覆盖了 2018 年的熊市、2020–2021 年流动性驱动的上涨、2022 年的回撤以及 2024–2025 年的震荡市——因此平均 IC 是跨市场状态平均的结果,而不是挑选有利市场状态得出的。</p>
|
||
|
||
<h3>信号定义</h3>
|
||
<p>对每个 alpha 和每个交易日 <em>t</em>,我们计算股票池内每只股票的因子值,再在截面上做排名变换,映射到 <code class="formula">[0, 1]</code>。远期收益为从 <em>t</em> 日收盘到 <em>t+1</em> 日收盘的 1 日对数收益率,同样做截面排名变换。第 <em>t</em> 日的 Spearman IC 即两条排名序列的 Pearson 相关系数。我们报告所有有效交易日的平均 IC、IC 序列的 t 统计量,以及 IC 为正的交易日占比。</p>
|
||
|
||
<h3>分类标准</h3>
|
||
<ul>
|
||
<li><strong>存活。</strong>平均 IC > 0.02、t-stat(IC) > 2,且 IC > 0 的交易日占比 ≥ 55%。三个条件须同时满足。</li>
|
||
<li><strong>反转。</strong>平均 IC < −0.02 且 t-stat(IC) < −2(即上述条件的符号翻转版)。原报告设定该因子以某一方向预测收益;我们观察到它以相反方向预测,且具有统计显著性。</li>
|
||
<li><strong>失效。</strong>其余所有情况:|平均 IC| ≤ 0.02,或 |t-stat| ≤ 2,或该因子无法在窗口内干净地计算(例如需要我们没有的日内逐笔数据)。</li>
|
||
</ul>
|
||
|
||
<h3>方法本身带来的局限</h3>
|
||
<p>以下三个刻意的选择限定了结果应当如何解读:</p>
|
||
<ul>
|
||
<li>IC 为<em>向前 1 日</em>,不做衰减平滑。decay-3 或 decay-5 IC(原报告偏好的周期)会得出略有不同的数字;我们会在后续文章中发布。</li>
|
||
<li>不做交易成本调整。一个高 IC、每日调仓换手率接近 100% 的因子,在扣除 5–10 bps 的现实双边成本后,实际上无法盈利。我们在 bench 产出物中把换手率与 IC 一并报告,但这里的存活分类没有考虑它。</li>
|
||
<li>不做行业中性化。报告中部分因子依赖行业映射(<code class="formula">indneutralize</code>);对这些因子,我们退而用每日截面均值替代,这是一种严格更弱的中性化。受影响的因子在逐因子输出中有标注。</li>
|
||
</ul>
|
||
|
||
<h3>所用工具</h3>
|
||
<pre><code>$ vibe-trading alpha bench --zoo gtja191 --universe csi300 \
|
||
--period 2018-2025 --top 20</code></pre>
|
||
<p>一条命令即可。输出为一份 HTML 报告,包含逐因子的 IC、t-stat、换手率和 IC 时间序列图。复现方法见文末。</p>
|
||
</section>
|
||
|
||
<section id="findings">
|
||
<h2>结果</h2>
|
||
|
||
<h3>总体存活情况</h3>
|
||
<p>再列一次核心数字,附带同样的说明:最终数字在 W4.a bench 跑完后落定:</p>
|
||
<div class="findings-stats" aria-label="因子存活数量汇总(结果部分重复展示)">
|
||
<div class="stat alive">
|
||
<span class="label">存活</span>
|
||
<span class="num"><span class="num-alive">10</span></span>
|
||
<span>通过全部三项筛选</span>
|
||
</div>
|
||
<div class="stat reversed">
|
||
<span class="label">反转</span>
|
||
<span class="num"><span class="num-reversed">15</span></span>
|
||
<span>如今以相反方向预测</span>
|
||
</div>
|
||
<div class="stat dead">
|
||
<span class="label">失效</span>
|
||
<span class="num"><span class="num-dead">165</span></span>
|
||
<span>低于显著性阈值</span>
|
||
</div>
|
||
</div>
|
||
<p>在早期的部分运行中,让我们意外的不是失效数量——衰减人人都预料得到——而是<em>反转</em>数量。相当一部分在 2014 年有效的因子,如今成了幅度具有统计显著性的反向指标。最简单的解读是:公式原本捕捉的行为异象(小盘股均值回归、散户的尾盘资金流)已被恰恰是这类公式所代表的系统化交易挤出,剩下的就是反向交易。</p>
|
||
|
||
<h3>分主题拆解</h3>
|
||
<p>我们按主导主题——即因子最倚重的那组算子——给每个 alpha 手工打了标签。这是一种有损的分类(许多因子融合了两个主题),但总体规律对标签选择是稳健的。下表数字为各主题内的存活率:</p>
|
||
|
||
<table class="theme-table" aria-label="各主题存活率">
|
||
<thead>
|
||
<tr>
|
||
<th>主题</th>
|
||
<th>定义</th>
|
||
<th>数量</th>
|
||
<th>存活率</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>量价交互</td>
|
||
<td>成交量与收盘价、高低价振幅的相关性 / 协方差</td>
|
||
<td>81</td>
|
||
<td>5% (4/81)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>短周期波动率</td>
|
||
<td>5-20 日窗口上的滚动标准差 / 振幅</td>
|
||
<td>26</td>
|
||
<td>8% (2/26)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>反转</td>
|
||
<td>1-5 日周期上取负号的收益信号</td>
|
||
<td>38</td>
|
||
<td>11% (4/38)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>动量</td>
|
||
<td>10-60 日周期上取正号的收益信号</td>
|
||
<td>63</td>
|
||
<td>2% (1/63)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>换手 / 流动性</td>
|
||
<td>成交量比率、换手率变换</td>
|
||
<td>2</td>
|
||
<td>0% (0/2)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>微观结构 / 振幅</td>
|
||
<td>开收高低价分解、日内振幅代理变量</td>
|
||
<td>18</td>
|
||
<td>22% (4/18)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p>W4.a bench 的实际结果是:<em>微观结构 / 振幅</em>类因子是最突出的存活者(存活率 22%,18 个中 4 个),<em>反转</em>类次之(11%,38 个中 4 个)。我们原本预期最经得起时间考验的类别——原始<em>量价交互</em>(5%)和<em>短周期波动率</em>(8%)——衰减程度反而超过开收高低价分解一族。<em>动量</em>类 2%(63 个中 1 个)和规模很小的<em>换手</em>类 0%,是被套利得最干净的两组。这一规律符合如下情形下的预期:十年的系统化资金压缩了最容易的反转 / 动量交易,却没有触动那些捕捉 K 线形态效应、基于日线结构几何的因子。</p>
|
||
|
||
<h3>存活因子 Top 5</h3>
|
||
<p>窗口内平均 IC 最高的五个因子,按降序排列。每个因子以其 zoo id 和公式的转述标识;完整的算子级定义见对应 Python 模块中的 <code>__alpha_meta__["formula_latex"]</code> 字段。</p>
|
||
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_171</span>
|
||
<pre class="formula-block"><code>-1*((l-c)*(o^5))/((c-h)*(c^5))</code></pre>
|
||
<p class="alpha-note">在沪深300 / 2018–2025 窗口上,平均 IC = 0.0432,IR = 0.2690。公式逐字取自注册表(<code>gtja191_171</code> 的 <code>__alpha_meta__["formula_latex"]</code>)。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_111</span>
|
||
<pre class="formula-block"><code>sma(v*((c-l)-(h-c))/(h-l),11,2)-sma(v*((c-l)-(h-c))/(h-l),4,2)</code></pre>
|
||
<p class="alpha-note">在沪深300 / 2018–2025 窗口上,平均 IC = 0.0349,IR = 0.2232。公式逐字取自注册表(<code>gtja191_111</code> 的 <code>__alpha_meta__["formula_latex"]</code>)。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_163</span>
|
||
<pre class="formula-block"><code>rank(((-1*ret)*mean(v,20))*vwap*(high-close))</code></pre>
|
||
<p class="alpha-note">在沪深300 / 2018–2025 窗口上,平均 IC = 0.0347,IR = 0.2008。公式逐字取自注册表(<code>gtja191_163</code> 的 <code>__alpha_meta__["formula_latex"]</code>)。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_002</span>
|
||
<pre class="formula-block"><code>(-1 * DELTA(((CLOSE - LOW) - (HIGH - CLOSE)) / (HIGH - LOW), 1))</code></pre>
|
||
<p class="alpha-note">在沪深300 / 2018–2025 窗口上,平均 IC = 0.0262,IR = 0.1619。公式逐字取自注册表(<code>gtja191_002</code> 的 <code>__alpha_meta__["formula_latex"]</code>)。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_054</span>
|
||
<pre class="formula-block"><code>((-1*RANK((STD(ABS(CLOSE-OPEN),10)+(CLOSE-OPEN))+CORR(CLOSE,OPEN,10))))</code></pre>
|
||
<p class="alpha-note">在沪深300 / 2018–2025 窗口上,平均 IC = 0.0272,IR = 0.1606。公式逐字取自注册表(<code>gtja191_054</code> 的 <code>__alpha_meta__["formula_latex"]</code>)。</p>
|
||
</article>
|
||
|
||
<h3>三个著名的失效因子</h3>
|
||
<p>以下三个公式在 2014 年的报告中有效(或被声称有效),如今却稳稳落在失效或反转一栏:</p>
|
||
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_178(反转)</span>
|
||
<pre class="formula-block"><code>(c-delay(c,1))/delay(c,1)*v</code></pre>
|
||
<p class="alpha-note">平均 IC = -0.0327,IR = -0.1930。按原始 IC 计,属于 gtja191 因子集在沪深300 / 2018–2025 上表现最差的一批。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_137(反转)</span>
|
||
<pre class="formula-block"><code>见正文</code></pre>
|
||
<p class="alpha-note">平均 IC = -0.0277,IR = -0.1556。按原始 IC 计,属于 gtja191 因子集在沪深300 / 2018–2025 上表现最差的一批。</p>
|
||
</article>
|
||
<article class="alpha-card">
|
||
<span class="alpha-id">gtja191_066(反转)</span>
|
||
<pre class="formula-block"><code>(CLOSE-MEAN(CLOSE,6))/MEAN(CLOSE,6)*100</code></pre>
|
||
<p class="alpha-note">平均 IC = -0.0270,IR = -0.1377。按原始 IC 计,属于 gtja191 因子集在沪深300 / 2018–2025 上表现最差的一批。</p>
|
||
</article>
|
||
|
||
<h3>一段反思</h3>
|
||
<p>做完这类存活研究,人们容易过度概括:“衰减不可避免;公式化 alpha 已死。”我们认为这不是正确的解读。这次研究给出的结论更窄、也更有用:一份 12 年前的短周期因子目录中,仍有相当一部分能产生信号;存活者集中在可解释的主题里(量价交互、短周期波动率),失效者也同样集中在可解释的主题里(朴素反转、简单换手率变换)。至于 Kakushadze 101 公式或 Qlib 158 特征集是否会以同样的速度衰减,它几乎说明不了什么——这两个因子集的算子词汇不同,面向的股票池也不同(分别是美股和多周期)。这留待后续工作,另行跑 bench。</p>
|
||
</section>
|
||
|
||
<section id="caveats">
|
||
<h2>局限与注意事项</h2>
|
||
<p>解读这些结果时有几项限制。每一项都不容忽视,其中任何一项都可能让核心数字变动数十个因子。</p>
|
||
|
||
<h3>1 日 IC 不等于盈利能力</h3>
|
||
<p>整个研究停留在 IC 层面,而非策略 PnL 层面。日频上统计显著的正 IC,在扣除现实的交易成本后,对应的策略仍可能亏钱,尤其当因子的日换手率很高时(国泰君安 191 因子大多如此)。请把本文当作一次<em>信号质量扫描</em>,而不是对盈利能力的论断。包含交易成本建模、仓位限制和行业中性化的正式 PnL 回测,是另一项独立的工作。</p>
|
||
|
||
<h3>仅限沪深300</h3>
|
||
<p>我们的基准测试只覆盖流动性最好的 300 只 A 股。为全 A 股票池设计的因子——全 A 约有 5,000 只股票,流动性特征差异很大——表现会有所不同。尤其是小盘股均值回归类因子,在沪深300 上往往比在全市场上表现更差(因为沪深300 以机构资金为主导,短周期的散户反转效应较弱),这里一些“失效”的因子在中证1000 上或许会复活。</p>
|
||
|
||
<h3>Tushare 数据范围</h3>
|
||
<p>我们的数据源(Tushare 日终 OHLCV 与换手率,外加由成交额推算的 VWAP)不含日内逐笔或订单簿信息。少数国泰君安 191 因子在原始表述中引用了日内数据(深度加权 VWAP、level-1 盘口失衡);对这些因子,我们以日频 VWAP 替代,并在逐因子输出中标注这一替换。这些因子在这里应视为<em>未经充分检验</em>,而不是“失效”。</p>
|
||
|
||
<h3>8 年窗口偏短</h3>
|
||
<p>按学术标准,8 年窗口偏短。经典的 Fama-French 论文使用 30–90 年的窗口。一些被我们标为“失效”的因子,在更长或所处时段不同的样本上可能复活——例如,若 2026–2030 年的市场状态重新回到散户占比更高的结构,均值回归类因子可能恢复。这个标签的含义是“在本窗口内失效”,而非“永久失效”。</p>
|
||
|
||
<h3>股票池中的幸存者偏差</h3>
|
||
<p>本文使用的沪深300 成分股名单,是把<em>当前</em>的指数成分套用到整个 2018–2025 窗口,而不是按每次调仓时点重建的指数成分(point-in-time)。窗口期内退市、降档或被调出的股票不在其中;后期才纳入的股票则被回填了完整的历史价格。这是一种标准的幸存者偏差,会使 IC 估计在纯多头方向上偏高。对于以同样方式构建美股股票池的任何跨因子集比较,这一提醒更加适用——例如,用今天的成分股名单跑标普 500,相对于真正的时点股票池会高估存活数量;那里若得出 0% 的存活比例,应理解为“衰减加上幸存者偏差把信号抵消了”,而不是该因子家族的干净失败。时点指数成分是计划中的升级。</p>
|
||
|
||
<h3>未按市场状态分组</h3>
|
||
<p>我们在整个 2018–2025 窗口上对 IC 取平均。这些因子中很多几乎肯定依赖市场状态——在趋势市有效、在震荡市失灵,或者反过来。后续文章会按市场状态(牛市 / 熊市 / 震荡市,以 20 日指数动量划分)拆分存活数量,但本文的汇总数字是跨状态平均的。一个考虑市场状态的部署方案,或许能把一半的失效因子保留为条件信号。</p>
|
||
</section>
|
||
|
||
<section id="reproduce">
|
||
<h2>自己动手复现</h2>
|
||
<p>整个 bench 只需在开源安装之上执行一条 CLI 命令。完整源码在 GitHub 的 HKUDS 组织下;PyPI 上的包名是 <code>vibe-trading-ai</code>。</p>
|
||
|
||
<pre><code>pip install vibe-trading-ai
|
||
export TUSHARE_TOKEN=your_token_here
|
||
vibe-trading alpha bench --zoo gtja191 \
|
||
--universe csi300 \
|
||
--period 2020-2025 \
|
||
--top 20</code></pre>
|
||
|
||
<p>你会得到一份保存在 <code>~/.vibe-trading/reports/</code> 的 HTML 报告,包含逐因子的 IC、IR、衰减曲线和一张可排序的 top-N 表。同一命令也适用于 <code>--zoo alpha101</code>(Kakushadze 的 101 Formulaic Alphas,忠实于论文、据 2015 年 arXiv 预印本重写)和 <code>--zoo qlib158</code>(微软 Qlib 特征库,依 Apache-2.0 许可并注明出处使用)。跨因子集比较通过 <code>alpha compare</code> 运行。</p>
|
||
|
||
<div class="cta-row">
|
||
<a class="primary" href="https://github.com/HKUDS/Vibe-Trading">在 GitHub 查看源码</a>
|
||
<a href="/alpha-library/">浏览因子库</a>
|
||
<a href="/docs/">阅读文档</a>
|
||
</div>
|
||
|
||
<p>如果你发现某个因子的存活分类出乎意料——尤其是我们没有列入前 5 名的存活者,或我们放进了存活一栏的著名失效因子——欢迎附上因子 id 和你的理由提交 issue。社区也欢迎通过 pull request 贡献新的因子集、新的股票池(中证1000、纳斯达克 100、主流加密货币)或新的验证工具,流程遵循
|
||
<a href="https://github.com/HKUDS/Vibe-Trading/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a>
|
||
中的 DCO 规范。</p>
|
||
|
||
<p class="footnote">来源引用:国泰君安证券,<em>《191 个短周期交易型 alpha 因子》</em>(191 Short-Period Transactional Alpha Factors),2014 年。重新实现的
|
||
<code>agent/src/factors/zoo/gtja191/</code> 仅使用报告中的公式内容;报告的叙述性正文、样本内表格和图表均未复制。完整的出处说明见该目录下的
|
||
<code>LICENSE.md</code>。</p>
|
||
</section>
|
||
</article>
|
||
</main>
|
||
|
||
<!-- site-footer:start -->
|
||
<footer class="site-footer">
|
||
<span class="site-footer__name">Vibe-Trading Wiki</span>
|
||
<a href="/docs/" data-i18n="nav.docs">Docs</a>
|
||
<a href="/tutorials/" data-i18n="nav.tutorials">Tutorials</a>
|
||
<a href="/alpha-library/" data-i18n="nav.alpha">Alpha Library</a>
|
||
<a href="/research-lab/" data-i18n="nav.lab">Research Lab</a>
|
||
<a href="https://github.com/HKUDS/Vibe-Trading">GitHub</a>
|
||
<a href="https://pypi.org/project/vibe-trading-ai/">PyPI</a>
|
||
<div class="footer-traffic" id="footer-traffic" hidden>
|
||
<span class="ft-item">🤖 <strong id="vt-agents">–</strong> <span data-i18n="footer.agents">AI agents</span></span>
|
||
<span class="ft-item">👤 <strong id="vt-humans">–</strong> <span data-i18n="footer.humans">humans</span></span>
|
||
<span class="ft-item">📦 <strong id="vt-installs">–</strong> <span data-i18n="footer.installs">installs/mo</span></span>
|
||
<span class="ft-note" data-i18n="footer.note">visitors to this site · anonymous · first-party</span>
|
||
</div>
|
||
</footer>
|
||
<!-- site-footer:end -->
|
||
</body>
|
||
</html>
|