跳至正文
全部策略

策略

QuantRocket“TrendDayStrategy”移植版:杠杆ETF午后趋势日延续策略(在午后检查点相较前收盘上涨超过6%则做多,下跌超过6%则做空,时段收盘时平仓),应用于 TQQQ/SQQQ/UVXY USEQ 1-HOUR

结局: 已放弃

TrendDayLeveragedEtfUseq

结局总结

TrendDayLeveragedEtfUseq 将 QuantRocket 的午后趋势日延续规则移植到 USEQ 小时 K 线上三个杠杆/波动率 ETF。由于 Yahoo 小时网格没有 14:00 收盘价,规则调整为在 14:30 ET 检查点执行。两次迭代均未通过第 3 层沙盒回测,在 833 天的 TQQQ 窗口上超过 300 秒限时。开发者将超时归因于主机 I/O 负载过高时的目录文件发现,而非策略逻辑。运行在验证循环中被放弃,未进入回测、优化、分析师或风险审查,因此其优势从未得到测量。

假设

移植 QuantRocket 的开源 Moonshot 策略“TrendDayStrategy”(代码“trend-day”,https://github.com/quantrocket-codeload/trend-day, Apache-2.0,作者 QuantRocket LLC,其应获致谢)。ORIGINAL RULES,严格依照原文:股票池“leveraged-etf”,使用 US 只股票的 1 分钟数据;DB_TIMES 14:00 和 15:59;MIN_PCT_CHANGE = 0.06。每天:收益率 =(OPEN 的 14:00 根 K 线收盘价 - 前一时段 15:59 根 K 线的 CLOSE)/ 前一时段收盘价。若收益率 > +0.06,发出 +1(做多)信号;若收益率 < -0.06,发出 -1(做空)信号;否则为 0。权重:allocate_fixed_weights_capped(信号,0.20,上限=1.0),因此每个有效持仓获得 20% 的资金;若总敞口超过 100%,则按比例缩减所有权重。信号当日以 14:01 的 MARKET 订单入场(14:00 根 K 线的收盘价为入场价),并在……展开收起

移植 QuantRocket 的开源 Moonshot 策略“TrendDayStrategy”(代码“trend-day”,https://github.com/quantrocket-codeload/trend-day, Apache-2.0,作者 QuantRocket LLC,其应获致谢)。ORIGINAL RULES,严格依照原文:股票池“leveraged-etf”,使用 US 只股票的 1 分钟数据;DB_TIMES 14:00 和 15:59;MIN_PCT_CHANGE = 0.06。每天:收益率 =(OPEN 的 14:00 根 K 线收盘价 - 前一时段 15:59 根 K 线的 CLOSE)/ 前一时段收盘价。若收益率 > +0.06,发出 +1(做多)信号;若收益率 < -0.06,发出 -1(做空)信号;否则为 0。权重:allocate_fixed_weights_capped(信号,0.20,上限=1.0),因此每个有效持仓获得 20% 的资金;若总敞口超过 100%,则按比例缩减所有权重。信号当日以 14:01 的 MARKET 订单入场(14:00 根 K 线的收盘价为入场价),并在 16:00 时段收盘以市价收盘(MOC)订单退出。没有止损、止盈,也不隔夜持仓。原策略成本为每股 $0.005 佣金及 3 基点滑点;我们使用 USEQ 模型,佣金为零,并对价差和冲击建模。PLATFORM ADAPTATION,如实说明:(1)股票池为我们的 USEQ 股票池和目录中现有的 3 只杠杆/波动率 ETF:TQQQ.USEQ、SQQQ.USEQ 和 UVXY.USEQ。其他杠杆 ETF,例如 SOXL、SPXL 和 TNA,未被收录。(2)时间周期为 1-HOUR,而非 1 分钟。USEQ 1 分钟 K 线始于 2026-08-06,约有 38 个时段;若阈值为 6%,信号将少于 10 个。USEQ 1-HOUR K 线覆盖从 2024-08-14 至今,约 530 个时段。Yahoo 小时 K 线的收盘时间戳为 10:30、11:30、12:30、13:30、14:30、15:30 和 16:00 ET,因此没有 K 线在 14:00 收盘。因此,检查点设为时间戳为 14:30 ET 的 K 线的 CLOSE,比原策略的 14:00 晚 30 分钟;持仓区间为 14:30 至 16:00,而非 14:01 至 16:00。半日交易时段(收盘于 13:00)没有 14:30 K 线,因此不交易;这与原策略一致,因为半日交易时段缺少其 14:00 K 线。(3)前一时段收盘价采用前一时段最后一根 K 线的收盘价(时间戳为 16:00 ET,半日交易时段则为 13:00),等同于原策略的 15:59 根 K 线收盘价。仓位规模:每个有效标的使用当前权益名义金额的 20%,与原策略相同。由于有 3 个标的,总敞口最多为 60%,因此 1.0 上限不会触发,但仍予以实现。允许做多和做空;USEQ 是 Reg-T 保证金账户,按 1.0 倍杠杆运行。请注意,TQQQ 和 SQQQ 互为镜像,因此纳斯达克强势上涨日通常会同时触发两者,一个做多,一个做空。这实质上是在两个标的上押注同一方向,对纳斯达克方向的净敞口约为权益的 40%。原策略也如此处理,因此予以忠实保留。基于我们的 1 小时目录开展的研究前分析(总收益、收盘至收盘、不计成本),阈值为 6%,按信号方向计算从 14:30 到 16:00 的收益率:TQQQ n=45,均值 +0.31%,命中率 64%;SQQQ n=44,均值 +0.41%,命中率 66%;UVXY n=94,均值 +0.98%,命中率 70%。这些数据合计约为 2 年内的 183 个持仓日。在回测运行前,应将这些数字视为未经验证。

忠实移植用户提交的 QuantRocket 策略。默认参数(MIN_PCT_CHANGE = 0.06、固定权重 20%、上限 1.0、当日入场、MOC 退出)均原样保留。仅有一个阈值可调,且范围围绕原始值设置得很窄。USEQ 场所及多空方向填补了代表不足的分桶(USEQ 5.7%、多空 17%),而 3 ETF 在语料中几乎没有历史数据。触发条件是市场观察(盘中 6% 波动),而非日历日期,因此不适用教训 L179。杠杆ETF再平衡时的强制平仓流动,使该策略不同于已失效的加密货币永续合约动量策略系列。仅因 USEQ 1 分钟历史约有 38 个时段,才以 1-HOUR 替代 1 分钟。

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

实现

将 QuantRocket 的 TrendDayStrategy 移植到 TQQQ/SQQQ/UVXY,使用 USEQ 根 1-HOUR K 线。每个 ETF,将 14:30 ET 根 K 线的收盘价与前一时段收盘价比较。上涨超过 6% 则做多,下跌超过 6% 则做空。每个持仓占权益的 20%(若总敞口超过 1.0 则按比例缩减),在 14:30 根 K 线收盘时以市价单入场,并在 16:00 根 K 线收盘时平仓。持仓从不隔夜;没有止损。

迭代 2 未改变规则。沙盒超时来自主机,而非策略:每根 K 线的工作量已是 O(1),仅有标量状态,没有历史缓冲区或补充数据。在沙盒窗口上本地运行迭代-1代码,速度约为 9% CPU,持续超过 10 分钟。其回测子进程卡在目录文件发现中,主机 I/O 压力约为 65%,负载均值约为 87。进行了两项小幅提速:腿索引和 InstrumentId 查找现在只构建一次;ET UTC偏移量按每个UTC日缓存,而不是每根 K 线都重新构建 4 个 datetime。已在 20k 个时段时间戳上将缓存偏移量与 zoneinfo America/New_York 比对,结果为 0 处不匹配。信号、入场和退出逻辑、仓位规模及参数均未改变。迭代 1 的平台适配仍然适用:Yahoo 小时网格上的 14:30 ET 检查点,以及 3-ETF 股票池。如果再次超时,原因是目录发现和主机负载,需要重新运行基础设施,而非修改代码。

验证结果

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

结局总结

如果一种每根 K 线工作量为 O(1) 的策略在沙盒中仍超时,应调查基础设施(目录发现、主机 I/O 压力),而不是在代码没有实质变化时重新提交,因为仅修改代码无法解决主机端原因。

经过 2 次迭代后,项目在验证循环中被放弃。两次第 3 层沙盒冒烟测试都在约 20,000 根 K 线、833 天的 TQQQ.USEQ 1 小时窗口(sandbox_timeout)上触及 300 秒墙钟时间限制。由于开发者判断每根 K 线成本已是 O(1),因此迭代 2 只进行了微优化,并将问题归咎于目录/主机 I/O 负载。

将 QuantRocket 的 TrendDayStrategy 移植到 TQQQ/SQQQ/UVXY,使用 USEQ 根 1 小时 K 线:在 14:30 ET 检查点,如果 ETF 较上一时段收盘上涨超过 6%,则做多;下跌超过 6% 则做空;每个有效腿投入 20% 的权益,并在 16:00 收盘时退出。

由于策略未通过验证,因此没有回测或优化指标。唯一的数字是该假设未经验证的毛收益研究前数据:TQQQ n=45,均值 +0.31%;SQQQ n=44,均值 +0.41%;UVXY n=94,均值 +0.98%。

分析

TrendDayStrategy

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