读懂Vibe-Trading alpha bench --strict:随机对照组与样本外门槛的硬门禁
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
在量化因子研究里,"IC 显著"并不等于"因子有效"。Vibe-Trading 是一个面向个人投资者的 AI 交易代理("Your Personal Trading Agent"),它内置了 450+ 个量化 alpha 因子库(Alpha Zoo)。通过一条alpha bench --strict命令,你可以为每个因子加上一道随机对照组 + 样本外验证的硬门禁,快速筛掉"看起来有效、其实是噪音"的假因子。本文带你读懂这套严格基准测试(strict bench)的设计逻辑与使用方法。
为什么传统"alive"门禁容易被骗?
Vibe-Trading 内置 4 个因子动物园(zoo):qlib158(Qlib Alpha158)、alpha101(Kakushadze 101 公式化 alpha)、gtja191(国君证券 191 因子)、academic(Fama-French 五因子 + Carhart 动量)。
默认基准测试(bench_runner.py)的判定很朴素:
- 平均 IC > 0.02
- IC 为正的比例 > 0.55
- 单样本 t 值 > 2
满足就标记为alive(存活)。问题在于:这套门禁是跟"零"比较的。如果某因子的 IC 其实来自共享的横截面 beta(比如市场风格、市值效应),那么把因子值随机打乱后算出来的 IC 可能差不多高——传统门禁对此毫无察觉。
A 股社区的 9 个月审计(12 个单因子 + 191 个 GTJA 变体)给出的结论非常扎心:每个因子都能在某个参数设置下通过原始 IC 测试,但只有12 个中的 1 个能通过并行的随机对照检验。这就是--strict模式诞生的直接原因。
--strict 如何构建"随机对照组"?
核心实现在 bench_runner_strict.py。它的关键步骤:
- 行内打乱(row shuffle):对每个交易日,把因子值在同一行(同一天的截面)内随机重排,保留截面分布、彻底破坏"信号→股票"的对应关系。NaN/inf 单元格原地固定(见
_shuffle_within_rows())。 - 多组对照取均值:默认用 5 个随机种子各打乱一次,逐日 IC 取均值,得到一个稳定的"零信息基线"IC 序列(
compute_random_ic_series())。 - 配对 alpha:每个交易日计算
信号IC − 随机IC,再对这个差值序列做单样本 t 检验,得到alpha_t。只有因子显著优于随机打乱自己,才算通过第一道关。
这个设计等价于 Harvey-Liu-Zhu(2016)多重检验修正的效果:在大因子库中,发表级因子的 |t| 阈值应接近 3.5 而非 2.0。StrictThresholds 保留了 2.0 的默认值以兼容旧结果,也支持传 3.5 做更严的检验。
一个值得注意的工程细节:random_control参数是必填且无默认值的(见 run_bench_strict())。漏传会直接抛TypeError——因为一次真实的事故证明,意外跳过随机对照会让 alpha 虚高 3~8 个百分点。
样本外(OOS)硬门禁:train/test 双段验证
光有随机对照还不够。因子可能在训练期"碰巧"强于随机,样本外就失效。--oos-split参数(如--oos-split 2023-01-01)把数据按日期切成训练段与测试段(边界日只进训练段,防止泄漏),两段必须各自独立通过 t 值门槛。
读懂 4 类判定结果
categorise_strict()会把每个因子归入 4 类,输出中带有对应计数:
| 类别 | 含义 | 新手理解 |
|---|---|---|
confirmed_alive✅ | 全样本 + 训练段 + 测试段全部通过 | 真正存活的因子 |
train_only⚠️ | 全样本通过,但样本外掉进噪音区间 | "过拟合候选",谨慎对待 |
reversed_strict❌ | 配对 alpha 显著为负,或样本外方向翻转 | 信号其实是反的,诊断价值最高 |
noise🤷 | 与随机无法区分 | 直接忽略 |
另外ic_count < 30(有效样本不足 30 个)的因子会被直接判为noise,避免小样本 t 值虚高。
快速上手:一条命令跑严格基准
先安装(如需要):
git clone https://gitcode.com/GitHub_Trending/vi/Vibe-Trading然后一条命令即可开启严格门禁:
vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025 \ --strict --oos-split 2023-01-01常用参数速查:
--strict:开启强制随机对照组(核心开关)--oos-split YYYY-MM-DD:样本外切分点,只与--strict搭配生效--random-seeds N:随机对照种子数,默认 5;调大可收紧 t 值,但速度约慢 6 倍--top N:保留 Top-N 因子,默认 20
运行横幅会明确标注[strict: random control, oos 2023-01-01],让你在结果里一眼确认门禁已生效(见 cli_handlers.py 的入口装配与 命令行参数定义)。CLI 行为由 test_alpha_bench_strict_cli.py 等测试持续守护。
写在最后
alpha bench --strict的本质,是把"因子研究中最容易自欺欺人的两处"——没跟随机比和没做样本外——变成流程里的强制步骤。对于新手而言,记住三条就够用:
- 没加
--strict的alive结果,只配当初筛; - 看结果先数
confirmed_alive,再研究train_only为什么掉队; - 想更严格,把阈值提到 3.5(Harvey-Liu-Zhu 建议值)。
让门禁替你把噪音挡在门外,你的研究时间才能花在真正有效的因子上。🎯
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考