策略
财报跳空延续(PEAD 代理),基于 20 只流动性较强的 US 大盘股的多空事件驱动组合(USEQ 1-DAY — 在 >= 3 倍 sigma 的高成交量隔夜跳空 CLOSE 介入,持仓约 15 个交易日以捕捉公告后漂移,3 参数)
结局: 已放弃
UsLargeCapEarningsGapContinuationLS
结局总结
UsLargeCapEarningsGapContinuationLS 在 20 个 US 大盘股上交易财报后漂移,在成交量较大的隔夜跳空约达到 3 倍标准差或更大后,于收盘时入场,并顺着跳空方向持仓。现有优化结果看起来不错:收益 58.65%,夏普比率 1.28,共 148 笔交易,单笔平均收益 4.20%,通过留出集检验(夏普比率 1.52),以及 PBO 0.27。然而,它未能通过项目级 FDR 检验,且几乎所有交易都是多头(133,共 148)。在第 8 次迭代中,代码运行超过 300 秒限制,未能通过第 3 层沙盒回测;该次运行在得到任何分析师或风险裁定之前就被放弃。
假设
一种针对 US 只股票(交易场所 USEQ,1-DAY 根 K 线)的 LONG-SHORT、MULTI-INSTRUMENT、EVENT-DRIVEN 延续策略,捕获财报发布后漂移(PEAD)WITHOUT,无需财报日历:财报发布在价格走势中表现为异常巨大成交量下的异常大幅隔夜缺口。策略在每个日 K 线上扫描固定的 20 只流动性大盘股标的池,标记开盘相对前收盘的缺口超过其近 60 个交易日日波动率约 3x、且成交量 >= 2x 倍均量的标的,沿缺口 DIRECTION 入场 AT THE CLOSE OF THE EVENT DAY(向上跳空做多、向下跳空做空——Reg-T 保证金允许做空腿),并固定持有约 15 个交易时段。其刻意 NOT 在开盘入场(跳空本身不可交易),亦 NOT 反向交易缺口——文献记载的异象是 UNDER 反应,即延续。此举一次性填补三个距目标最远的组合桶:USEQ 占 3074 个实验中的 1.6%,long_short 为 14.8%,多品种为 18.5%;同时也规避了 BINANCE(70.0%,为其 40% 上限的两倍)。该策略明确 NOT 被经验 L99 否决的每日 ETF 风格轮动/跨资产双重动量族系,并 NOT 此前已失败的横截面周反转。
四项库内改进都已加入迭代-7代码:跳空回补和反向跳空退出、按标准差缩放的 5 交易日时间止损、限制在 [0.5, 1.5] 范围内的波动率倒数头寸规模,以及一个对称阈值(hold_days 固定为 20,并保留一个可搜索参数)。FDR 阻碍因素源于夏普比率相对于整个项目的表现过强(保留了 4 个,共 301 个)。任何代码修复都无法消除该问题,增加可搜索参数还会加重去膨胀夏普惩罚。因此交易逻辑保持不变。唯一的改动是改进建议 4 中的报告要求:现在会记录并持久化多头腿和空头腿的盈亏及退出原因计数,从而分别评估两条腿,而不是将其分开调优。FDR 是软性底线,因此是否豁免由分析师决定。如果这一精确规格仍未通过 FDR,我建议结束迭代,不再继续调优。注:由于工具权限检查两次失败,我无法写入 outbox 文件 workspace/outbox/developer/strategy_e0ce2ad3-95ba-4478-a516-a601c8c76554-c10fef5ace.json,因此本条 JSON 回复是唯一输出。另外,任务说明中没有提供 previous_config,因此该配置是根据代码和假设重新构建的:META 为主要标的,其他 19 个标的作为 USEQ 1-DAY bar 上的额外腿,杠杆为 1.0。
verification_loop:sandbox_timeout:验证失败(第 3 层 — 沙箱回测):冒烟测试在约 20000 根 K 线的窗口(2400 个 META.USEQ-1-DAY-LAST-EXTERNAL 日数据)上超出 300 秒的壁钟时间限制。这几乎总是意味着按 K 线的工作量随历史长度线性增长——例如重新扫描完整的资金费率/补充序列,或在每根 K 线的 calculate_signal()/on_bar() 中重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或以时间戳为键缓存查询,使每根 K 线的成本为 O(log n) 而非 O(n)。
实现
事件驱动的多空组合,在 20 个流动性良好的 US 大盘股(USEQ,日线)上交易财报后漂移。每个交易日,它会寻找隔夜跳空至少达到其 60 个交易日每日标准差的 gap_sigma_threshold 倍(默认 4 倍),且平均成交量至少为 2x 的标的。于当日收盘时顺着跳空方向入场。持仓在以下条件最先出现时平仓:跳空完全回补(收盘价回到事件前收盘价另一侧)、出现新的反向跳空且至少达到 2 倍标准差并且成交量至少为 1.5x、若收益低于入场标准差的 0.5x,则在 5 个交易日后触发时间止损,或持有 20 个交易日。头寸规模为 equity x 7.5% x clamp(1.8% / sigma, 0.5, 1.5),最多持有 10 个标的,总敞口上限为 equity 的 1.5x。每次退出时记录多头腿和空头腿的已实现收益及退出原因计数。
验证结果
sandbox_timeout:验证失败(第 3 层 — 沙箱回测):冒烟测试在约 20000 根 K 线的窗口(2400 个 META.USEQ-1-DAY-LAST-EXTERNAL 日数据)上超出 300 秒的壁钟时间限制。这几乎总是意味着按 K 线的工作量随历史长度线性增长——例如重新扫描完整的资金费率/补充序列,或在每根 K 线的 calculate_signal()/on_bar() 中重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或以时间戳为键缓存查询,使每根 K 线的成本为 O(log n) 而非 O(n)。
该假设无需更改代码。如果分析师想界定其影响,可稍微调高 _volume_mult(例如 2.2)后重新运行,并确认交易数量和每笔交易收益保持稳定——该门槛不应处于临界边缘。
成交量门槛的执行时机现实性。事件测试要求 volume_ratio = volume_t / mean(prior 60 volumes) >= 2.0,其中 volume_t 为 FULL 交易日的成交量,且入场指令在同根 bar 上提交,因此以该交易日收盘价成交。这正是假设所预先注册的('在事件日的 CLOSE 介入'),在引擎术语中属于 NOT 提前(bar 以收盘价戳记,gap_z 仅使用该交易日开盘价及严格滞前的 60 个收盘价,且 sigma/avg_vol 在今日的收益率和成交量被追加到双端队列 BEFORE 完成计算,因此 z 分数不存在当前 bar 的信息泄露)。现实性方面的警告是:实盘实施时必须在收盘前几分钟提交市价收盘单(market-on-close order),此时当日成交量约为最终成交量的 95-99%,而非 100%。对于财报日的 2x-平均成交量门槛,这几乎不会改变决策,但少数临近阈值的边际事件在实盘中将有所不同。
在 _entry_sess 中存储交易日 TIMESTAMP 而非索引(self._entry_sess[iid] = self._session_ts[-1],然后像 ts_opened 路径那样对其使用 bisect);或者在截断 _session_ts 时,从每个已存储索引中减去裁剪偏移量。
_sessions_held 回退路径中潜在的索引陈旧问题。self._entry_sess 将 ABSOLUTE 索引存入 self._session_ts,但 calculate_signal 会修剪该列表(当 len > 600 时替换为最后 400 项),使每个索引偏移 201,却未重写 _entry_sess。修剪前存储的索引会使 (n - 1) - start 为负,随后 max(0, ...) 会将持仓计时器重置为零,导致仓位可能被无限期持有。此路径目前不可达:仅在 pos.ts_opened 为 0/缺失,或早于 _session_ts[0] 时才会走该路径;而 NautilusTrader 在回测、模拟和实盘中始终填充 Position.ts_opened,同时 400 个交易时段的保留网格仅为最大 hold_days 的约 26x(共 30)。故将其标记为潜在而非活跃问题。
分析
结局总结
多腿日频组合必须将每根 bar 的计算量保持在 O(log n) 或更优(数组只计算一次,使用 bisect,缓存查找结果),否则无论策略看起来多有优势,验证都会超时。在分别为多头腿和空头腿调优阈值之前,应先检查其悬殊的多空交易数量(133 笔 vs 15 笔)。
经过 8 次迭代后,该运行在验证循环中被放弃。第 3 层沙盒回测超时,在约 20,000 根 bar 的窗口(2,400 天的 META.USEQ 日线 bar)上超出了 300 秒的墙钟时间限制,因此最新版本未进入回测审查、分析或风险审查环节。未记录任何分析师或风险裁决。
在 20 个流动性良好的 US 大盘股(USEQ,日线)上捕捉财报公告后漂移,无需财报日历:寻找标准差约为 3 倍或更大的隔夜跳空,且平均成交量至少为 2x;于当日收盘时顺着跳空方向(做多或做空)入场,并持有固定交易日数。
记录在案的优化报告(2012-05-18 至 2023-12-29)显示,总收益为 58.65%,Sharpe 为 1.28,共 148 笔交易(133 笔多头,15 笔空头),每笔交易平均收益为 4.20%,胜率为 67.6%,最大回撤为 3.35%。滚动样本外 Sharpe 为 1.08,PBO 0.27;留出样本以 Sharpe 1.52、39 笔交易通过,但该策略未通过项目层面的 FDR 检验(p=0.0131;在 q=0.10 时,BH 保留了 4/301 个候选策略)。
回测评审
- 夏普
- 0.57
- 总收益率
- 68.71%
- 最大回撤
- 5.94%
- 总交易数
- 532
- 胜率
- 57.3%
- 盈利因子
- 1.58
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。