QuantWeft量化经纬
English
本章小节

Project 5 研究报告:预注册walk-forward配对交易

状态:继承c5/v2构造结果与已限定接受ALIGN对齐,当前执行域以2026-10-14整股边界为准;本BIL17B为教学整合候选。历史结果日期:2026-10-10;协议/边界日期:2026-10-14。真实价格实证:blocked(数据许可)。 本报告的全部数值结果来自明确标注的教学构造面板,只证明流程、账本与检验方法能按契约运行,不是任何真实配对盈利或协整的证据。c1–c4在预注册v1下的旧结果原样保留在 qa/a7/project05_batch/evidence/,本报告不沿用它们作c5结论。

1. 研究问题与可证伪假设

第17章说明:两条非平稳价格若存在平稳线性组合(协整),价差会回到均值;相关只描述同步变动,不保证价差回归。本项目问:在预先固定的8个经济上相关的美国上市配对中,只用训练段筛选协整并冻结参数,下一段按z-score做一多一空的相对价值交易,计入双腿成本、借券与融资后,组合是否有稳健的正超额收益。

判断规则(claim_rule,v1与v2相同):主规格的正结果必须在成本网格与“screened对ungated”选择效应对照下都保持,才可写“支持”;否则写“证据不支持该策略”,并保留全部零与负结果。阈值网格与252日形成窗只作描述,不得用于挑选版本后再报告同一样本。

2. 数据与状态

2.1 预注册资产池与版本

v1(SHA256 92e5f20c…4b22)在任何价格下载前冻结:8对EWA/EWC、KO/PEP、XOM/CVX、GDX/GLD(预期弱)、XOP/XLE、HD/LOW、V/MA、IVV/SPY(同一指数的对照),样本2010-01-04至2025-12-31,8对×全部窗口都计入检验次数。

v2(configs/preregistration_v2.json,SHA256 9af9dc84…87c3)在看到构造结果之后、任何真实数据分析之前冻结,取代v1用于所有新运行;v1、澄清A1/A2和c1–c4全部旧结果不改。v2的改动与理由:

项目 v1 v2 理由
选入规则 EG p<0.05p<0.05 EG p<0.05p<0.05 且 β>0\beta>0 把项目限定为一多一空的相对价值配对;不是因为负 β\beta 在数学上不能对冲
开盘成交容量 成交日全天量的5% 截至信号收盘已知ADV20的5%,换算到成交日拆股后股数 全天量在收盘后才可得,v1用它决定09:30成交属于前视(c4验收R01)
日内事件顺序 结息→公司行动→成交 结息→公司行动→两腿按09:30开盘标记→成交→结息 无成交的既存空头日内借券基数须用开盘价(c4验收R02)
评价输出 列出换手、胜率、持有天数但未实现 给出口径并实现(§4) c4验收R04

资产池、日期、窗口、检验水平、阈值、仓位与全部成本情景值均未改动。P5-ALIGN对齐实现:真实入口先读取预注册原始字节,并以其SHA-256匹配数据manifest固定主规格摘要,匹配后才进入数据加载。构造自定义配置只标为探索;本报告使用冻结v2。

2.2 来源核查与阻断

真实价格需要未复权开收盘价、成交量、拆股比与每股现金股息,且许可须允许脚本下载、持久保存、银行内部培训使用和交付派生统计。以下仅继承2026-10-10的历史核查结论,本批未重新核现行条款,亦不将这些具体方案概括为全部免费源的普遍禁令(详见 qa/a7/project05_batch/DATA_SOURCE_DECISION.md):

来源 结论
Yahoo Finance 条款禁止未经事先许可的自动化收集与商业用途;未下载
Alpha Vantage 许可限于个人非商业用途
Tiingo 免费层不得持久保存;组织须购买商业计划
Stooq 机器人校验,不绕过
Nasdaq Data Link(Sharadar SEP/SFP) 待核实的采购候选:通用条款限内部业务用途并受Order Form约束,派生物对外分发须合同或书面批准,另有第三方条款;16只标的的覆盖、完整日期、未复权OHLCV、拆股与股息字段均未核实
其他免费源与历史借券数据 个人限定、禁止脚本采集或未找到(scout报告,部分未经主机复读)

因此 data_manifest.json 的status为blocked,CLI的 --data real 以退出码3拒绝运行且不写任何文件(c5实测)。任何具体订阅是否覆盖本项目的内部教学使用,须由机构合同确认,本报告不登记为已授权。

2.3 教学构造面板(本报告结果的唯一来源)

