Alpha 研学
AI · 可解释 Alpha 因子

结构化字段之外,
文本还剩多少 alpha?

当数据库已经公开了同一事件的关键数字,LLM 读公告正文还能多告诉我们什么? 以 A 股业绩预告为检验场 —— 增量存在与否,两个方向都是结论。

防 look-ahead 样本外滚动 纯代码回测 有对照组 阴性结果也是结论
下载答辩 PDFdefense_slides_v7.pdf · 13 页 · 567 KB
收益怎么拆成几笔账、为什么转到横截面、Rank IC 的偏置如何在聚合中显形、pit_merge 怎么挡住穿越,最后是那条不许 LLM 碰回测的四步闭环。内部过程稿:讲的是方法与纪律,不含最终因子与结果(ADR-0003)。
统计口径回测方法踩坑

那个 t = 5.93 是假的

持有 60 天、用 20 日前向收益,相邻交易日的 IC 高度重叠,朴素 t 值把显著性夸大了三到四倍——同一组数据,Newey-West 修正后 t 从 5.93 掉到 1.60,直接从「极显著」变成「不显著」。

重叠是怎么发生的
  t 日   ├──── 未来 20 日收益 ────┤
  t+1 日  ├──── 未来 20 日收益 ────┤   ← 与上一行重叠 19 天
  t+2 日   ├──── 未来 20 日收益 ────┤   ← 又重叠 19 天

  → IC 序列严重自相关 → 有效样本量远小于观测天数
  → 朴素 t = mean / (std / √n) 里的 n 是虚高的

同一组数据,两种口径
  t (朴素)              5.93   ████████████  「极显著」
  t (Newey-West, lag=20) 1.60   ███           连 5% 都过不了
防泄漏点时间行业中性化

行业分类本身也会「泄漏未来」

2021 年申万改版把「采掘」拆成「煤炭 / 石油石化」、「化工」更名「基础化工」——拿改版后的标签去中性化 2016 年的横截面,等于提前知道了分类结果。行业分类不是静态属性,是带生效区间的时序数据。

✗ 快照式:取最新一版分类,回填全历史
   2016 ────────────────────────── 2021
   │ 基础化工  基础化工  基础化工 │  ← 2016 年根本不存在这个分类
   └──────────────────────────────┘

✓ 点时间:只在生效区间内赋值
   ├── 化工 ──────────┼── 基础化工 ──┤
   info_publ_date   cancel_date

验证:同一只股票
   2020-06-01 横截面 → 「化工」      (申万 2014 版)
   2021-12-01 横截面 → 「基础化工」  (申万 2021 改版后)
行业中性化回测方法裁决

中性化砍掉四成预测力,但剩下的那六成才是真的

一个事件驱动因子,做完市值中性看着很漂亮;再加行业中性,Rank IC 直接掉了约四成——说明近一半的「预测力」其实来自行业轮动,不是事件本身。

逐步加修正,看每一步吃掉多少(IC 相对值)
  A 未复权            ████████▊        (基准)
  B 复权              █████████▋       ↑ 略升
  C 复权 + 市值中性     █████████▍       ≈ 持平,但 ICIR 明显改善
  D 复权 + 市值 + 行业   █████▍           ↓ 削去约四成

  ⚠ A→C 一路看涨,很容易就停在 C 收工
     D 才是该报的那个数
复权数据契约踩坑

千分之三的日子出错,但错的时候是灾难级

导出 SQL 里 adj_factor 被写死成 1.0,价格实际从未复权——只有 0.31% 的日观测受影响,可那些日子的收益率偏差最大到 189%,而除权日恰好扎堆在预告季之后,正落在待检验的持有窗口里。

未复权 close 序列(送转当日)
  10.2  10.3  10.1  ──▼──  5.1   5.2
                      ↑
                 看起来「一天跌 50%」
                 实际是 10 送 10,财富没变

受影响面(A股 2015–2021,580 万日观测)
  受影响观测   0.31%   ▏
  偏差中位     1.08%   ▏
  偏差均值     8.60%   ▍
  偏差 90 分位 34.3%   ██
  偏差最大    189%     ████████
  偏差 > 5pt 的观测:4029 个
路线图工程设置

五天可信底座路线图

先把「防未来数据 + 样本外划分 + 纯代码回测」做成有测试的可信底座,再让 LLM 提因子——没有可靠回测,生成再多因子也没意义。

M0 数据契约 → M1 PIT 对齐 → M2 因子引擎 → M3 回测(纯代码)
                                            └── 可信底座到此 ✔ 全部有 pytest
