策略
大宗商品ETF 12月动量:按自身趋势方向筛选排名极端的标的,在USEQ只商品ETF(GLD、SLV、USO、UNG)中做多最强、做空最弱;每21个交易日调仓,按波动率倒数确定仓位,明确空仓状态(USEQ 1-DAY)
结局: 已放弃
CommodityEtfRankExtremeTsmomLS
结局总结
CommodityEtfRankExtremeTsmomLS 将 Quantpedia/QuantConnect 的商品动量策略调整为适用于四只 USEQ 商品 ETF,并且仅当该品种自身的 12 个月趋势符号与对应仓位腿的方向一致时,才持有该腿。鉴于此前发生过沙盒超时,设计要求每根柱线的工作量为 O(1),代码也使用了定长双端队列和滚动总和。尽管如此,经过 3 次迭代后,该策略仍在 2400 天、GLD 窗口内超过第 3 层沙盒的 300 秒限制,并在验证循环中止。它从未进入回测、优化、分析师审查或风险审查阶段,因此没有任何表现指标。
假设
移除了每根柱线的执行重试路径和反复扫描订单/仓位缓存的逻辑。现在仅在按日历锚定的再平衡柱线上进行对账,同时保留固定大小的滚动状态和现有信号逻辑。
verification_loop:sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根柱线的窗口内(GLD.USEQ-1-DAY-LAST-EXTERNAL 的 2400 天)超过了 300 秒的墙钟时间限制。这几乎总是意味着每根柱线的工作量会随历史长度增长,例如反复扫描完整的资金费率/补充数据序列,或在每根柱线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE,并使用 bisect;也可以按时间戳缓存查找结果,使每根柱线的成本为 O(log n),而不是 O(n)。
实现
每 30 个日历日按过去 12 个月收益为商品 ETF 排名;仅在最强品种收益为正时持有多头,仅在最弱品种收益为负时持有空头,并按波动率倒数调整仓位且设上限。
验证结果
sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根柱线的窗口内(GLD.USEQ-1-DAY-LAST-EXTERNAL 的 2400 天)超过了 300 秒的墙钟时间限制。这几乎总是意味着每根柱线的工作量会随历史长度增长,例如反复扫描完整的资金费率/补充数据序列,或在每根柱线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE,并使用 bisect;也可以按时间戳缓存查找结果,使每根柱线的成本为 O(log n),而不是 O(n)。
结局总结
多工具策略在重新提交前必须经过分析,确认在沙盒中每根柱线的成本确实为 O(1)。该策略假设已要求使用 O(1) 个双端队列和滚动总和,但这仍不足以通过超时检查,因此应检查剩余的每柱工作量(例如是否每根柱线都查询各工具的缓存/订单并排序,而不是仅在再平衡柱线上执行)。
经过 3 次迭代后,运行在验证循环中止。第 3 层沙盒回测在约 20,000 根柱线的窗口(GLD.USEQ-1-DAY 的 2400 天)内超过了 300 秒的墙钟时间限制,这通常意味着每根柱线的工作量会随历史长度增长。
一种在 USEQ 只商品 ETF(GLD、SLV、USO、UNG)上运行的 12 个月横截面商品动量策略:仅当最强品种的 12 个月收益为正时做多,仅当最弱品种的 12 个月收益为负时做空;每 21 个交易时段再平衡并按波动率倒数调整仓位。其依据是展期收益和持续存在的库存状态驱动商品动量。
未测量策略表现:没有回测报告,也没有优化报告,因此没有收益、夏普比率或交易次数数据。
分析
商品期货中的动量效应
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。