src/p05_constructed.py(seed 20261010,1,600个工作日)设计三对对数总回报路径:CA/CB协整(β=1.2\beta=1.2,残差AR(1),ϕ=0.97\phi=0.97);TA/TB共享随机趋势但各含独立随机游走(不协整);IA/IB相互独立。再按 Ct=(Ct−1/rt)(TRt/TRt−1)−DtC_t=(C_{t-1}/r_t)(TR_t/TR_{t-1})-D_t 去掉股息与拆股(CA第700日2:1拆股、TB第1100日3:1拆股,季度股息),使构造数据走与真实数据相同的公司行动代码。

3. 时间契约

字段 定义
event_time 交易日 dd 的开盘(09:30)与收盘(16:00),America/New_York
available_at 开盘价09:30可得;收盘价与当日全天成交量16:00后可得;DFF观测日 ss 的利率自 ss 次日可得(发布滞后近似为1个日历日)
signal_time 收盘 tt:z-score只用 ≤t\le t 的TR与形成期冻结参数
trade_time 下一交易日开盘 t+1t+1;没有同收盘成交
return interval 相邻收盘标记之间;NAV从形成期末收盘的 W0W_0 起,N+1个点给N个收益
label interval 无(信号不使用未来收益标签),故walk-forward无需purge/embargo

同一天的事件顺序:隔夜结息(前一收盘可得利率、前一收盘标记)→拆股→股息→两腿按09:30开盘价标记→开盘成交→日内结息(当日开盘可得利率、开盘标记)→收盘标记。

4. 方法

形成(只用训练段)。 每个504日形成窗对 log⁡TRy=α+βlog⁡TRx+e\log TR_y=\alpha+\beta\log TR_x+e 做OLS,冻结 α,β\alpha,\beta 与残差均值、标准差;EG检验用statsmodels coint(常数项、AIC滞后),临界值是MacKinnon协整残差分布,而不是普通ADF(第17章)。v2选入条件:未校正 p<0.05p<0.05 且 β>0\beta>0;窗口内BH qq 值只报告不用于筛选。

信号。 zt=(st−sˉ)/σ^sz_t=(s_t-\bar s)/\hat\sigma_s,sts_t 用冻结的 α,β\alpha,\beta 代入新TR。∣z∣≥2|z|\ge2 入场(z>0z>0 做空价差:空 yy、多 xx),∣z∣≤0.5|z|\le0.5 或穿越零出场,∣z∣≥4|z|\ge4 止损且同窗不再入场;窗口最后一个收盘发出强制退出请求,实际完成仍受样本、容量与整股支持域约束。

对冲与仓位。 对数价差的 β\beta 是弹性(xx 变动1%时 yy 平均变动 β\beta%):美元暴露 wy=s/(1+∣β∣)w_y=s/(1+|\beta|)、wx=−sβ/(1+∣β∣)w_x=-s\beta/(1+|\beta|),毛暴露为信号收盘NAV的1倍;信号时目标股数 nt=trunc⁡(wWt/Ct)n_t=\operatorname{trunc}(w W_t/C_t),先向零取整,再换算到次日拆股后的股数 rt+1ntr_{t+1}n_t;次日除息不增加目标股数,持有期不再平衡。取整前绝对股数比 ∣nx∣/∣ny∣=∣β∣Py/Px|n_x|/|n_y|=|\beta|P_y/P_x、有符号比 nx/ny=−βPy/Pxn_x/n_y=-\beta P_y/P_x,取整后只近似相等;水平回归 Py=a+bPx+eP_y=a+bP_x+e 的有符号对冲比为 −b-b(练习P5-01)。β<0\beta<0 时两腿同向,同向仓位在一阶上也能对冲负相关关系(β=−1.2\beta=-1.2 时两腿美元45.45万与54.55万同向,dlog⁡y=−1.2 dlog⁡xd\log y=-1.2\,d\log x 下一阶总损益为0);v2只是把项目限定为一多一空。IS决策参考价独立按次日开盘的公司行动换算:Pdec=Ct/rt+1−Dt+1P^{dec}=C_t/r_{t+1}-D_{t+1}。

