策略
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 策略。默认参数(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 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。