跳至正文
全部策略

策略

量化交易:QuantRocket GDX–GLD日线 Johansen/Bollinger 配对策略,忠实翻译USEQ | Stratmill

结局: 已放弃

GdxGldJohansenBollingerPairs

结局总结

GdxGldJohansenBollingerPairs 旨在尽可能忠实地将 QuantRocket 的 GDX/GLD Johansen/布林带配对策略移植到 USEQ 场所。由于沙盒中无法使用 statsmodels,因此用 numpy 重新实现了 statsmodels 的 coint_johansen。经过 3 次迭代,第 3 层沙盒冒烟测试仍持续超出约 20,000 根 K 线、GDX 日线窗口的 300 秒限时。运行在验证循环中被放弃。回测、优化或分析师结论均未生成,因此策略是否具有优势仍是未知数。

假设

移植 QuantRocket 可执行的 GDX_GLD_Pair 子类,保留其每日滚动 Johansen 权重、一倍标准差布林带、独立且持续的多空信号状态、每日目标权重重算和下一交易时段开盘执行。使用 GDX.USEQ 作为主要标的,GLD.USEQ 作为次要交易腿,两者均采用 1-DAY-LAST-EXTERNAL K 线。原始默认值为 LOOKBACK_WINDOW=20、BBAND_STD=1、DB_FIELDS=['Close','Open'];子类从 usstock-1d 中选择 GDX 和 GLD。原始 USStockCommission 按每股收取 $0.005;将该佣金替换为平台的 USEQ 零佣金及模型化价差/冲击成本,并明确报告差异。不得声称源策略盈利,也不得添加过滤条件、止损、协整显著性检验或参数优化。

忠实翻译源代码的明确要求决定了交易标的和机制。这一配对策略为主要由仅做多的 Binance 策略构成的语料库增加了多空双标的股票敞口。它没有填补 Hyperliquid 或跨场所配额。语料库集中度数据为空,因此无法评估特定标的研究的占比。与此前的双重股权类别提案不同,此源策略交易矿业股与金条,并每日重新计算 Johansen 权重;但其经济性仍未得到验证。

verification_loop:sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根 K 线的窗口(2400 天,GDX.USEQ-1-DAY-LAST-EXTERNAL)上超出 300 秒运行时限。这几乎总是意味着每根 K 线上的工作量随历史数据增长,例如反复扫描完整的资金费率/补充序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查询,使每根 K 线的成本为 O(log n),而非 O(n)。

实现

忠实移植 Stratmill 版本的 QuantRocket GDX_GLD_Pair(PairsStrategy,Apache-2.0)。每个交易时段使用前 20 个收盘价对 [GLD, GDX] 拟合 Johansen 对冲向量(det_order=0,k_ar_diff=1)。当日价差使用 20 个交易时段、1 倍标准差的布林带(ddof=1)。独立且持续的价差多头和空头状态在突破布林带时入场,在回归均值时退出。目标权重为信号 x 对冲权重 x 收盘价,并归一化至 1x 总敞口。两条腿在一个交易时段后按整股数量再平衡至目标。

第 3 次迭代修复了第-1.5层错误“optimization_plan 将杠杆固定为 1.0”。第 2 次迭代的配置从 `parameters` 中漏掉了 `leverage`,而计划验证器要求每个已修复的键都以相同类型出现在其中。已恢复 `parameters.leverage = 1.0`(float),且 validate_plan 在本地通过研究计划验证。代码现在将其作为 config.leverage 的文档化镜像读取,仓位规模计算会使用该值。保留第 -2 次迭代中不改变行为的整理:closes deque 的 maxlen=lookback,并直接用于 Johansen 拟合。信号、状态机、权重和执行方式均未改变。平台适配也未改变:在下一交易时段收盘执行,而非下一交易时段开盘(因为日线没有开盘集合竞价成交);使用 USEQ 零佣金和模型化价差/冲击成本,替代 USStockCommission 每股 $0.005 的收费。第 1 次迭代在本地运行后显示没有优势:夏普比率 -0.03,PF 0.95,平均交易 -0.009%,最大 DD 29%。这与假设中的“不得声称源策略盈利”一致。此前第-3层的超时经诊断源于目录扫描和主机负载成本,而非策略每根 K 线的计算工作。

验证结果

sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根 K 线的窗口(2400 天,GDX.USEQ-1-DAY-LAST-EXTERNAL)上超出 300 秒运行时限。这几乎总是意味着每根 K 线上的工作量随历史数据增长,例如反复扫描完整的资金费率/补充序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查询,使每根 K 线的成本为 O(log n),而非 O(n)。

迭代历史

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

结局总结

滚动 Johansen 计算若在每根 K 线上都重建矩阵并求逆或分解,且使用纯 numpy 实现,就必须控制每根 K 线的计算成本(例如按时间戳缓存并避免反复扫描缓冲区),否则将无法满足沙盒时限。

运行在 3 次迭代后因验证循环而放弃。第 3 层沙盒回测在约 20,000 根 K 线的窗口(GDX.USEQ 根日线,跨度 2400 天)上超出 300 秒限时,因此回测审查、优化、分析师审查和风险审查都未运行。

这是将 QuantRocket 的 GDX/GLD 配对策略直接移植到日频 USEQ K 线的版本。每天根据最近 20 个收盘价的 Johansen 检验计算对冲比率,在一倍标准差布林带之间交易价差,并于一个交易时段后再平衡至目标权重;佣金为零,另计模型化的价差和冲击成本。

没有绩效数据:没有生成回测报告、优化报告或交易次数,因为策略未能通过验证。

分析

PairsStrategy

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