QuantWeft量化经纬
English
本章小节

Project 5 — 筛选准备层(Pairs Trading preparation)

状态:准备层,不是完整的 Project 5。 没有 entry/exit、双腿成本、卖空融资、仓位或回测;不得把本目录的任何结果写成“配对交易策略已完成”或“筛选出的配对有收益优势”。A5准备层已有历史限定接受;这里只继承该诊断身份,不登记真实策略verified。

这里有什么、没有什么

内容 状态 文件
冻结的筛选规则(α\alpha、BH 的 qq、Engle–Granger 的趋势项、两个训练窗口、模拟种子)与其 SHA-256 有(本地文件哈希,不是外部预注册) configs/screening_rules.json
训练段 correlation 与 Engle–Granger 协整筛选、hedge ratio、测试次数与临界值的报告 有(先切出训练段再交给共享 helper 校验与筛选,训练段之后的缺失值不影响筛选能否运行;之后窗口单独校验完整性,缺失时报错) screening_layer.py
训练段之后窗口的 frozen spread 诊断(半衰期、ADF 的 pp) 有(诊断,不是评价策略) 同上
反例:相关≠协整;hedge ratio≠资本权重;零假设下的假阳性数;“选最好的一对”的选择效应 有 同上;tests/test_p05_screening.py
Notebook(冷启动)与图 有 notebooks/p05_screening.ipynb;figures/a5/p05_screening.png
数据字典、来源可行性、时间字段、缺口表 有 data_dictionary.md、source_feasibility.md、gap_table.md
entry/exit、风控、交易滞后、空仓状态 没有 —
双腿成本、卖空与融资、借券可得性、失配风险 没有 —
个股或 ETF 的真实调整后价格、公司行动、历史股票池 没有(缺项) 见 gap_table.md

真实与构造的标记

数据或结果 类别 说明
French 10 行业价值加权月收益复利成的 total-return 指数代理(1926-07 至 2026-08) 真实,聚合,已修订,非时点,不可交易 10 个行业组合,不是证券,不能借券或下单;用于演示训练段筛选与诊断。哈希核对见 quant_course.french_frozen
第 17 章的两个模拟序列(共同趋势不协整;协整对) 构造 只用于“相关≠协整”的反例
10 个独立随机游走的零假设校准与“选最好一对”的选择效应 构造 已知所有配对都是零假设,用于展示假阳性与选择偏误

运行

本节命令定位A5历史筛选诊断及测试;不是本批重新运行,也不是P5三对构造Notebook或c5完整网格。普通读者主路线见项目导读,不会覆盖这里的历史结果。

.venv/bin/python projects/project05/preparation/screening_layer.py
.venv/bin/python -m pytest tests/test_p05_screening.py -q

结果写入 qa/a5/claude/results/p05/p05_screening_results.json 与 figures/a5/p05_screening.png;输出已存在时拒绝覆盖。独立复算脚本:qa/a5/claude/recompute/p05_recompute.py(直接调用 statsmodels 的 coint、adfuller 与 numpy,不调用 quant_course.cointegration)。

实测结果(真实聚合数据;只描述,不是策略证据)

测试次数与临界值。 两个训练窗口,每个窗口 10 个行业的全部 45 个无序对,共 90 次配对检验(另有零假设与选择效应的模拟,不计入真实数据的检验数)。Engle–Granger 用 statsmodels coint(含截距)的 MacKinnon 协整临界值:窗口一(训练到 1963-06,444 个月)5% 临界值 −3.350-3.350(1% 为 −3.921-3.921,10% 为 −3.054-3.054);窗口二(训练到 1999-12,882 个月)5% 临界值 −3.343-3.343。普通 ADF 的 5% 临界值(约 −2.87-2.87)不适用于估计过的残差。Bonferroni 的逐对 pp 阈值:每个窗口 0.05/45=0.001110.05/45=0.00111;90 次合计 0.05/90=0.0005560.05/90=0.000556(本表不据此改判)。Benjamini–Hochberg 的 qq 值是探索性 FDR 校正,配对共用序列,独立或 PRDS 条件未被证明(cointegration.py 的说明)。