执行与成本(情景,未校准)。 令Q为请求、F为实际非零成交;先按容量与整股规则得F,只有F更新现金/持仓。每条腿分别计:佣金0.005美元/股;半点差ETF 1bp、个股2bp;临时冲击 ησ20∣F∣/ADV20\eta\sigma_{20}\sqrt{|F|/ADV_{20}}(η=0.1\eta=0.1,σ20\sigma_{20}、ADV20ADV_{20} 截至信号收盘)。此处open为原未复权开盘价代理,不是可观测mid;成交价 == 开盘价 ×(1+sgn(F)(半点差+冲击))\times(1+\text{sgn}(F)(\text{半点差}+\text{冲击}));点差与冲击只在成交价中,现金只另扣佣金(第35章防重扣)。开盘成交预算:每腿最多成交截至信号收盘的ADV20的5%,换算到成交日拆股后股数。这是未校准的开盘成交情景,不是实际开盘市场容量,也不保证实际参与率;成交日全天量和 ∣q∣/|q|/全天量只在收盘后作诊断,不改变09:30成交。matched 政策下两腿按较小可成交比例同比例成交,入场剩余在到达时撤单;出场剩余不以撤单冒充平仓,按协议逐日补单;完成受有限样本、容量与整股支持域限制;independent 只作压力情景。

融资与借券。 ACT/360,区间开始现金 ×\times(DFF−25bp,若现金为正;DFF+50bp,若为负);借券费 =∣qshort∣×Pavail×0.25%×Δd/360=|q^{short}|\times P^{avail}\times 0.25\%\times\Delta d/360(实际空头股数、区间开始已可得标记:隔夜区间为前一收盘,日内区间为当日09:30开盘,拆股日为拆股后股数与拆股后开盘价);空头在除息日补偿股息。没有历史借券费与可借量数据,借券召回只能以 locate_unavailable 情景表示。

IS。 全部求和只对实际非零成交集合进行,空和为0;不将零成交乘未定义均价。每个母单只有一个首次到达价:延迟 Q(Parr−Pdec)Q(P^{arr}-P^{dec}) 只计一次;每次(含跨日补单)成交 Fk(Pkfill−Parr)F_k(P^{fill}_k-P^{arr});被新入场取代或样本末仍未完成的出场剩余计机会成本;入场剩余在到达时撤单,机会成本为0(第36章)。

交易统计。 一次交易(episode)按仓位定义:从离开空仓的第一笔成交,到两腿都回到零的那笔成交;出场未完成时出现的新入场单并入同一次交易,记为reentry。交易损益 == 成交现金流 −- 佣金 ++ 持仓期股息 −- 借券费,不含现金利息。胜率为已闭合交易中损益为正的比例,持有天数为首笔到闭合成交之间的交易日数;样本末未平仓的交易单独计数,不进胜率;无已闭合交易时胜率与持有天数为缺失。换手只按实际成交金额:双边 ∑∣q∣Pfill\sum|q|P^{fill},年化单边换手 =0.5×=0.5\times双边//日均NAV×252/N\times252/N;不使用订单数量。无交易分仓的超额Sharpe也记缺失(超额收益只是计息离散误差)。

walk-forward。 504日形成、126日交易、126日步长滚动。每对同时运行screened(只在通过v2筛选的窗交易)与ungated(每窗都交易)两套独立账本,每套 W0=1,000,000W_0=1{,}000{,}000 美元;组合为等资本分仓之和。

5. 实现验证(构造面板)

  • c5历史测试40项通过;P5-ALIGN历史52项通过(含新增股数与真实入口反例)。c5新增:只扰动成交日全天成交量时,当日09:30成交、价格、现金与当日收盘前NAV逐项不变;开盘预算等于由输入面板手算的ADV20×5%(含拆股换算);无成交既存空头、一腿成交日与拆股日的日内借券基数均由输入价格和实际持仓独立推出;单笔交易的损益、胜率、持有天数与双边成交金额手算一致;未平仓交易不进胜率;v2排除 β≤0\beta\le0 的窗且CLI拒绝v1。
  • 变异检验:改回“成交日全天量定容量”、删去开盘标记、去掉 β>0\beta>0 条件,各有对应新测试失败(c5作者检查)。
  • 账本现金恒等式 现金=W0+利息−借券+股息−成交额−佣金\text{现金}=W_0+\text{利息}-\text{借券}+\text{股息}-\text{成交额}-\text{佣金} 在全部账本残差约 10−910^{-9} 美元。

P5-ALIGN历史阶段曾重跑主情景与全部稳健性情景(本批未重跑);11个CSV(含订单、现金事件、NAV、episode、指标、网格与压力订单)与c5逐字节相同,因此下列数字和5幅未变图沿用c5身份。专项实际订单证明:信号收盘100、权重0.5、NAV一百万、次日除息1时,旧订单5,050股,修复后5,000股,IS参考价仍99。正负腿、同时拆股/股息与取整顺序均通过;独立现金复算包含实际成交、佣金、股息、利息与借券。真实入口同schema改阈值被摘要闸门拒绝,匹配字节可通过摘要闸门,但当前真实数据仍退出3且无输出。

