跳至正文
全部策略

策略

XLE/USO 能源股与原油价差均值回归(USEQ 日线、美元中性、时点信息 OU 拟合)OU

结局: 已放弃

XleUsoOuLogSpreadReversion

结局总结

XleUsoOuLogSpreadReversion 尝试将随机价差商品配对模型迁移到 XLE 与 USO,使用 20 年的 US 日度股票数据,交易经过贝塔对冲的对数价差中 OU Z 分数极值。该假设引用了研究前适度的优势(平均每笔交易约 +0.5%,夏普比率约 0.3),并指出存在显著的选择偏差。经过 3 次迭代,代码始终未通过验证:第 1.5 层每次都因 optimization_plan 将杠杆固定为 1.0 而拒绝尝试。运行在任何回测、优化或分析师结论形成前便已放弃,因此该优势在流程中仍未经过检验。

假设

译自 Mahajan 等人(2019)的《印度大宗商品市场中的随机价差配对交易》(arXiv:1907.08397;摘要:协整大宗商品配对,在 LOG 价差上使用单因子随机(OU)模型,交易规则参数在训练数据上拟合)。我们的交易场所不提供 MCX 现货大宗商品,因此采用历史数据最长、最接近的可回测大宗商品配对:XLE.USEQ(综合石油和天然气股票)与 USO.USEQ(近月 WTI 原油 ETF),两者均有自 2006 起的 1-DAY K 线数据(约 20 年、约 5,100 个对齐交易时段)。经济联系:XLE 成分股的现金流受原油驱动,因此中期内对数价差 log(XLE) - beta*log(USO) 均值回归。短期价差因股票特定资金流、原油期货换月和期货溢价冲击而扩大,随后随着股票市场重新定价石油敞口而收敛。论文模型的时点信息实现方式:(1)对冲比率 beta = XLE 对 USO 日对数收益的滚动 252 时段 OLS 斜率,滞后一个 K 线。(2)价差 s_t = log(XLE_t) - beta_{t-1}*log(USO_t)。(3)OU 参数(theta = 长期均值,sigma_eq =……展开收起

译自 Mahajan 等人(2019)的《印度大宗商品市场中的随机价差配对交易》(arXiv:1907.08397;摘要:协整大宗商品配对,在 LOG 价差上使用单因子随机(OU)模型,交易规则参数在训练数据上拟合)。我们的交易场所不提供 MCX 现货大宗商品,因此采用历史数据最长、最接近的可回测大宗商品配对:XLE.USEQ(综合石油和天然气股票)与 USO.USEQ(近月 WTI 原油 ETF),两者均有自 2006 起的 1-DAY K 线数据(约 20 年、约 5,100 个对齐交易时段)。经济联系:XLE 成分股的现金流受原油驱动,因此中期内对数价差 log(XLE) - beta*log(USO) 均值回归。短期价差因股票特定资金流、原油期货换月和期货溢价冲击而扩大,随后随着股票市场重新定价石油敞口而收敛。论文模型的时点信息实现方式:(1)对冲比率 beta = XLE 对 USO 日对数收益的滚动 252 时段 OLS 斜率,滞后一个 K 线。(2)价差 s_t = log(XLE_t) - beta_{t-1}*log(USO_t)。(3)OU 参数(theta = 长期均值,sigma_eq = 平稳标准差,kappa 来自 AR(1) 系数)通过对最近 `z_window` 个时段的 s 与其滞后值做 AR(1) 回归拟合,仅使用已完成的 K 线。采用 AR(1) 闭式解代替论文中的差分进化拟合;对单因子 OU 来说两者等价,且无需额外计算。(4)z = (s_t - theta)/sigma_eq。多空、美元中性,2 腿,大部分时间空仓。首先检查了加密货币替代方案,但因数据原因予以排除。Binance/OKX 黄金和白银永续合约(XAU/XAG/XPT/COPPER)仅有约 7-10 个月的 1 小时历史数据。黄金代币之间的价差(Binance 上的 XAU、PAXG 和 XAUT,以及 Binance 的 XAG 与 OKX)小时标准差为 3-6 基点,所有变体扣除费用后均亏损(平均每笔交易为 -0.01% 至 -0.06%)。对 USEQ 日线的研究前分析(滚动 beta、60 时段 z、入场 |z|>1.5-2.0、均值处退出、最多持有 20 个时段、成本 6 基点)得出 XLE/USO 约有 100-158 笔交易,平均每笔交易为 +0.51% 至 +0.58%,胜率约 0.6,夏普比率约 0.30-0.33,在 60-70% 个年份中为正。HONEST CAVEAT:在扫描的 21 个大宗商品-ETF 配对中,XLE/USO 表现最好(GLD、SLV、GDX、XLE、XOP、USO、UNG)。GLD/SLV 和 GLD/GDX 这两组“教科书式”大宗商品配对并无优势,因此选择偏差影响重大,预期 OOS 夏普比率适度。完整论文还需确认:确切的交易规则形式(以 OU 个标准差为单位的入场/退出区间、是否有止损区间)、区间是固定的还是按每个配对优化,以及报告的夏普比率 > 1.4 是否已扣除成本。摘要称参数在“训练期内通过回测优化”,因此 1.4 很可能是在样本内调优得出的数字。source_ref:arXiv:1907.08397 摘要(方法段:Johansen 协整筛选 + 对数价差上的单因子随机价差模型 + 在 80% 训练集上调优交易规则)。

代表性不足的类别:USEQ 场所(4.7%)、long_short(15.3%,而多头目标为 <= 55%)、配对。加密货币版本已经测试,但扣除费用后无利可图;加密金属永续合约缺少历史数据。大宗商品股票 ETF 有 20 年日线数据。仅有 3 个可调参数,且都具有经济含义。考虑到选择偏差这一限制,预注册的数字刻意保持保守。

verification_loop:验证失败(第 1.5 层——假设与配置一致性)[类别=hypothesis_mismatch]: - optimization_plan 将杠杆固定为 1.0

实现

USEQ 日线上的美元中性 XLE/USO 配对交易。对冲比率 = XLE 对 USO 日对数收益的滚动 252 时段 OLS beta,滞后一个 K 线。价差 s = log(XLE) - beta*log(USO)。OU 参数来自对最近 z_window 个已完成时段进行的闭式 AR(1) 拟合,窗口内每个价差都使用相同的滞后 beta 重新构建。z = (s - theta)/sigma_eq。仅当半衰期 <= max_half_life 且 |z| < stop_z 时,在 z <= -entry_z 买入价差,在 z >= entry_z 卖出价差。在均值处(exit_z)、止损区间(stop_z)或持仓 max_hold 个时段后退出。每条腿都作为独立仓位入账,各占权益的 gross_notional_frac/2。

第 3 次迭代修复了关键的预热缺陷。min_bars_required() 现在返回 2,因此 calculate_signal 从第 1 根 K 线开始运行,且只通过内部的 _beta_ok/_fit_ok 标志控制交易。对数价格从第 1 根 K 线开始缓冲;beta 需要 252 对收益数据,因此所有 z_window(范围 [40,120])的第一个有效 z 值都在第 254 根 K 线出现。这处于注册的 380 根 K 线预热期内,因此滚动前向窗口重置后不再损失 15-24 个月的数据。QA beta 混合警告也已处理:OU 窗口现在存储(对数 XLE、对数 USO),并用当前滞后 beta 重新构建每个价差,每根 K 线的成本为 O(z_window),因此对冲比率漂移不会造成虚假的 z 值偏离。两条腿仍保持美元金额相等,因为假设规定美元中性;尽管 beta 通常低于 1,这仍是有意为之(另一种选择是采用 beta 中性仓位规模)。孤立对冲腿的清理逻辑未变;在日线数据下,敞口最多持续一个交易时段。优势疑虑(收益集中在波动率承压最高的三分位组、2020 USO 重组,以及扫描 21 个配对带来的选择偏差)属于假设层面的风险,应由分析师结合全历史和滚动前向结果判断;代码没有对此作出更改。

验证结果

验证失败(第 1.5 层——假设与配置一致性)[类别=hypothesis_mismatch]: - optimization_plan 将杠杆固定为 1.0

迭代历史

验证失败(第 4 层——QA审查)[类别=code_defect]: - [edge_concern] 沙盒运行了 1,653 个交易时段,产生 44 个单腿仓位(22 笔配对交易)。结果为 +3.2%,夏普比率为 0.13,PF 1.17,平均每笔交易为 +0.29%。几乎所有收益都来自波动率承压最高的三分位组(+4.28%);平静和正常三分位组都略有亏损。研究人员称 XLE/USO 是扫描的 21 个配对中表现最好的,因此选择偏差影响重大。USO 的 2020 重组(从仅交易近月期货切换,1:8 反向拆股)也在样本期间改变了原油敞口。请检查这一优势在 2008、2014-16、2020 和 2022 之外是否仍然存在。 - [严重] 实际预热期约为声明值的两倍。覆盖方法 min_bars_required() = beta_window + z_window + 3(默认值下为 375)导致基础方法 _maybe_process_primary 在前 375 根 K 线调用 calculate_signal 前就返回 BEFORE。这些 K 线期间,_rets 和 _spreads……展开收起

验证失败(第 4 层——QA审查)[类别=code_defect]: - [edge_concern] 沙盒运行了 1,653 个交易时段,产生 44 个单腿仓位(22 笔配对交易)。结果为 +3.2%,夏普比率为 0.13,PF 1.17,平均每笔交易为 +0.29%。几乎所有收益都来自波动率承压最高的三分位组(+4.28%);平静和正常三分位组都略有亏损。研究人员称 XLE/USO 是扫描的 21 个配对中表现最好的,因此选择偏差影响重大。USO 的 2020 重组(从仅交易近月期货切换,1:8 反向拆股)也在样本期间改变了原油敞口。请检查这一优势在 2008、2014-16、2020 和 2022 之外是否仍然存在。 - [严重] 实际预热期约为声明值的两倍。覆盖方法 min_bars_required() = beta_window + z_window + 3(默认值下为 375)导致基础方法 _maybe_process_primary 在前 375 根 K 线调用 calculate_signal 前就返回 BEFORE。这些 K 线期间,_rets 和 _spreads 都没有数据。注释称缓冲区会“在重启后从预热 K 线重建”,但代码并未实现。滚动状态直到约第 375 根 K 线才开始填充。之后还需要 252 对收益数据,_beta_ok 才会变为 true,此外还需 z_window+1 个已完成价差,_fit_ou 才能成功。因此第一个有效 z 值约出现在第 375 + 253 + 61 ≈ 689 根 K 线(当 z_window = 120 时约为 870)。注册合约声明 warmup_bars = 380,并设定 boundary_policy reset_with_warmup;src/backtesting/warmup.py 会在每个滚动前向窗口前恰好添加 380 根历史 K 线。运行器的保护检查只比较 min_bars_required()(375)与 380,所以检查会通过,但实质上违背了合约。每个重置窗口都会因此损失最初约 310-490 个可交易时段(相当于 15-24 个月的日线 K 线)。自适应的 90 日验证窗口将完全失效,产生零笔交易。优化会失败或无法测量任何内容,而全历史运行则会悄然损失开头约 2.7 年的数据。(第 45 行)——修复:二选一:(a) 让 min_bars_required() 返回较小的数值(例如 2),仅通过内部的 _beta_ok/_fit_ok 标志控制交易,使 380 根预热 K 线能够填充双端队列;在 z_window = 120 时,最坏情况需要 253 + 121 = 374 根 K 线,仍在 380 以内。或 (b) 保留覆盖方法,但在处理第一根 K 线时,根据 self._bars 中的数据重建 _rets 和 _spreads,并通过 ts_init 与 self._extra_bars[USO] 配对。无论采用哪种方法,都要证明当 z_window = 120 时,第一个非零 z 值不晚于第 380 根 K 线出现。 - [警告] 两条腿的美元金额相等,符合假设中的“美元中性”,但信号使用的是 beta 加权价差 log(XLE) - beta*log(USO)。XLE 对 USO 的日收益 beta 通常约为 0.3-0.6。因此仓位的盈亏跟随 r_XLE - r_USO,而非 r_XLE - beta*r_USO:约一半的 USO 腿是未对冲的原油方向性押注。这符合原假设,因此不会阻止流程,但实际交易的价差并非计算 z 分数的价差。(第 211 行)——修复:考虑将 USO 腿的规模设为 XLE 名义金额的 beta 倍(beta 中性),或者明确说明尽管 beta != 1,仍有意采用美元中性。 - [警告] 每个已存价差都使用计算时适用的 beta,因此 AR(1)/OU 窗口中的价差混用了不同对冲比率。log(USO) 的水平约为 2-5,因此窗口内 beta 变动 0.05 会使 s 移动 0.1-0.25。这与 sigma_eq 相当,可能造成虚假的 z 值偏离。这种做法符合时点信息要求(没有前视偏差),但比论文中的固定 beta 价差更嘈杂。(第 148 行)——修复:可选地使用当前滞后 beta 重新计算 z_window 个价差,即 s_i = lx_i - beta_{t-1} * lu_i,并将对数价格保存在双端队列中;每根 K 线的计算成本为 O(z_window)。 - [警告] 孤立的 USO 对冲腿只会在 should_enter 中清理(主仓位平仓后的下一根 K 线)。如果 XLE 入场在 position_size 已提交 USO 订单后遭到拒绝(例如被基础模板的门控拒绝),则 USO 会无对冲地保持开放一个交易时段。对于日线数据,这可以接受,但对冲单是在确认主订单是否获接纳之前提交的。(第 168 行)——修复:等主订单获接纳后再提交对冲腿,或立即检查主订单是否获接纳。

结局总结

编写代码前,应让优化计划中的杠杆设置与假设及交易场所声明一致(Reg-T 2x USEQ 多空配对),因为若配置一致性不匹配在多轮迭代后仍未修复,流程会在产生任何回测证据前结束。

经过 3 次迭代后,该策略在验证循环中被放弃。每次尝试都因 optimization_plan 将杠杆固定为 1.0 而未通过第 1.5 层(假设与配置一致性,类别 hypothesis_mismatch)。流程从未进入回测、分析师审查或风险审查。

一种日线 USEQ 美元中性配对交易,基于对数价差 log(XLE) - beta*log(USO),采用滞后的 252 时段滚动对冲比率和时点信息 AR(1)/OU 拟合;当 OU z 分数偏离过大时入场,在均值处退出(改编自 Mahajan 等人 2019,arXiv:1907.08397)。

未产生流程回测或优化结果。唯一的数字来自假设自身的研究前分析:约 100-158 笔交易,平均每笔交易为 +0.51% 至 +0.58%,胜率约 0.6,夏普比率约 0.30-0.33,且在 60-70% 个年份中为正。假设本身已提醒,扫描的 21 个大宗商品-ETF 配对中,XLE/USO 表现最好。

分析

印度大宗商品市场中的随机价差配对交易

Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。