训练窗口 配对数 p<0.05p<0.05 零假设下预期的假阳性个数(45×0.0545\times0.05) BH q<0.10q<0.10 p<0.00111p<0.00111
1926-07 至 1963-06 45 5 2.25 1 1
1926-07 至 1999-12 45 6 2.25 0 0

唯一通过 BH 的配对。 窗口一:Durbl(耐用品)对 Manuf(制造业):EG 统计量 −4.871-4.871,p=0.0003p=0.0003,q=0.0127q=0.0127;训练段 hedge ratio(对数指数水平回归,y=α+βxy=\alpha+\beta x)β=1.126\beta=1.126;训练段对数水平相关 0.994,月对数收益相关 0.895;训练段半衰期约 19 个月。用冻结的 α,β\alpha,\beta 看之后的 1963-07 至 1999-12:spread 的半衰期约 239 个月,标准差从 0.142 升到 0.251,ADF 对冻结 spread 的 p=0.89p=0.89(没有均值回复的证据)。窗口二没有配对通过 BH。

零假设校准(构造:10 个独立随机游走,444 个月,200 次重复)。 平均每次有 2.81 个配对在 5% 水平“显著”(若各检验零假设p值均校准,期望线性给出2.25,不需要检验独立);80% 的重复至少有一个“显著”配对;BH(q=0.10q=0.10)平均 0.335 个,14% 的重复有至少一个 BH 通过。选择效应:在每个重复里选训练 pp 最小的一对,其训练 pp 均值 0.029,81% 低于 0.05;用冻结 hedge ratio 看之后 120 个月,其 spread 的 ADF pp 均值 0.476,只有 4% 低于 0.05(全部配对在构造上都是零假设)。

相关≠协整(构造)。 共同趋势、不协整的一对:水平相关 0.983、月变化相关 0.960,EG p=0.339p=0.339(统计量 −2.37-2.37,5% 临界值 −3.35-3.35);协整的一对:水平相关 0.999、变化相关 0.967,EG p≈10−13p\approx10^{-13}。变化的相关系数几乎一样,区分不了它们。hedge ratio≠资本权重(另一个水平价格回归算例):Py=a+bPx+eP_y=a+bP_x+e,b=1.5b=1.5(单位share_x/share_y)、Py=120P_y=120、Px=40P_x=40:多 1 单位 yy(价值 120)、空 1.5 单位 xx(价值 60),按毛暴露180计的绝对资本份额是 2/32/3 与 1/31/3,带符号权重为 +2/3+2/3 与 −1/3-1/3,净美元暴露 60,不是 1.51.5 倍资本。

这里的b不是上文对数回归的弹性。若对数弹性beta=1.5,Y=120、X=40,多1股Y需一阶空4.5股X(180美元),不是1.5股。共享helper的水平价格含义正确,历史JSON该算例的beta字段名称沿用,其语义是这里的水平b;不改helper或历史JSON。该一阶对冲以系数冻结、残差不变为条件,不能消除全部价差风险。

能说什么,不能说什么。 可以说:在 10 个行业组合的真实聚合数据上,训练段只筛出一个通过 BH 的配对,它在训练之后的窗口里没有保持均值回复;零假设下 45 次检验平均有约 2.8 个未经校正的“显著”,所以不能仅凭未校正的 p<0.05p<0.05 个数(5 与 6)排除偶然;选最好一对的训练显著性不能外推。不能说:这些行业组合是可交易的配对;一对通过筛选就有收益;任何关于成本、融资、卖空、容量或协整破坏原因的结论;“没有通过筛选”等于“没有协整”(检验功效有限,444 个月、10 个行业的样本也很特殊)。

时间字段(摘要,详见 data_dictionary.md)

event_time:行业组合收益覆盖的日历月;available_at:数据库没有记录,已修订历史,所以不是时点;signal_time:训练窗口最后一个月的月末(1963-06 或 1999-12);筛选与 hedge ratio 只用 ≤\le 它的数据;trade_time:未定义(本层不交易);return interval:日历月;label interval:无(筛选在水平上做,不用未来收益作标签)。

搜索教材

输入关键词开始搜索。