alpha101v 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alpha101v-0.1.2/LICENSE +21 -0
- alpha101v-0.1.2/PKG-INFO +271 -0
- alpha101v-0.1.2/README.md +242 -0
- alpha101v-0.1.2/pyproject.toml +46 -0
- alpha101v-0.1.2/setup.cfg +4 -0
- alpha101v-0.1.2/src/alpha101v/__init__.py +128 -0
- alpha101v-0.1.2/src/alpha101v/adapters/__init__.py +18 -0
- alpha101v-0.1.2/src/alpha101v/adapters/adjust.py +224 -0
- alpha101v-0.1.2/src/alpha101v/adapters/industry.py +130 -0
- alpha101v-0.1.2/src/alpha101v/adapters/mongo.py +234 -0
- alpha101v-0.1.2/src/alpha101v/elemwise.py +193 -0
- alpha101v-0.1.2/src/alpha101v/extreme.py +105 -0
- alpha101v-0.1.2/src/alpha101v/factors.py +1348 -0
- alpha101v-0.1.2/src/alpha101v/neutralize.py +204 -0
- alpha101v-0.1.2/src/alpha101v/operators.py +502 -0
- alpha101v-0.1.2/src/alpha101v/panel.py +219 -0
- alpha101v-0.1.2/src/alpha101v/registry.py +158 -0
- alpha101v-0.1.2/src/alpha101v.egg-info/PKG-INFO +271 -0
- alpha101v-0.1.2/src/alpha101v.egg-info/SOURCES.txt +43 -0
- alpha101v-0.1.2/src/alpha101v.egg-info/dependency_links.txt +1 -0
- alpha101v-0.1.2/src/alpha101v.egg-info/requires.txt +10 -0
- alpha101v-0.1.2/src/alpha101v.egg-info/top_level.txt +1 -0
- alpha101v-0.1.2/tests/test_adapters_real_data.py +322 -0
- alpha101v-0.1.2/tests/test_adjust.py +150 -0
- alpha101v-0.1.2/tests/test_adjust_invariance.py +100 -0
- alpha101v-0.1.2/tests/test_brain_alignment.py +105 -0
- alpha101v-0.1.2/tests/test_differential.py +103 -0
- alpha101v-0.1.2/tests/test_elemwise.py +231 -0
- alpha101v-0.1.2/tests/test_extreme.py +77 -0
- alpha101v-0.1.2/tests/test_factor_differential.py +95 -0
- alpha101v-0.1.2/tests/test_factors.py +358 -0
- alpha101v-0.1.2/tests/test_factors_all.py +204 -0
- alpha101v-0.1.2/tests/test_golden.py +136 -0
- alpha101v-0.1.2/tests/test_invariants.py +201 -0
- alpha101v-0.1.2/tests/test_l6_statistics.py +180 -0
- alpha101v-0.1.2/tests/test_mutation.py +231 -0
- alpha101v-0.1.2/tests/test_operators.py +779 -0
- alpha101v-0.1.2/tests/test_panel.py +167 -0
- alpha101v-0.1.2/tests/test_provenance.py +139 -0
- alpha101v-0.1.2/tests/test_registry.py +143 -0
- alpha101v-0.1.2/tests/test_second_reference.py +134 -0
- alpha101v-0.1.2/tests/test_us_verification.py +200 -0
- alpha101v-0.1.2/tests/test_usage_guide.py +73 -0
- alpha101v-0.1.2/tests/test_version.py +63 -0
- alpha101v-0.1.2/tests/test_workflows.py +65 -0
alpha101v-0.1.2/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 alpha101-verified contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
alpha101v-0.1.2/PKG-INFO
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: alpha101v
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: A verifiable implementation of the 101 Formulaic Alphas — operators with explicit conventions plus a mutation-tested verification suite.
|
|
5
|
+
Author: alpha101-verified contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Paper, https://arxiv.org/abs/1601.00991
|
|
8
|
+
Project-URL: Homepage, https://github.com/yinxiuqu/alpha101-verified
|
|
9
|
+
Project-URL: Repository, https://github.com/yinxiuqu/alpha101-verified
|
|
10
|
+
Project-URL: Issues, https://github.com/yinxiuqu/alpha101-verified/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/yinxiuqu/alpha101-verified/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: alpha101,quantitative-finance,factor-model,verification,clean-room
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: numpy>=1.26
|
|
21
|
+
Requires-Dist: pandas>=2.1
|
|
22
|
+
Requires-Dist: scipy>=1.11
|
|
23
|
+
Provides-Extra: test
|
|
24
|
+
Requires-Dist: pytest>=7; extra == "test"
|
|
25
|
+
Requires-Dist: statsmodels>=0.14; extra == "test"
|
|
26
|
+
Provides-Extra: mongo
|
|
27
|
+
Requires-Dist: pymongo>=4; extra == "mongo"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# alpha101-verified · 一份「可验证的 Alpha101」
|
|
31
|
+
|
|
32
|
+
> **本项目卖的不是 101 个公式,而是「凭什么说它们算对了」。**
|
|
33
|
+
> 生态里不缺 Alpha101 的实现,缺的是**正确性证据**:算子口径对拍、golden 基准、
|
|
34
|
+
> 前视/不变量检验、与论文的偏差清单、以及诚实标注「哪几个我也验不了」。
|
|
35
|
+
|
|
36
|
+
| 项 | 状态(2026-10-09) |
|
|
37
|
+
|---|---|
|
|
38
|
+
| 里程碑 | **M0/M1 完成**(20 算子 + §8 + 变异测试)、**M2 完成**(规范入库 + `floor(d)` + `elemwise` + 5 试点 + 算子层差分 + 真实面板端到端)、**M3 完成**(**101/101 因子** + 复权 + 规范对照 101/101 等价) |
|
|
39
|
+
| 算子层(L1) | ✅ **20/20 通过**,`rtol = 1e-10`;**697** 个测试全绿(20 个文件)——⚠️ 必须用装了依赖的解释器(见下);7/7 变异注入被抓住 |
|
|
40
|
+
| 算子层差分(L3 提前) | ✅ 与 **vnpy(MIT)** 24 项对拍:**18 项逐点一致 + 6 项已归因口径差异 + 0 项待查**(`tools/differential.py`) |
|
|
41
|
+
| 因子层 | ✅ **101/101 已实现**;状态 **`verified` 82 / `partial` 19 / `ambiguous` 0** —— 19 个缺「门槛 3 独立差分」(vnpy 未实现:18 个含 `IndNeutralize` + `alpha56` 需 `cap`),备注逐条写明 |
|
|
42
|
+
| **真实数据端到端** | ✅ 359 交易日 × 120 只 A 股(MongoDB + 申万 as-of 行业):面板契约通过、`vwap` 自洽 **99.86%**、零 ±inf、`ind_neutralize` 残差和 **3.4e-15**;✅ **M3 已补 PIT 安全复权**(除权日假跳空 35.11% → 7.60%) |
|
|
43
|
+
| 因子层(L2–L5) | ✅ **L2 规范对照 101/101 等价**;✅ **L3 因子级差分 82 个可比因子 0 待查**;✅ L4 不变量全量通过;✅ **golden 快照已入库**(5×320 冻结基线 + sha256 + 环境版本,已接 CI);✅ L6 辅助统计(明文不参与判定) |
|
|
44
|
+
| `verified` 因子数 | **82/101**(§6.8 六条门槛全满足;其余 19 个缺「门槛 3 独立差分」⇒ 如实标 `partial`。设计文档曾预估 60~80) |
|
|
45
|
+
| 许可 | **MIT**(clean-room,零 GPL 血缘;CI 有机械守卫) |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 为什么做这个
|
|
50
|
+
|
|
51
|
+
| 现有实现 | 有没有测试 | 真实短板 |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| vnpy `alpha_101.py`(MIT) | ⚠️ 约 100 个**冒烟测试**,断言只有 `assert "data" in result.columns` | **没有正确性证据**;只覆盖 **82/101**(缺 alpha56 + 18 个 `IndNeutralize` 因子);那 18 个在它的测试里被**静默摘掉了中性化** |
|
|
54
|
+
| yli188(878 星) | ❌ 无 | **无许可证**(默认保留所有权利,法律上不可复用) |
|
|
55
|
+
| `QAFactor_Alpha101`(GPL-3.0) | ❌ 无 | 22 个因子在 pandas ≥ 1.0 下必崩;`scale` 轴向错;`IndNeutralize` 逐日求逆遇奇异行业即崩;**35 个 fork 五年内无一人修改** |
|
|
56
|
+
|
|
57
|
+
**结论:**「能不能算」已经有人免费给了;「算得对不对」是生态真空白。
|
|
58
|
+
|
|
59
|
+
本仓库因此从公开论文 clean-room 重写(**不修复、不 fork 那个 GPL 仓库**),
|
|
60
|
+
把 vnpy(MIT)当**测试期**差分对拍参照,交付「可验证」三件套:
|
|
61
|
+
**① 口径可判定 ② 证据可复现 ③ 验不了的如实标注**。
|
|
62
|
+
|
|
63
|
+
许可证边界(设计文档 §5.3):
|
|
64
|
+
`QAFactor_Alpha101`(GPL-3.0)**只被允许本地跑数值对比**,其**代码一行都不进本仓库**;
|
|
65
|
+
vnpy(MIT)仅作测试期参照并署名;运行时依赖只有 `numpy / pandas / scipy`。
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 快速开始
|
|
70
|
+
|
|
71
|
+
> **第一次用?看 [`docs/usage.md`](docs/usage.md)**(安装 → 五分钟上手 → 字段不够怎么办 → 口径 → 自查 → 性能 → 常见问题),并可直接跑 `python examples/hello_alpha101.py`(合成面板,不需要数据库)。
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
PY=/home/yinxiuqu/anaconda3/envs/qa/bin/python # Python 3.11 / pandas 2.3.3
|
|
75
|
+
|
|
76
|
+
$PY -m pytest -q # 全量(含变异测试,约 15~20 分钟;早期算子层闸门才是 2~3 分钟)
|
|
77
|
+
$PY -m pytest tests/test_operators.py -q # M1 闸门:算子层 20/20
|
|
78
|
+
$PY -m pytest tests/test_mutation.py -q # 变异测试:7/7 注入必须被抓住
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
import pandas as pd
|
|
83
|
+
from alpha101v import rank, scale, decay_linear, ind_neutralize
|
|
84
|
+
|
|
85
|
+
# 面板契约:index = 交易日(升序唯一),columns = 股票代码
|
|
86
|
+
factor = decay_linear(rank(close), 5) # 截面 rank 默认 pct=True((0,1])
|
|
87
|
+
daily = scale(factor, k=1.0) # 每日 Σ|x| = 1(axis=1)
|
|
88
|
+
resid = ind_neutralize(factor, industry) # 逐日组内去均值 = 行业哑变量 OLS 残差
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
无需安装(`conftest.py` 会把 `src/` 加进 `sys.path`);如需安装:`pip install -e .[test]`。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 验证套件:六层协议现在走到哪
|
|
96
|
+
|
|
97
|
+
| 层 | 内容 | 本仓库状态 |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| **L1 算子层** | 20 个算子的数学定义与权威实现对拍(pandas/scipy/statsmodels) | ✅ **已做**,20/20;见 `docs/operators.md` |
|
|
100
|
+
| **L2 规范对照** | 论文附录公式 vs 实现 AST 逐节点比对 → 等价/近似/偏离 | ✅ **101/101 等价、0 偏离**(`tools/conformance_report.py`) |
|
|
101
|
+
| **L3 双实现差分** | 本库 vs vnpy(polars DSL),逐点 `allclose(rtol=1e-8)` | ✅ **算子层 + 因子层均已做**:算子层 24 项;因子层 82 个可比因子 **0 待查**(`docs/verification.md` §1.5);19 个无第三方参照 |
|
|
102
|
+
| **L4 不变量与元测试** | 输入不可变性 / 时间截断一致性 / 未来扰动 / 缩放不变性 / **变异测试** | ✅ **算子层 + 因子层均已做**(`tests/test_invariants.py`、`tests/test_factors_all.py` 306 项、8/8 变异注入被抓) |
|
|
103
|
+
| **L5 golden 快照** | 固定种子面板上冻结 101 个因子输出,防回归 | ✅ **已入库**(`tests/golden/`:5×320 面板 + 101 因子输出 + sha256 + 环境版本,已接 CI) |
|
|
104
|
+
| **L6 统计合理性** | IC 符号/衰减形状/暴露检查 | 🟡 **已跑(辅助,非门槛)**:`tools/l6_statistics.py`(结果见 `reports/l6_summary.md`)。**明文:统计不参与 `verified` 判定**,A 股 ≠ 美股只作弱参考 |
|
|
105
|
+
|
|
106
|
+
**判据(设计文档 §6.8)**:六条门槛全满足才可标 `verified`;缺任一条标 `partial`/`ambiguous`。
|
|
107
|
+
|
|
108
|
+
**终态:`verified` 82/101、`partial` 19/101、`ambiguous` 0。** 19 个 `partial` 全部是
|
|
109
|
+
「vnpy 未实现 ⇒ 无第三方参照 ⇒ 门槛 3(必需)原理上不可满足」的因子
|
|
110
|
+
(18 个含 `IndNeutralize` + `alpha56` 需 `cap`),备注里逐条写明缺哪条、为什么。
|
|
111
|
+
设计文档 §6.8 的诚实预期是「`verified` 不可能是 101/101,预估 60~80」,实测 82。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 一页复现(每条声明都能自己跑出来)
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
python -m pytest -q # 697 项全绿(约 22 分钟)
|
|
119
|
+
|
|
120
|
+
python tools/conformance_report.py # L2:期望「等价 101(共 101 个因子)」
|
|
121
|
+
python tools/conformance_report.py --table # 101 行偏差清单(docs/deviations.md §4 由此生成)
|
|
122
|
+
|
|
123
|
+
bash tools/fetch_vnpy_reference.sh # L3:抓 vnpy 参照(SHA256 固定,进 gitignored 的 .vnpy-ref/)
|
|
124
|
+
python tools/differential.py # 算子层 27 项:19 一致 + 8 已归因 + 0 待查
|
|
125
|
+
python tools/factor_differential.py # 因子层 82 个可比因子:64 一致 + 18 已归因 + 0 待查
|
|
126
|
+
|
|
127
|
+
python tools/golden_snapshot.py --check # L5:与冻结基线比对(NaN 模式 + 数值)
|
|
128
|
+
python -m pytest tests/test_golden.py -q # 5 项
|
|
129
|
+
|
|
130
|
+
python tools/real_panel_smoke.py --n-codes 120 # 真实 A 股端到端(需本地 MongoDB)
|
|
131
|
+
|
|
132
|
+
python -m pytest tests/test_mutation.py -q # 8 个已知 bug 注入必须全部被抓住
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
⚠️ **BRAIN 官方算子文档不在仓库里**(登录墙内的专有文档,`refs/` 已 gitignore)。
|
|
136
|
+
要复核 L-B 结论(`ts_decay_linear` 方向、`ts_arg_max` 基准、`^` 的 `power`/`signed_power`、
|
|
137
|
+
`rank`/`ts_rank` 归一化、`ts_std_dev` 的 ddof),需要你自己的会话:登录后
|
|
138
|
+
`GET https://api.worldquantbrain.com/operators`(列表)与 `GET /operators/{name}`(完整正文,
|
|
139
|
+
即页面 `Show more` 的内容)。所有引文与结论都写在 `docs/operators.md` §3.13 ——
|
|
140
|
+
即使拿不到文档,也能看到「依据什么、选择了什么、漏在哪」。
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 证据索引(每个声明都指向一个可复现的命令)
|
|
145
|
+
|
|
146
|
+
| 声明 | 证据 |
|
|
147
|
+
|---|---|
|
|
148
|
+
| 20 个算子 API 恰好这些、无多无少 | `tests/test_operators.py::test_api_surface_is_exactly_twenty` |
|
|
149
|
+
| 「ddof 默认 1」「预热期必须 NaN」「scale 是 axis=1」等口径 | `docs/operators.md` §3 + 对应 `test_a*` / `test_b*` |
|
|
150
|
+
| 论文规范文本已完整入库(L2 基准) | `docs/paper_formulas.md` §2:101/101 条公式、**0 条括号不平衡**、可复现的 `curl`+`pdftotext` 命令与 PDF SHA256 |
|
|
151
|
+
| 设计文档 §3.2 依赖表经论文原文独立证实 | `docs/paper_formulas.md` §8:5/5 一致(连因子编号列表都逐一相同) |
|
|
152
|
+
| 与 `statsmodels.OLS` 残差逐点一致(`rtol=1e-10`) | `test_c02`(`ind_neutralize`)、`test_c10`(`neutral`) |
|
|
153
|
+
| 残差与行业哑变量正交、行业内残差均值为 0 | `test_c01` |
|
|
154
|
+
| 共线/空行业不抛 `LinAlgError` | `test_c03`、`test_c12` |
|
|
155
|
+
| 入参一字未改(专治 §3.3 缺陷 2) | `tests/test_invariants.py::test_inputs_are_not_modified`(22 个调用点) |
|
|
156
|
+
| 无前视(PIT 金标准) | `test_time_truncation_consistency`(19 个算子)+ `test_future_perturbation_does_not_change_past` |
|
|
157
|
+
| 未用将被删除的 pandas API(原实现死于 `as_matrix`) | `test_no_deprecated_pandas_api_warnings`(22 个调用点在 `FutureWarning`/`DeprecationWarning` 转异常下运行,0 警告) |
|
|
158
|
+
| 算子层与第二实现(vnpy,MIT)逐点一致 | `tools/differential.py`:27 项中 **19 项对齐后逐点一致**,8 项为已归因口径差异(D1/D3–D8;原 D2「ddof」已因官方口径落地而消失) |
|
|
159
|
+
| **101 个因子与论文公式结构一致** | `tools/conformance_report.py`:算子/字段/字面量三重对照 ⇒ **101/101 等价、0 偏离** |
|
|
160
|
+
| **官方口径落地(L-B 算例)** | `rank`/`ts_rank` 归一化 `(名次−1)/(n−1) ∈ [0,1]`、`ts_std_dev` ddof=0、`ts_decay_linear` 稀疏 NaN→0 —— 四个官方算例已逐字进测试(`docs/operators.md` §3.1/§3.2/§3.12/§3.13.3) |
|
|
161
|
+
| **BRAIN 完整算子文档(L-B,API 级)** | 66 个算子的**完整正文 + 官方算例**(本地语料 `refs/brain_operator_docs.md`,gitignored):三处默认口径**已落地**(归一化 `[0,1]`、`ts_std_dev` ddof=0、decay 稀疏 NaN→0),四个官方算例逐字进测试(`docs/operators.md` §3.13.3) |
|
|
162
|
+
| **BRAIN 官方算子文档(L-B)定案** | `refs/WorldQuant_BRAIN.pdf`(登录墙内文档,gitignored):`ts_decay_linear` 方向、`ts_arg_max/min` 基准(今天=0)、`^` 的 `power`/`signed_power` 之分 —— 原文引文见 `docs/operators.md` §3.13 |
|
|
163
|
+
| **因子级与 vnpy 逐点一致** | `tools/factor_differential.py`:82 个可比因子 0 个「待查」(64 逐点一致 + 18 已归因:2 参照 bug、14 离散平局/数值病态、2 覆盖差异);19 个因子无第三方参照 |
|
|
164
|
+
| 全量因子的 PIT 与契约 | `tests/test_factors_all.py`:101 个因子逐一验证「可算不产 ±inf/入参不可变/时间截断一致性」 |
|
|
165
|
+
| 复权修正除权日假跳空 | `tests/test_adjust.py`(11 项)+ `tests/test_adapters_real_data.py`(真实数据 35.11% → 7.60%) |
|
|
166
|
+
| 试点因子算得对(封闭解 + 独立第二实现) | `tests/test_factors.py`:alpha4/alpha5/alpha56 用 `scipy.rankdata` + 显式循环另写一份对拍;alpha101/alpha41 用论文公式裸 numpy 直算 |
|
|
167
|
+
| 真实数据上契约与不变量成立 | `tests/test_adapters_real_data.py`(11 项):面板契约、`vwap` 单位自洽、因子零 ±inf、PIT 行业中性化正交、真实数据时间截断一致性 |
|
|
168
|
+
| **L6 辅助统计(不是门槛)** | `tools/l6_statistics.py` + `reports/l6_summary.md`:60 只 × 359 日 A 股上跑完 101 个因子——平均 IC(h=1/2/3/5/10)**+0.0131/+0.0110/+0.0126/+0.0131/+0.0149**,两两 PnL 相关 **0.164**(4950 对,论文断言 15.9% 属**同量级弱参考**)。⚠️ 明文:不参与 `verified/partial` 判定,一个状态都没动 |
|
|
169
|
+
| **美股真实数据验证(已完成)** | 新浪源 80 只 × 753 日:面板契约 ✅、`vwap∈[low,high]` 99.49%、**±inf 0 个**、覆盖率 89.5%、时间截断一致性 ✅,**82 个因子对拍 vnpy:64 一致 + 18 已归因 + 0 待查**(与合成面板/A 股结论一致)⇒ `reports/us_verification_report.md`;数据已按用户要求删除并留审计。另:`tools/us_data_verification.py` |
|
|
170
|
+
| ~~美股验证的原始阻塞(历史记录)~~ | `tools/us_data_verification.py`(取数→验证→**删除+审计**)+ `tools/factor_differential.py --panel-file`。实测该 tushare 账号 `us_daily` 限 **1 次/小时**、复权接口**无权限**、且无行业字段 ⇒ 本轮如实记「未完成」;删除审计见 `reports/us_data_audit.md`(`docs/verification.md` §1.11) |
|
|
171
|
+
| **101 个因子在说什么** | `docs/factor_meaning.md`:机械事实表(字段/算子/窗口/结构形态,由 `tools/factor_meaning.py` 从公式逐条提取、可 `--check` 防漂移)+ 逐条经济解读(**标注为推断**,不影响任何因子状态)。**alpha1–alpha101 全部完成(五批)** |
|
|
172
|
+
| **A 股 T+1 审计** | `docs/t1_audit.md`:逐项核对「因子层是否含美股 T+0 假设」——结论是**不含**(无执行层、无前视、评估只用 h≥1 前瞻收益),并列出使用者必须自行处理的三件事(信号后移一天、涨跌停/停牌、T+1 持仓约束) |
|
|
173
|
+
| **给使用者的实践指南** | `docs/usage.md`(安装 → 五分钟上手 → 接自己的数据 → 字段不够怎么办 → 口径 → 自查 → 性能 → 常见问题)+ `examples/hello_alpha101.py`、`examples/from_my_csv.py`(都可直接跑) |
|
|
174
|
+
| **L-B 文档语料(本地,gitignored)** | `tools/fetch_brain_docs.py` → `refs/brain_docs/`:算子完整正文 66(53 有详情页)、Learn 教程 17 页、数据集 150 个、数据字段 **4367** 个(含描述与数据集)+ 字段名总表 4545,均含 MD 与 PDF。**登录墙内的专有文档:只作本地依据,不提交、不分发** |
|
|
175
|
+
| **第二独立参照差分(MIT)** | `tools/second_reference_differential.py`:对拍 19 个 `partial` 因子(第一参照 vnpy 未实现它们)。已证明两处参照侧口径偏离(并列取号、窗口不足 0-vs-NaN),一条归因被**证伪**(小数窗口)⇒ **19 个状态不升级**。结果表 `reports/second_reference_diff.csv`(`verification.md` §1.12) |
|
|
176
|
+
| **BRAIN 行为对齐工具(补充证据)** | `tools/brain_alignment.py`:同表达式两边的日度 PnL 做**单调性**比较(Spearman),两条取数路径都**零配额**、且不接受命令行凭据;`--submit` 拒绝执行(不代耗配额)。⛔ **未完成且非工具问题**:该账号只有 **USA** 数据(`/data-sets?region=USA`=150;`CHINA`/`CHN`/`GLB`/`EUR`/`ASI` 全 0,两种拼写都试过)⇒ 拿不到 A 股平台结果、不同市场无法对齐。可用 `--check-region` 只读复验(退出码 3 = 无中国区数据;`docs/verification.md` §1.9) |
|
|
177
|
+
| 真实面板冒烟可复跑 | `tools/real_panel_smoke.py`(359 交易日 × 120 只,退出码即证据) |
|
|
178
|
+
| 测试套件不是摆设 | `tests/test_mutation.py`(**8/8** 注入被抓住)+ 前视对照实验 `test_truncation_consistency_has_teeth_...` |
|
|
179
|
+
| **golden 防回归(L5)** | `tests/test_golden.py` + `tools/golden_snapshot.py --check`:冻结 101 个因子输出,NaN 模式必须一致、数值 `allclose`;长窗口因子在基线上有值(选 5×320 而非 5×250 的理由可验证) |
|
|
180
|
+
| 干净室纪律(比 GPL 更严的一例) | `YutaoWang03/Quant-Alpha101` 经只读 API 查证**未声明许可证**(`spdx_id: null`)⇒ 本项目对它既不参照也不对比(`docs/deviations.md` §1.1 第 8 行) |
|
|
181
|
+
| 状态划分不是拍脑袋 | `tests/test_factors_all.py::test_verified_and_partial_split_follows_the_six_gates`:82/19 的划分与「无参照集合」逐一对齐,并与 `tools/factor_differential.py` 的 `NOT_COMPARABLE` 交叉断言 |
|
|
182
|
+
| 零 GPL 血缘、运行时依赖只有 numpy/pandas/scipy | `tests/test_provenance.py`(源码 token 扫描 + 子进程 import 检查 + pyproject 解析) |
|
|
183
|
+
| 面板契约(单位/前复权/pit 前提) | `tests/test_panel.py` + `src/alpha101v/panel.py` |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 仓库结构
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
alpha101-verified/
|
|
191
|
+
├── LICENSE # MIT
|
|
192
|
+
├── README.md
|
|
193
|
+
├── pyproject.toml # 运行时依赖仅 numpy/pandas/scipy
|
|
194
|
+
├── conftest.py # 让 src 布局免安装可导入
|
|
195
|
+
├── docs/
|
|
196
|
+
│ ├── Alpha101_修复发布决策与验证协议_v0.1.md # 设计依据(内容版本 v0.2)
|
|
197
|
+
│ ├── operators.md # ★ 算子口径唯一权威(含歧义点决策 + 4 条文档勘误 + 论文核对回写)
|
|
198
|
+
│ ├── paper_formulas.md # ★ 论文规范入库:101/101 条公式逐字(括号平衡校验 0 不平衡)
|
|
199
|
+
│ ├── usage.md # ★ 使用指南(给第一次用的人)
|
|
200
|
+
│ ├── verification.md # 六层协议与验证结果矩阵
|
|
201
|
+
│ ├── ambiguities.md # 规范歧义清单(已决策 / 待决 / 无法判定)
|
|
202
|
+
│ └── deviations.md # 与论文/GPL 原实现的偏差清单(101 行清单 M3 生成)
|
|
203
|
+
├── src/alpha101v/
|
|
204
|
+
│ ├── operators.py # 17 个算子(纯函数,DataFrame→DataFrame)
|
|
205
|
+
│ ├── neutralize.py # 3 个中性化算子(向量化,无矩阵求逆)
|
|
206
|
+
│ ├── panel.py # 面板契约与校验(M0)
|
|
207
|
+
│ ├── registry.py # 因子注册与按形参名自动装配(§7.5;表为空 = 尚无因子)
|
|
208
|
+
│ └── adapters/ # 数据适配(可选层,**延迟导入**驱动;不污染运行时依赖)
|
|
209
|
+
│ ├── mongo.py # MongoDB(quantaxis) → §7.4 面板(vol→volume、vwap=amount/(vol*100))
|
|
210
|
+
│ └── industry.py # 申万 as-of 成员 → **PIT 行业标签面板**(逐日,非固定快照)
|
|
211
|
+
├── tests/
|
|
212
|
+
│ ├── test_operators.py # §8 全部用例:A 组 / B 组 / 中性化组(54 个)
|
|
213
|
+
│ ├── test_invariants.py # §6.5 不变量(129 个)
|
|
214
|
+
│ ├── test_panel.py # 面板契约(13 个)
|
|
215
|
+
│ ├── test_registry.py # 自动装配机制(10 个)
|
|
216
|
+
│ ├── test_provenance.py # 许可/依赖机械守卫(5 个)
|
|
217
|
+
│ ├── test_mutation.py # 变异测试(8 个:7 注入 + 1 勘误钉死)
|
|
218
|
+
│ ├── test_elemwise.py # 逐元素层(abs/log/sign/signedpower)
|
|
219
|
+
│ ├── test_factors.py # 5 个试点因子:封闭解 / 独立第二实现 / L2 结构 / L4 不变量
|
|
220
|
+
│ ├── test_differential.py # vnpy 算子层差分包装(参照缺失自动跳过)
|
|
221
|
+
│ ├── test_adapters_real_data.py # 真实 A 股数据端到端(无数据库时跳过)
|
|
222
|
+
│ └── golden/ # golden 快照(5×320 冻结基线 + sha256 + 环境版本,已接 CI)
|
|
223
|
+
├── tools/
|
|
224
|
+
│ ├── conformance_report.py # ★ 规范对照:论文公式 ↔ 实现 AST(算子/字段/字面量),生成偏差清单
|
|
225
|
+
│ ├── differential.py # ★ 算子层差分对拍(本库 vs vnpy MIT),退出码即证据
|
|
226
|
+
│ ├── fetch_vnpy_reference.sh # 下载参照源码到 gitignored 的 .vnpy-ref/(含 SHA256 校验)
|
|
227
|
+
│ └── README.md # conformance_report.py 待 M3
|
|
228
|
+
└── .github/workflows/ci.yml # pandas 2.1/2.2/2.3 矩阵 + 算子闸门 + 变异步骤
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**与设计文档 §7.2 的结构对照(截至 v0.1.1,已全部补齐)**:
|
|
232
|
+
`src/alpha101v/factors.py`(101 个因子)、`tests/golden/`(冻结基线)、`tools/*.py`(规范对照、
|
|
233
|
+
算子层与因子层差分、golden 快照、第二参照差分、发布前安全确认等)均已就位。
|
|
234
|
+
§7.2 里的 `test_edge_cases.py` / `test_conformance.py` 未单独立文件,而是**并入**
|
|
235
|
+
`test_operators.py`(NaN/inf/停牌/新股的边界用例)、`test_invariants.py`(脏数据三连)
|
|
236
|
+
与 `test_panel.py`(面板契约)——覆盖等价,只是不按文件名一一对应。
|
|
237
|
+
§7.2 中的 `test_edge_cases.py`(NaN/inf/停牌/新股)目前在 `test_operators.py:test_a26`、
|
|
238
|
+
`test_invariants.py`(脏数据三连)与 `test_panel.py` 里已覆盖算子层部分。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 路线图
|
|
243
|
+
|
|
244
|
+
| 里程碑 | 内容 | 状态 |
|
|
245
|
+
|---|---|---|
|
|
246
|
+
| **M0** | 骨架 + MIT + 面板契约 + CI | ✅ |
|
|
247
|
+
| **M1** | 20 个算子 + §8 全部用例 + 变异测试 | ✅ |
|
|
248
|
+
| **M2** | 5 个试点因子 + L2/L3/L4 首跑 | ✅ **完成**:`floor(d)`、`elemwise` 层、5 个试点因子(`alpha101`/`alpha4`/`alpha5`/`alpha41`/`alpha56`)、算子层 L3 差分、真实 A 股端到端。当时的余项(L2 全量 AST 对照、因子级差分)后续已由 M3 / M4+L-B 补齐 ✓ |
|
|
249
|
+
| M3 | 101 个因子 + 规范对照 + 偏差清单 | ✅ 完成:101/101 因子、L2 对照 101/101 等价、PIT 安全复权、偏差清单由工具生成(`docs/deviations.md` §4) |
|
|
250
|
+
| **M4+L-B** | 因子级差分对拍 + BRAIN 官方文档定案 | ✅ **完成**:64 一致 + 18 已归因、**0 待查**;顺带实测出参照侧 `quesval2` 取反的 bug(`docs/verification.md` §1.5) |
|
|
251
|
+
| **M5** | golden 快照 + 状态终态 + 发布收尾 | ✅ **完成**:`tests/golden/`(5×320 冻结基线 + sha256 + 环境版本,已接 CI)、`verified` 82/101 |
|
|
252
|
+
| **v0.1.1** | 第二独立参照差分(MIT 的 `alpha101-pipeline`)+ 使用指南 + 美股真实数据验证 + 发布(GitHub) | ✅ **完成**:19 个 `partial` 全部实测、无一条逐点一致 ⇒ 状态如实保持;另交付 `docs/usage.md` 与两个可跑示例 |
|
|
253
|
+
|
|
254
|
+
⚠️ 设计文档 §7.7 的提醒照抄在此:**不要一上来做 M3**。口径(复权/单位/PIT/算子)
|
|
255
|
+
一旦有问题,拿 101 个因子做一次大规模错误实验会全部返工。
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 归属与许可
|
|
260
|
+
|
|
261
|
+
* 本仓库代码:**MIT**(见 `LICENSE`)。
|
|
262
|
+
* 规范来源:Zura Kakushadze, *101 Formulaic Alphas*, Wilmott Magazine 2016(84):72–80,
|
|
263
|
+
[arXiv:1601.00991](https://arxiv.org/abs/1601.00991)。**该论文不是 WorldQuant 官方标准**,
|
|
264
|
+
且 WorldQuant 未开源任何因子代码——「正确」只能定义为「与所选规范一致」。
|
|
265
|
+
* 差分对拍参照:[vnpy](https://github.com/vnpy/vnpy)(MIT)的 `alpha_101.py` 与
|
|
266
|
+
`{cs,ts,ta}_function.py`。**仅用于测试期对拍**(下载到 gitignored 的 `.vnpy-ref/`,不进仓库)。署名与许可声明见
|
|
267
|
+
`docs/verification.md` §1.2/§1.5 与 `tools/README.md`;另有第二参照 `alpha101-pipeline`(MIT,
|
|
268
|
+
独立 venv)用于 19 个 `partial` 因子的对拍,见 `docs/verification.md` §1.12。
|
|
269
|
+
* **clean-room 声明**:本仓库从公开论文与数学定义独立实现。被分析的 GPL-3.0 仓库
|
|
270
|
+
(`QAFactor_Alpha101`)**代码从未被打开或拷贝**;其 README 的中文注释表仅用于理解经济含义
|
|
271
|
+
(注释与分类不构成代码表达)。`tests/test_provenance.py` 用机械扫描守住这条纪律。
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# alpha101-verified · 一份「可验证的 Alpha101」
|
|
2
|
+
|
|
3
|
+
> **本项目卖的不是 101 个公式,而是「凭什么说它们算对了」。**
|
|
4
|
+
> 生态里不缺 Alpha101 的实现,缺的是**正确性证据**:算子口径对拍、golden 基准、
|
|
5
|
+
> 前视/不变量检验、与论文的偏差清单、以及诚实标注「哪几个我也验不了」。
|
|
6
|
+
|
|
7
|
+
| 项 | 状态(2026-10-09) |
|
|
8
|
+
|---|---|
|
|
9
|
+
| 里程碑 | **M0/M1 完成**(20 算子 + §8 + 变异测试)、**M2 完成**(规范入库 + `floor(d)` + `elemwise` + 5 试点 + 算子层差分 + 真实面板端到端)、**M3 完成**(**101/101 因子** + 复权 + 规范对照 101/101 等价) |
|
|
10
|
+
| 算子层(L1) | ✅ **20/20 通过**,`rtol = 1e-10`;**697** 个测试全绿(20 个文件)——⚠️ 必须用装了依赖的解释器(见下);7/7 变异注入被抓住 |
|
|
11
|
+
| 算子层差分(L3 提前) | ✅ 与 **vnpy(MIT)** 24 项对拍:**18 项逐点一致 + 6 项已归因口径差异 + 0 项待查**(`tools/differential.py`) |
|
|
12
|
+
| 因子层 | ✅ **101/101 已实现**;状态 **`verified` 82 / `partial` 19 / `ambiguous` 0** —— 19 个缺「门槛 3 独立差分」(vnpy 未实现:18 个含 `IndNeutralize` + `alpha56` 需 `cap`),备注逐条写明 |
|
|
13
|
+
| **真实数据端到端** | ✅ 359 交易日 × 120 只 A 股(MongoDB + 申万 as-of 行业):面板契约通过、`vwap` 自洽 **99.86%**、零 ±inf、`ind_neutralize` 残差和 **3.4e-15**;✅ **M3 已补 PIT 安全复权**(除权日假跳空 35.11% → 7.60%) |
|
|
14
|
+
| 因子层(L2–L5) | ✅ **L2 规范对照 101/101 等价**;✅ **L3 因子级差分 82 个可比因子 0 待查**;✅ L4 不变量全量通过;✅ **golden 快照已入库**(5×320 冻结基线 + sha256 + 环境版本,已接 CI);✅ L6 辅助统计(明文不参与判定) |
|
|
15
|
+
| `verified` 因子数 | **82/101**(§6.8 六条门槛全满足;其余 19 个缺「门槛 3 独立差分」⇒ 如实标 `partial`。设计文档曾预估 60~80) |
|
|
16
|
+
| 许可 | **MIT**(clean-room,零 GPL 血缘;CI 有机械守卫) |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 为什么做这个
|
|
21
|
+
|
|
22
|
+
| 现有实现 | 有没有测试 | 真实短板 |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| vnpy `alpha_101.py`(MIT) | ⚠️ 约 100 个**冒烟测试**,断言只有 `assert "data" in result.columns` | **没有正确性证据**;只覆盖 **82/101**(缺 alpha56 + 18 个 `IndNeutralize` 因子);那 18 个在它的测试里被**静默摘掉了中性化** |
|
|
25
|
+
| yli188(878 星) | ❌ 无 | **无许可证**(默认保留所有权利,法律上不可复用) |
|
|
26
|
+
| `QAFactor_Alpha101`(GPL-3.0) | ❌ 无 | 22 个因子在 pandas ≥ 1.0 下必崩;`scale` 轴向错;`IndNeutralize` 逐日求逆遇奇异行业即崩;**35 个 fork 五年内无一人修改** |
|
|
27
|
+
|
|
28
|
+
**结论:**「能不能算」已经有人免费给了;「算得对不对」是生态真空白。
|
|
29
|
+
|
|
30
|
+
本仓库因此从公开论文 clean-room 重写(**不修复、不 fork 那个 GPL 仓库**),
|
|
31
|
+
把 vnpy(MIT)当**测试期**差分对拍参照,交付「可验证」三件套:
|
|
32
|
+
**① 口径可判定 ② 证据可复现 ③ 验不了的如实标注**。
|
|
33
|
+
|
|
34
|
+
许可证边界(设计文档 §5.3):
|
|
35
|
+
`QAFactor_Alpha101`(GPL-3.0)**只被允许本地跑数值对比**,其**代码一行都不进本仓库**;
|
|
36
|
+
vnpy(MIT)仅作测试期参照并署名;运行时依赖只有 `numpy / pandas / scipy`。
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 快速开始
|
|
41
|
+
|
|
42
|
+
> **第一次用?看 [`docs/usage.md`](docs/usage.md)**(安装 → 五分钟上手 → 字段不够怎么办 → 口径 → 自查 → 性能 → 常见问题),并可直接跑 `python examples/hello_alpha101.py`(合成面板,不需要数据库)。
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
PY=/home/yinxiuqu/anaconda3/envs/qa/bin/python # Python 3.11 / pandas 2.3.3
|
|
46
|
+
|
|
47
|
+
$PY -m pytest -q # 全量(含变异测试,约 15~20 分钟;早期算子层闸门才是 2~3 分钟)
|
|
48
|
+
$PY -m pytest tests/test_operators.py -q # M1 闸门:算子层 20/20
|
|
49
|
+
$PY -m pytest tests/test_mutation.py -q # 变异测试:7/7 注入必须被抓住
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
import pandas as pd
|
|
54
|
+
from alpha101v import rank, scale, decay_linear, ind_neutralize
|
|
55
|
+
|
|
56
|
+
# 面板契约:index = 交易日(升序唯一),columns = 股票代码
|
|
57
|
+
factor = decay_linear(rank(close), 5) # 截面 rank 默认 pct=True((0,1])
|
|
58
|
+
daily = scale(factor, k=1.0) # 每日 Σ|x| = 1(axis=1)
|
|
59
|
+
resid = ind_neutralize(factor, industry) # 逐日组内去均值 = 行业哑变量 OLS 残差
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
无需安装(`conftest.py` 会把 `src/` 加进 `sys.path`);如需安装:`pip install -e .[test]`。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 验证套件:六层协议现在走到哪
|
|
67
|
+
|
|
68
|
+
| 层 | 内容 | 本仓库状态 |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| **L1 算子层** | 20 个算子的数学定义与权威实现对拍(pandas/scipy/statsmodels) | ✅ **已做**,20/20;见 `docs/operators.md` |
|
|
71
|
+
| **L2 规范对照** | 论文附录公式 vs 实现 AST 逐节点比对 → 等价/近似/偏离 | ✅ **101/101 等价、0 偏离**(`tools/conformance_report.py`) |
|
|
72
|
+
| **L3 双实现差分** | 本库 vs vnpy(polars DSL),逐点 `allclose(rtol=1e-8)` | ✅ **算子层 + 因子层均已做**:算子层 24 项;因子层 82 个可比因子 **0 待查**(`docs/verification.md` §1.5);19 个无第三方参照 |
|
|
73
|
+
| **L4 不变量与元测试** | 输入不可变性 / 时间截断一致性 / 未来扰动 / 缩放不变性 / **变异测试** | ✅ **算子层 + 因子层均已做**(`tests/test_invariants.py`、`tests/test_factors_all.py` 306 项、8/8 变异注入被抓) |
|
|
74
|
+
| **L5 golden 快照** | 固定种子面板上冻结 101 个因子输出,防回归 | ✅ **已入库**(`tests/golden/`:5×320 面板 + 101 因子输出 + sha256 + 环境版本,已接 CI) |
|
|
75
|
+
| **L6 统计合理性** | IC 符号/衰减形状/暴露检查 | 🟡 **已跑(辅助,非门槛)**:`tools/l6_statistics.py`(结果见 `reports/l6_summary.md`)。**明文:统计不参与 `verified` 判定**,A 股 ≠ 美股只作弱参考 |
|
|
76
|
+
|
|
77
|
+
**判据(设计文档 §6.8)**:六条门槛全满足才可标 `verified`;缺任一条标 `partial`/`ambiguous`。
|
|
78
|
+
|
|
79
|
+
**终态:`verified` 82/101、`partial` 19/101、`ambiguous` 0。** 19 个 `partial` 全部是
|
|
80
|
+
「vnpy 未实现 ⇒ 无第三方参照 ⇒ 门槛 3(必需)原理上不可满足」的因子
|
|
81
|
+
(18 个含 `IndNeutralize` + `alpha56` 需 `cap`),备注里逐条写明缺哪条、为什么。
|
|
82
|
+
设计文档 §6.8 的诚实预期是「`verified` 不可能是 101/101,预估 60~80」,实测 82。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 一页复现(每条声明都能自己跑出来)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
python -m pytest -q # 697 项全绿(约 22 分钟)
|
|
90
|
+
|
|
91
|
+
python tools/conformance_report.py # L2:期望「等价 101(共 101 个因子)」
|
|
92
|
+
python tools/conformance_report.py --table # 101 行偏差清单(docs/deviations.md §4 由此生成)
|
|
93
|
+
|
|
94
|
+
bash tools/fetch_vnpy_reference.sh # L3:抓 vnpy 参照(SHA256 固定,进 gitignored 的 .vnpy-ref/)
|
|
95
|
+
python tools/differential.py # 算子层 27 项:19 一致 + 8 已归因 + 0 待查
|
|
96
|
+
python tools/factor_differential.py # 因子层 82 个可比因子:64 一致 + 18 已归因 + 0 待查
|
|
97
|
+
|
|
98
|
+
python tools/golden_snapshot.py --check # L5:与冻结基线比对(NaN 模式 + 数值)
|
|
99
|
+
python -m pytest tests/test_golden.py -q # 5 项
|
|
100
|
+
|
|
101
|
+
python tools/real_panel_smoke.py --n-codes 120 # 真实 A 股端到端(需本地 MongoDB)
|
|
102
|
+
|
|
103
|
+
python -m pytest tests/test_mutation.py -q # 8 个已知 bug 注入必须全部被抓住
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
⚠️ **BRAIN 官方算子文档不在仓库里**(登录墙内的专有文档,`refs/` 已 gitignore)。
|
|
107
|
+
要复核 L-B 结论(`ts_decay_linear` 方向、`ts_arg_max` 基准、`^` 的 `power`/`signed_power`、
|
|
108
|
+
`rank`/`ts_rank` 归一化、`ts_std_dev` 的 ddof),需要你自己的会话:登录后
|
|
109
|
+
`GET https://api.worldquantbrain.com/operators`(列表)与 `GET /operators/{name}`(完整正文,
|
|
110
|
+
即页面 `Show more` 的内容)。所有引文与结论都写在 `docs/operators.md` §3.13 ——
|
|
111
|
+
即使拿不到文档,也能看到「依据什么、选择了什么、漏在哪」。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 证据索引(每个声明都指向一个可复现的命令)
|
|
116
|
+
|
|
117
|
+
| 声明 | 证据 |
|
|
118
|
+
|---|---|
|
|
119
|
+
| 20 个算子 API 恰好这些、无多无少 | `tests/test_operators.py::test_api_surface_is_exactly_twenty` |
|
|
120
|
+
| 「ddof 默认 1」「预热期必须 NaN」「scale 是 axis=1」等口径 | `docs/operators.md` §3 + 对应 `test_a*` / `test_b*` |
|
|
121
|
+
| 论文规范文本已完整入库(L2 基准) | `docs/paper_formulas.md` §2:101/101 条公式、**0 条括号不平衡**、可复现的 `curl`+`pdftotext` 命令与 PDF SHA256 |
|
|
122
|
+
| 设计文档 §3.2 依赖表经论文原文独立证实 | `docs/paper_formulas.md` §8:5/5 一致(连因子编号列表都逐一相同) |
|
|
123
|
+
| 与 `statsmodels.OLS` 残差逐点一致(`rtol=1e-10`) | `test_c02`(`ind_neutralize`)、`test_c10`(`neutral`) |
|
|
124
|
+
| 残差与行业哑变量正交、行业内残差均值为 0 | `test_c01` |
|
|
125
|
+
| 共线/空行业不抛 `LinAlgError` | `test_c03`、`test_c12` |
|
|
126
|
+
| 入参一字未改(专治 §3.3 缺陷 2) | `tests/test_invariants.py::test_inputs_are_not_modified`(22 个调用点) |
|
|
127
|
+
| 无前视(PIT 金标准) | `test_time_truncation_consistency`(19 个算子)+ `test_future_perturbation_does_not_change_past` |
|
|
128
|
+
| 未用将被删除的 pandas API(原实现死于 `as_matrix`) | `test_no_deprecated_pandas_api_warnings`(22 个调用点在 `FutureWarning`/`DeprecationWarning` 转异常下运行,0 警告) |
|
|
129
|
+
| 算子层与第二实现(vnpy,MIT)逐点一致 | `tools/differential.py`:27 项中 **19 项对齐后逐点一致**,8 项为已归因口径差异(D1/D3–D8;原 D2「ddof」已因官方口径落地而消失) |
|
|
130
|
+
| **101 个因子与论文公式结构一致** | `tools/conformance_report.py`:算子/字段/字面量三重对照 ⇒ **101/101 等价、0 偏离** |
|
|
131
|
+
| **官方口径落地(L-B 算例)** | `rank`/`ts_rank` 归一化 `(名次−1)/(n−1) ∈ [0,1]`、`ts_std_dev` ddof=0、`ts_decay_linear` 稀疏 NaN→0 —— 四个官方算例已逐字进测试(`docs/operators.md` §3.1/§3.2/§3.12/§3.13.3) |
|
|
132
|
+
| **BRAIN 完整算子文档(L-B,API 级)** | 66 个算子的**完整正文 + 官方算例**(本地语料 `refs/brain_operator_docs.md`,gitignored):三处默认口径**已落地**(归一化 `[0,1]`、`ts_std_dev` ddof=0、decay 稀疏 NaN→0),四个官方算例逐字进测试(`docs/operators.md` §3.13.3) |
|
|
133
|
+
| **BRAIN 官方算子文档(L-B)定案** | `refs/WorldQuant_BRAIN.pdf`(登录墙内文档,gitignored):`ts_decay_linear` 方向、`ts_arg_max/min` 基准(今天=0)、`^` 的 `power`/`signed_power` 之分 —— 原文引文见 `docs/operators.md` §3.13 |
|
|
134
|
+
| **因子级与 vnpy 逐点一致** | `tools/factor_differential.py`:82 个可比因子 0 个「待查」(64 逐点一致 + 18 已归因:2 参照 bug、14 离散平局/数值病态、2 覆盖差异);19 个因子无第三方参照 |
|
|
135
|
+
| 全量因子的 PIT 与契约 | `tests/test_factors_all.py`:101 个因子逐一验证「可算不产 ±inf/入参不可变/时间截断一致性」 |
|
|
136
|
+
| 复权修正除权日假跳空 | `tests/test_adjust.py`(11 项)+ `tests/test_adapters_real_data.py`(真实数据 35.11% → 7.60%) |
|
|
137
|
+
| 试点因子算得对(封闭解 + 独立第二实现) | `tests/test_factors.py`:alpha4/alpha5/alpha56 用 `scipy.rankdata` + 显式循环另写一份对拍;alpha101/alpha41 用论文公式裸 numpy 直算 |
|
|
138
|
+
| 真实数据上契约与不变量成立 | `tests/test_adapters_real_data.py`(11 项):面板契约、`vwap` 单位自洽、因子零 ±inf、PIT 行业中性化正交、真实数据时间截断一致性 |
|
|
139
|
+
| **L6 辅助统计(不是门槛)** | `tools/l6_statistics.py` + `reports/l6_summary.md`:60 只 × 359 日 A 股上跑完 101 个因子——平均 IC(h=1/2/3/5/10)**+0.0131/+0.0110/+0.0126/+0.0131/+0.0149**,两两 PnL 相关 **0.164**(4950 对,论文断言 15.9% 属**同量级弱参考**)。⚠️ 明文:不参与 `verified/partial` 判定,一个状态都没动 |
|
|
140
|
+
| **美股真实数据验证(已完成)** | 新浪源 80 只 × 753 日:面板契约 ✅、`vwap∈[low,high]` 99.49%、**±inf 0 个**、覆盖率 89.5%、时间截断一致性 ✅,**82 个因子对拍 vnpy:64 一致 + 18 已归因 + 0 待查**(与合成面板/A 股结论一致)⇒ `reports/us_verification_report.md`;数据已按用户要求删除并留审计。另:`tools/us_data_verification.py` |
|
|
141
|
+
| ~~美股验证的原始阻塞(历史记录)~~ | `tools/us_data_verification.py`(取数→验证→**删除+审计**)+ `tools/factor_differential.py --panel-file`。实测该 tushare 账号 `us_daily` 限 **1 次/小时**、复权接口**无权限**、且无行业字段 ⇒ 本轮如实记「未完成」;删除审计见 `reports/us_data_audit.md`(`docs/verification.md` §1.11) |
|
|
142
|
+
| **101 个因子在说什么** | `docs/factor_meaning.md`:机械事实表(字段/算子/窗口/结构形态,由 `tools/factor_meaning.py` 从公式逐条提取、可 `--check` 防漂移)+ 逐条经济解读(**标注为推断**,不影响任何因子状态)。**alpha1–alpha101 全部完成(五批)** |
|
|
143
|
+
| **A 股 T+1 审计** | `docs/t1_audit.md`:逐项核对「因子层是否含美股 T+0 假设」——结论是**不含**(无执行层、无前视、评估只用 h≥1 前瞻收益),并列出使用者必须自行处理的三件事(信号后移一天、涨跌停/停牌、T+1 持仓约束) |
|
|
144
|
+
| **给使用者的实践指南** | `docs/usage.md`(安装 → 五分钟上手 → 接自己的数据 → 字段不够怎么办 → 口径 → 自查 → 性能 → 常见问题)+ `examples/hello_alpha101.py`、`examples/from_my_csv.py`(都可直接跑) |
|
|
145
|
+
| **L-B 文档语料(本地,gitignored)** | `tools/fetch_brain_docs.py` → `refs/brain_docs/`:算子完整正文 66(53 有详情页)、Learn 教程 17 页、数据集 150 个、数据字段 **4367** 个(含描述与数据集)+ 字段名总表 4545,均含 MD 与 PDF。**登录墙内的专有文档:只作本地依据,不提交、不分发** |
|
|
146
|
+
| **第二独立参照差分(MIT)** | `tools/second_reference_differential.py`:对拍 19 个 `partial` 因子(第一参照 vnpy 未实现它们)。已证明两处参照侧口径偏离(并列取号、窗口不足 0-vs-NaN),一条归因被**证伪**(小数窗口)⇒ **19 个状态不升级**。结果表 `reports/second_reference_diff.csv`(`verification.md` §1.12) |
|
|
147
|
+
| **BRAIN 行为对齐工具(补充证据)** | `tools/brain_alignment.py`:同表达式两边的日度 PnL 做**单调性**比较(Spearman),两条取数路径都**零配额**、且不接受命令行凭据;`--submit` 拒绝执行(不代耗配额)。⛔ **未完成且非工具问题**:该账号只有 **USA** 数据(`/data-sets?region=USA`=150;`CHINA`/`CHN`/`GLB`/`EUR`/`ASI` 全 0,两种拼写都试过)⇒ 拿不到 A 股平台结果、不同市场无法对齐。可用 `--check-region` 只读复验(退出码 3 = 无中国区数据;`docs/verification.md` §1.9) |
|
|
148
|
+
| 真实面板冒烟可复跑 | `tools/real_panel_smoke.py`(359 交易日 × 120 只,退出码即证据) |
|
|
149
|
+
| 测试套件不是摆设 | `tests/test_mutation.py`(**8/8** 注入被抓住)+ 前视对照实验 `test_truncation_consistency_has_teeth_...` |
|
|
150
|
+
| **golden 防回归(L5)** | `tests/test_golden.py` + `tools/golden_snapshot.py --check`:冻结 101 个因子输出,NaN 模式必须一致、数值 `allclose`;长窗口因子在基线上有值(选 5×320 而非 5×250 的理由可验证) |
|
|
151
|
+
| 干净室纪律(比 GPL 更严的一例) | `YutaoWang03/Quant-Alpha101` 经只读 API 查证**未声明许可证**(`spdx_id: null`)⇒ 本项目对它既不参照也不对比(`docs/deviations.md` §1.1 第 8 行) |
|
|
152
|
+
| 状态划分不是拍脑袋 | `tests/test_factors_all.py::test_verified_and_partial_split_follows_the_six_gates`:82/19 的划分与「无参照集合」逐一对齐,并与 `tools/factor_differential.py` 的 `NOT_COMPARABLE` 交叉断言 |
|
|
153
|
+
| 零 GPL 血缘、运行时依赖只有 numpy/pandas/scipy | `tests/test_provenance.py`(源码 token 扫描 + 子进程 import 检查 + pyproject 解析) |
|
|
154
|
+
| 面板契约(单位/前复权/pit 前提) | `tests/test_panel.py` + `src/alpha101v/panel.py` |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 仓库结构
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
alpha101-verified/
|
|
162
|
+
├── LICENSE # MIT
|
|
163
|
+
├── README.md
|
|
164
|
+
├── pyproject.toml # 运行时依赖仅 numpy/pandas/scipy
|
|
165
|
+
├── conftest.py # 让 src 布局免安装可导入
|
|
166
|
+
├── docs/
|
|
167
|
+
│ ├── Alpha101_修复发布决策与验证协议_v0.1.md # 设计依据(内容版本 v0.2)
|
|
168
|
+
│ ├── operators.md # ★ 算子口径唯一权威(含歧义点决策 + 4 条文档勘误 + 论文核对回写)
|
|
169
|
+
│ ├── paper_formulas.md # ★ 论文规范入库:101/101 条公式逐字(括号平衡校验 0 不平衡)
|
|
170
|
+
│ ├── usage.md # ★ 使用指南(给第一次用的人)
|
|
171
|
+
│ ├── verification.md # 六层协议与验证结果矩阵
|
|
172
|
+
│ ├── ambiguities.md # 规范歧义清单(已决策 / 待决 / 无法判定)
|
|
173
|
+
│ └── deviations.md # 与论文/GPL 原实现的偏差清单(101 行清单 M3 生成)
|
|
174
|
+
├── src/alpha101v/
|
|
175
|
+
│ ├── operators.py # 17 个算子(纯函数,DataFrame→DataFrame)
|
|
176
|
+
│ ├── neutralize.py # 3 个中性化算子(向量化,无矩阵求逆)
|
|
177
|
+
│ ├── panel.py # 面板契约与校验(M0)
|
|
178
|
+
│ ├── registry.py # 因子注册与按形参名自动装配(§7.5;表为空 = 尚无因子)
|
|
179
|
+
│ └── adapters/ # 数据适配(可选层,**延迟导入**驱动;不污染运行时依赖)
|
|
180
|
+
│ ├── mongo.py # MongoDB(quantaxis) → §7.4 面板(vol→volume、vwap=amount/(vol*100))
|
|
181
|
+
│ └── industry.py # 申万 as-of 成员 → **PIT 行业标签面板**(逐日,非固定快照)
|
|
182
|
+
├── tests/
|
|
183
|
+
│ ├── test_operators.py # §8 全部用例:A 组 / B 组 / 中性化组(54 个)
|
|
184
|
+
│ ├── test_invariants.py # §6.5 不变量(129 个)
|
|
185
|
+
│ ├── test_panel.py # 面板契约(13 个)
|
|
186
|
+
│ ├── test_registry.py # 自动装配机制(10 个)
|
|
187
|
+
│ ├── test_provenance.py # 许可/依赖机械守卫(5 个)
|
|
188
|
+
│ ├── test_mutation.py # 变异测试(8 个:7 注入 + 1 勘误钉死)
|
|
189
|
+
│ ├── test_elemwise.py # 逐元素层(abs/log/sign/signedpower)
|
|
190
|
+
│ ├── test_factors.py # 5 个试点因子:封闭解 / 独立第二实现 / L2 结构 / L4 不变量
|
|
191
|
+
│ ├── test_differential.py # vnpy 算子层差分包装(参照缺失自动跳过)
|
|
192
|
+
│ ├── test_adapters_real_data.py # 真实 A 股数据端到端(无数据库时跳过)
|
|
193
|
+
│ └── golden/ # golden 快照(5×320 冻结基线 + sha256 + 环境版本,已接 CI)
|
|
194
|
+
├── tools/
|
|
195
|
+
│ ├── conformance_report.py # ★ 规范对照:论文公式 ↔ 实现 AST(算子/字段/字面量),生成偏差清单
|
|
196
|
+
│ ├── differential.py # ★ 算子层差分对拍(本库 vs vnpy MIT),退出码即证据
|
|
197
|
+
│ ├── fetch_vnpy_reference.sh # 下载参照源码到 gitignored 的 .vnpy-ref/(含 SHA256 校验)
|
|
198
|
+
│ └── README.md # conformance_report.py 待 M3
|
|
199
|
+
└── .github/workflows/ci.yml # pandas 2.1/2.2/2.3 矩阵 + 算子闸门 + 变异步骤
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**与设计文档 §7.2 的结构对照(截至 v0.1.1,已全部补齐)**:
|
|
203
|
+
`src/alpha101v/factors.py`(101 个因子)、`tests/golden/`(冻结基线)、`tools/*.py`(规范对照、
|
|
204
|
+
算子层与因子层差分、golden 快照、第二参照差分、发布前安全确认等)均已就位。
|
|
205
|
+
§7.2 里的 `test_edge_cases.py` / `test_conformance.py` 未单独立文件,而是**并入**
|
|
206
|
+
`test_operators.py`(NaN/inf/停牌/新股的边界用例)、`test_invariants.py`(脏数据三连)
|
|
207
|
+
与 `test_panel.py`(面板契约)——覆盖等价,只是不按文件名一一对应。
|
|
208
|
+
§7.2 中的 `test_edge_cases.py`(NaN/inf/停牌/新股)目前在 `test_operators.py:test_a26`、
|
|
209
|
+
`test_invariants.py`(脏数据三连)与 `test_panel.py` 里已覆盖算子层部分。
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 路线图
|
|
214
|
+
|
|
215
|
+
| 里程碑 | 内容 | 状态 |
|
|
216
|
+
|---|---|---|
|
|
217
|
+
| **M0** | 骨架 + MIT + 面板契约 + CI | ✅ |
|
|
218
|
+
| **M1** | 20 个算子 + §8 全部用例 + 变异测试 | ✅ |
|
|
219
|
+
| **M2** | 5 个试点因子 + L2/L3/L4 首跑 | ✅ **完成**:`floor(d)`、`elemwise` 层、5 个试点因子(`alpha101`/`alpha4`/`alpha5`/`alpha41`/`alpha56`)、算子层 L3 差分、真实 A 股端到端。当时的余项(L2 全量 AST 对照、因子级差分)后续已由 M3 / M4+L-B 补齐 ✓ |
|
|
220
|
+
| M3 | 101 个因子 + 规范对照 + 偏差清单 | ✅ 完成:101/101 因子、L2 对照 101/101 等价、PIT 安全复权、偏差清单由工具生成(`docs/deviations.md` §4) |
|
|
221
|
+
| **M4+L-B** | 因子级差分对拍 + BRAIN 官方文档定案 | ✅ **完成**:64 一致 + 18 已归因、**0 待查**;顺带实测出参照侧 `quesval2` 取反的 bug(`docs/verification.md` §1.5) |
|
|
222
|
+
| **M5** | golden 快照 + 状态终态 + 发布收尾 | ✅ **完成**:`tests/golden/`(5×320 冻结基线 + sha256 + 环境版本,已接 CI)、`verified` 82/101 |
|
|
223
|
+
| **v0.1.1** | 第二独立参照差分(MIT 的 `alpha101-pipeline`)+ 使用指南 + 美股真实数据验证 + 发布(GitHub) | ✅ **完成**:19 个 `partial` 全部实测、无一条逐点一致 ⇒ 状态如实保持;另交付 `docs/usage.md` 与两个可跑示例 |
|
|
224
|
+
|
|
225
|
+
⚠️ 设计文档 §7.7 的提醒照抄在此:**不要一上来做 M3**。口径(复权/单位/PIT/算子)
|
|
226
|
+
一旦有问题,拿 101 个因子做一次大规模错误实验会全部返工。
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 归属与许可
|
|
231
|
+
|
|
232
|
+
* 本仓库代码:**MIT**(见 `LICENSE`)。
|
|
233
|
+
* 规范来源:Zura Kakushadze, *101 Formulaic Alphas*, Wilmott Magazine 2016(84):72–80,
|
|
234
|
+
[arXiv:1601.00991](https://arxiv.org/abs/1601.00991)。**该论文不是 WorldQuant 官方标准**,
|
|
235
|
+
且 WorldQuant 未开源任何因子代码——「正确」只能定义为「与所选规范一致」。
|
|
236
|
+
* 差分对拍参照:[vnpy](https://github.com/vnpy/vnpy)(MIT)的 `alpha_101.py` 与
|
|
237
|
+
`{cs,ts,ta}_function.py`。**仅用于测试期对拍**(下载到 gitignored 的 `.vnpy-ref/`,不进仓库)。署名与许可声明见
|
|
238
|
+
`docs/verification.md` §1.2/§1.5 与 `tools/README.md`;另有第二参照 `alpha101-pipeline`(MIT,
|
|
239
|
+
独立 venv)用于 19 个 `partial` 因子的对拍,见 `docs/verification.md` §1.12。
|
|
240
|
+
* **clean-room 声明**:本仓库从公开论文与数学定义独立实现。被分析的 GPL-3.0 仓库
|
|
241
|
+
(`QAFactor_Alpha101`)**代码从未被打开或拷贝**;其 README 的中文注释表仅用于理解经济含义
|
|
242
|
+
(注释与分类不构成代码表达)。`tests/test_provenance.py` 用机械扫描守住这条纪律。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "alpha101v"
|
|
7
|
+
version = "0.1.2"
|
|
8
|
+
description = "A verifiable implementation of the 101 Formulaic Alphas — operators with explicit conventions plus a mutation-tested verification suite."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [{ name = "alpha101-verified contributors" }]
|
|
13
|
+
keywords = ["alpha101", "quantitative-finance", "factor-model", "verification", "clean-room"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"License :: OSI Approved :: MIT License",
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Topic :: Scientific/Engineering :: Mathematics",
|
|
19
|
+
]
|
|
20
|
+
# Runtime dependencies are deliberately minimal: numpy / pandas / scipy only.
|
|
21
|
+
# statsmodels and vnpy are TEST-ONLY references (differential comparison), never runtime deps.
|
|
22
|
+
dependencies = [
|
|
23
|
+
"numpy>=1.26",
|
|
24
|
+
"pandas>=2.1",
|
|
25
|
+
"scipy>=1.11",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.optional-dependencies]
|
|
29
|
+
test = ["pytest>=7", "statsmodels>=0.14"]
|
|
30
|
+
# 可选数据适配(本地 MongoDB)。**不进 dependencies**:适配层延迟导入,包根永不加载它。
|
|
31
|
+
mongo = ["pymongo>=4"]
|
|
32
|
+
|
|
33
|
+
[project.urls]
|
|
34
|
+
Paper = "https://arxiv.org/abs/1601.00991"
|
|
35
|
+
Homepage = "https://github.com/yinxiuqu/alpha101-verified"
|
|
36
|
+
Repository = "https://github.com/yinxiuqu/alpha101-verified"
|
|
37
|
+
Issues = "https://github.com/yinxiuqu/alpha101-verified/issues"
|
|
38
|
+
Changelog = "https://github.com/yinxiuqu/alpha101-verified/blob/main/CHANGELOG.md"
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.packages.find]
|
|
41
|
+
where = ["src"]
|
|
42
|
+
|
|
43
|
+
[tool.pytest.ini_options]
|
|
44
|
+
testpaths = ["tests"]
|
|
45
|
+
pythonpath = ["src"]
|
|
46
|
+
addopts = "-ra --strict-markers"
|