6. 构造演示结果(不是市场证据)

24次检验(3对×8窗);EG p<0.05p<0.05 4次;v2选中3次(CA_CB窗2–4)。IA_IB窗5(p=0.047p=0.047,β^=−1.907\hat\beta=-1.907)因 β≤0\beta\le0 被排除。若全为原假设且各p值正确校准,期望线性给出 24×5%=1.224\times5\%=1.2 个 p<0.05p<0.05,不需要独立;重叠窗口和共用序列不是独立的24次试验。窗口内BH q<0.10q<0.10 只有1个(CA_CB窗3),仅作窗口内描述,未证明全部相关窗口上的FDR控制。

EG p值热图

图1:横轴walk-forward窗,纵轴配对,格内为形成期EG pp 值,标出v2选中的窗与因 β≤0\beta\le0 排除的窗。CA_CB(真协整)只在3个窗通过,其余 pp 在0.07–0.20:504日、ϕ=0.97\phi=0.97 时检验功效有限。IA_IB(真独立)在窗5的 p=0.047p=0.047 是一次假阳性;它的入选没有真实协整依据,这一点来自构造的数据生成过程和多重检验,不能单凭 β\beta 的符号推出。TA_TB(共同趋势、不协整)全部未通过。

配对 方式 总收益 年化 年化波动 超额Sharpe 有符号最深回撤 min(drawdown) 闭合交易 胜率 平均持有(交易日) 年化单边换手
CA_CB screened 6.06% 1.48% 1.63% −0.14 −1.87% 4 25% 37.3 1.00
CA_CB ungated 11.71% 2.81% 2.26% 0.48 −1.87% 8 50% 33.5 2.01
TA_TB screened 7.10% 1.73% 0.06% 缺失 0.00% 0 缺失 缺失 0.00
TA_TB ungated −6.02% −1.54% 3.74% −0.86 −9.17% 6 50% 47.2 1.55
IA_IB screened 7.10% 1.73% 0.06% 缺失 0.00% 0 缺失 缺失 0.00
IA_IB ungated −3.28% −0.83% 9.24% −0.23 −30.48% 8 62.5% 47.6 2.03
组合 screened 6.76% 1.65% 0.55% −0.15 −0.58% 4 25% 37.3 0.33
组合 ungated 0.81% 0.20% 3.11% −0.47 −12.32% 22 54.5% 42.4 1.86

1,008个日收益(构造日期2013-12-06至2017-10-18)。现金贷记利率按构造2%减25bp,所以无交易的分仓也有约7%总收益。所有分仓都没有样本末未平仓的交易。

screened与ungated净值

图2:纵轴为美元NAV,起点 W0W_0;实线screened,虚线ungated,右下为三对等资本合计。读法: v2下screened组合超额Sharpe为−0.15,只来自CA_CB的4笔交易(胜率25%);真协整的CA_CB在screened下少交易、表现不如ungated。v1(c1–c4)选中4次、screened组合0.39,主要来自IA_IB那次假阳性入选;v2排除它以后结果转负。这不能读成“v2更好”或“筛选有效”:v2是看过构造结果后因项目范围与时点修复冻结的设计变更,已在预注册中披露;两个版本都表明筛选会漏掉真关系、也会放进偶然关系。

单窗价差

图3:CA_CB窗2冻结价差的z-score,虚线为 ±2\pm2 入场、点线 ±0.5\pm0.5 出场、点划线 ±4\pm4 止损;图中横轴使用fill_date,而z值来自相应signal_date;标记因此是在成交日期位置显示的信号日z值,不是成交日重新计算的z。该显示债沿用B23/P5_PLOT_CLOCK_CARRY_FORWARD,原图未重绘,不能靠改图注宣称已修图。窗口末的平仓由强制规则触发,不是均值回归。

成本与融资归因

图4:screened各分仓累计现金项(美元)。构造利率下利息远大于交易摩擦;CA_CB四笔交易的点差1,658、冲击442、佣金426、借券704美元,空头补偿股息后净股息为+826美元。配对的股息差是真实现金项,不能用复权价“抹掉”。

7. 稳健性(构造,全部格点见 robustness.csv)

稳健性