M4 LLM 封装 → M5 三 Agent 闭环 → M6 汇总与可解释性
样本外回测方法

样本外只能按日期滚动,不能随机打乱

时间序列里随机划分训练/测试等于用未来教过去——样本外必须严格按日期切,train_end 之后的每一天都是「当时不可见」的检验区。

|<──── 训练区 (≤ train_end) ────>|<──── 样本外区 (> train_end) ────>|
时间轴 ─────────────────────────●─────────────────────────────────▶
                            train_end
✗ 随机 shuffle 后再切:测试点可能早于训练点 → 信息泄漏
✓ 只按日期切:测试永远在训练之后
防泄漏point-in-time

一张时间线讲清「防未来数据」

财报要用「公告日 ann_date」对齐,而不是「报告期 report_period」——T 日的因子只能看见 ann_date ≤ T 的数据,否则就偷看了未来。

报告期 2026Q1 (report_period = 2026-03-31)
      │
      │   真空期:季报还没公布,这段时间不能用 Q1 数据
      ▼
公告日 ann_date = 2026-04-28  ← 从这天起,因子才允许引用 Q1 财报
      │
      ▼
可用区间 [ann_date, +∞)  →  pit_merge 只并入 ann_date ≤ 当日 的最新一期
数据契约防幸存者偏差

三张表的数据契约:先定协议,再填数据

在拿到聚源数据前,先把输入表结构写死成契约——尤其把「历史成分股」单列一张表,不然回测会只看今天还活着的股票,天然偏乐观。

prices        date, code, open/high/low/close, vol, amount, adj_factor
fundamentals  code, report_period, ann_date, <财务字段…>   ← ann_date 用于时间对齐
universe      date, code                                    ← 历史成分股,防幸存者偏差
                  └── 回测只在「当日在册」的股票上做横截面

论文说因子的可解释性"可一路回溯到具体字段与有限算子"。点任意节点(含右上角的评价指标),看它的完整上游链路 —— 这张图就是那句话的证据。

原始字段对齐与预处理白名单算子因子类别评价指标带防线的节点
原始字段三张表的列,一切数值的起点对齐与预处理决定 T 日能看见什么白名单算子受限 AST,禁止任意代码执行因子类别只到类别,不含表达式closeamountvoladj_factormktcapindustryann_datereport_periodepsbook_value_per_sharenet_incometotal_equitytotal_assetsoperating_cash_flowuniversepit_merge前复权价前向收益winsorizezscoreneutralizerankcs_rankts_meants_stddelaydeltasafe_divsigned_log价值质量动量低波动流动性

← 左右滑动查看完整图 →

方法与系统已就位,真结果在路上。以下链接均指向仓库最新版本。

方法演示 答辩演示 · 断网可用

研究面板 · 业绩预告事件 → 市场反应

选一只股票,把业绩预告披露日标在复权 K 线上,再观察下一交易日起的市场反应; 也可以构建组合、浏览公开基线因子结果,或用预设问题切换研究视图。

所有市场数值由 Python 在构建期确定性计算并导成 JSON。披露标记使用 publ_date, “若当时买入”只从 usable_from 起算;真实因子表达式与调优参数不进入公开产物。

研究面板与想法流独立构建、独立部署。原站只提供入口,不共享组件,也不依赖 panel 的运行状态。

论文 初步实证 · 持续追加中

短论文 · 可解释 Alpha 因子生成智能体

问一个可证伪的问题:当结构化数据已经公开了同一事件的关键数字时,LLM 读文本还能多告诉我们什么? 以 A 股业绩预告为检验场,让 LLM 提假设、让确定性代码裁决真伪 —— 增量存在与否,两个方向都是结论。

实验用聚源 JYDB 真实数据,窗口已由 2020–2021 扩至 2015–2021。此前版本存在两处已修正的缺陷: 复权因子被写死为 1.0(价格实为未复权),以及缺少行业分类因而无法做行业中性化。 统计口径改用 Newey-West 修正 t 值 —— 持有期重叠会把朴素 t 值高估三到四倍(实测 5.93 → 1.60)。 尚未纳入停牌涨跌停 ST 过滤。结果定位为「初步实证与系统验收」,不是稳健的 alpha 发现。

站内是我选定的快照版本;论文在仓库里持续追加,想看最新进展的直接进仓库。

工单入口

提问 / 建议

在这里直接提交,系统会用项目账号同步成一条 GitHub Issue —— 你不需要 GitHub 账号。仓库公开,请勿填敏感数据。

截图
点此后粘贴截图,也可拖入图片。

历史工单

最近提交

正在读取...