图5:左为成本网格中借券25bp时screened组合超额Sharpe随半点差倍数与 η\eta 的变化;右为入场/出场阈值网格。

  • 成本网格(27格):screened组合超额Sharpe全部为负,−0.41至−0.12;借券费从25bp升到5%时区间由−0.21至−0.12降到−0.41至−0.32。
  • 阈值网格(6格):−0.28至−0.03,全部为负。网格只作描述,没有据此改主规格。
  • 252日形成窗:screened组合超额Sharpe −0.02、ungated −0.77。
  • 部分成交压力(W0=109W_0=10^9、预算为ADV20的5%):matched 下4个入场母单(8条腿)只成交下单量的1.6%–2.0%(中位1.9%),组合收益主要是利息,决定结果的是容量预算,不是信号;independent 政策下首次成交的实际股数比可偏离下单比约64%(练习P5-09,预算为ADV20的1%)。收盘后诊断显示,实际成交量占当日全天量的比例最高到6.4%,高于5%的事前预算:预算不是实际参与率保证。

按预注册判断规则,构造面板上主规格没有正结果可供“支持”,结论为证据不支持该策略;这些负结果全部保留。

8. 限制

最新整股支持域在每日任何现金入账前检查:实际持仓拆股后将为7.5股时,于隔夜结息/公司行动之前整账户失败;精确十进制权益换算不是实际零碎股可执行保证。空仓7.5股请求可整股成交7并撤入场余量,是另一状态。不得删除失败窗口后继续报告固定样本;退出补单不保证样本结束前清零。历史ALIGN末段曾允许保留实际零碎持仓,现由最新边界覆盖,历史入口不改。

  1. 真实价格实证blocked;以上没有任何真实资产结论。
  2. 成本、冲击、借券费、利差、开盘成交预算均为情景,未校准;没有报价与开盘时段成交量数据,开盘成交价不是中间价;无永久冲击。
  3. 借券可得与召回只用情景表示;无历史借券数据。
  4. 股息在除息日入账(非支付日);DFF发布时滞用1日近似。
  5. 构造面板只有3对、8窗;检验功效、选择效应的大小都取决于构造参数,不可外推。
  6. 预注册是本地文件哈希冻结,不是外部注册平台。v2在看到构造结果之后冻结,已披露动因;它在任何真实数据分析之前冻结,真实数据阶段不得再改。
  7. 交易损益不含现金利息;胜率与持有天数只描述构造样本中的少数交易(screened组合4笔),不具统计意义。

9. 结论与补跑路径

能说: 预注册v2的设计、筛选、冻结价差、次日开盘双腿执行、事前开盘成交预算、成本/融资/借券/股息/拆股账本、IS分解与交易统计已实现,并经行为测试与变异检验;在构造面板上,流程正确地暴露了相关≠\ne协整、错误临界值和筛选选择效应。不能说: 预注册的8个真实配对是否协整、策略是否盈利、成本或容量的真实水平。

数据到位后(机构许可确认、字段样本核验、data/processed/p05/ 文件与 data_manifest.json status=frozen),从数据节点按v2重跑:TR构建→8对×全部窗口形成与检验→screened/ungated账本→成本、阈值、形成窗、部分成交网格→图→Notebook→本报告第6–9节。现有构造结果不得沿用为真实结论。

10. 读者运行与历史复核

普通读者从已接受I3包根执行 .venv/bin/python run_notebook.py projects/project05/notebooks/p05_pairs.ipynb,新constructed主路线写唯一RUN_DIR,外层runner另保留执行副本与execution.json。它fresh运行三对screened/ungated形成与账本,给表与一图,不执行以下完整CLI网格。英文Notebook层、整包便携及冷启动归BIL23,本批未执行。下面是历史复核/维护命令,不是普通读者必须逐条运行的清单;build_notebook.py会写源Notebook。

.venv/bin/python projects/project05/run_project05.py --data constructed --out <新目录>/cli
.venv/bin/python projects/project05/make_figures.py --run <新目录>/cli --out <新目录>/figures
.venv/bin/python -m pytest projects/project05/tests/test_p05_pairs.py -q
.venv/bin/python projects/project05/solutions_code.py
cd projects/project05 && ../../.venv/bin/python notebooks/build_notebook.py

CLI默认读取 configs/preregistration_v2.json,在 summary.json 中记录其SHA256、选入规则、开盘预算和事件顺序;输出目录已存在时拒绝运行。先修与对应:第16、17章(平稳、协整与EG临界值);第29章(未复权价+公司行动账本);第31章(walk-forward);第35章(成本、融资、借券、防重扣);第36章(执行时钟与IS)。Part VI接口对照见 qa/a7/project05_batch/PART_VI_CONSISTENCY_c5.md。

搜索教材

输入关键词开始搜索。