跳至正文
全部策略

策略

财报跳空延续(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)。故将其标记为潜在而非活跃问题。

分析

晋升被数值门槛阻止 — 在晋升前请先解决: - 未豁免的软下限:无法在程序层面 FDR 中存活(Benjamini-Hochberg q=0.10 在 301 个候选中保留 4 个) ## 知识库的优化建议(来自知识库;需测试,不要假设) 知识库没有 PEAD 相关研究,但其缺口理论、止损模型、风控平价笔记、过拟合笔记以及一份财报事件驱动示例均指向同一方向。增加缺口回补/反向缺口失效退出以及 5 个交易时段的时间止损,按逆波动率配置仓位,并缩减搜索空间。目标是提高每个参数对应的夏普比率,使策略能够在程序层面 FDR 中存活。 1。[退出] 缺口回补/反向缺口失效退出:存储 ref_close = 事件前一时段的收盘价(事件当日的 close_{t-1})。多头:任一持仓时段收盘价 < ref_close 时于收盘退出,表明缺口已完全回补。空头:若收盘价 > ref_close 则退出。同时,当同一标的在 volume_ratio >= 1.5 上出现 NEW 个反向事件(与持仓方向相反、幅度 2.0 sigma 或以上的缺口,即多头遇到向下跳空、空头遇到向上跳空)时,于收盘提前退出。否则保留 hold_days……展开收起

晋升被数值门槛阻止 — 在晋升前请先解决: - 未豁免的软下限:无法在程序层面 FDR 中存活(Benjamini-Hochberg q=0.10 在 301 个候选中保留 4 个) ## 知识库的优化建议(来自知识库;需测试,不要假设) 知识库没有 PEAD 相关研究,但其缺口理论、止损模型、风控平价笔记、过拟合笔记以及一份财报事件驱动示例均指向同一方向。增加缺口回补/反向缺口失效退出以及 5 个交易时段的时间止损,按逆波动率配置仓位,并缩减搜索空间。目标是提高每个参数对应的夏普比率,使策略能够在程序层面 FDR 中存活。 1。[退出] 缺口回补/反向缺口失效退出:存储 ref_close = 事件前一时段的收盘价(事件当日的 close_{t-1})。多头:任一持仓时段收盘价 < ref_close 时于收盘退出,表明缺口已完全回补。空头:若收盘价 > ref_close 则退出。同时,当同一标的在 volume_ratio >= 1.5 上出现 NEW 个反向事件(与持仓方向相反、幅度 2.0 sigma 或以上的缺口,即多头遇到向下跳空、空头遇到向上跳空)时,于收盘提前退出。否则保留 hold_days 退出。所有检查均使用时段收盘价,因此不存在前瞻偏差。— 目前每笔交易无论情况如何均完整持有 23 个交易时段。漂移假说是反应不足下的延续,因此缺口完全回补即对该事件证伪。FMZ 入门书指出『跳空缺口是日后支撑和压力点的参考价位』(缺口价位成为后续支撑/阻力),并将新缺口视为缺口方向加速的起点。止损模型文章将『价格出现向下突破缺口』列为形态止损(形态止损),并恰好如此编码:『K线出现向下跳空缺口,多头止损』(向下跳空 K 线上多头止损,向上跳空 K 线上空头止损)。提前止损失败事件应能在不新增可搜索参数的情况下提升盈亏比 (1.58) 和夏普比率 (0.57)。(来源:发明者量化交易入门--从基础到实战 p.1;止损模型的原理及编写 p.1) 2。[止损] 漂移未能启动时的提前时间止损:在入场后第 5 个交易时段收盘时,若持仓沿缺口方向的收益低于 +0.5 x sigma_entry(入场时锁定的 60 交易日日标准差),则退出。对于典型大盘股约合 +0.8%。通过该检查的仓位则运行至 hold_days 或触发缺口回补退出。— 止损模型文章将时间止损描述为:触发后若预期行情未在近期出现,『若不发生则退出』,并给出横盘止损示例:『买入后5天内上涨幅度未达到5%即进行止损』(买入后 5 日内若涨幅未达 5% 即止损)。文章亦指出应配合最大亏损止损使用,这由缺口回补退出承担。本策略将全部 532 笔交易固定持有固定期限,因此死钱事件会在约 23 个交易时段内占用 1.5x 总规模预算与 10 个仓位。按波动率缩放的 5 日检查可释放容量以承接新事件。单笔平均收益为 1.38%,远高于 0.10% 的往返成本,因此额外退出的成本低廉。(来源:止损模型的原理及编写 p.1) 3。[仓位] 逆波动率仓位配置:将固定名义金额(资金 × 0.075)替换为 notional_i = 资金 × 0.075 x(0.018 / sigma_i),其中 sigma_i 为入场时的 60 个交易日日标准差。将乘数限制在 [0.5, 1.5],使单标的名义金额保持在 3.75% 至 11.25% 之间。保留 1.5x 总规模上限和 10 个仓位。— 标的池混合了 TSLA、NVDA、AMD 和 MU(日 sigma 约 3-4%)等标的,以及 WMT、CSCO 和 JPM(约 1.2-1.5%)等标的。等额名义金额使少数高波动标的占据损益方差的主导。风控平价综述指出,应『按照风险贡献分配资金』而非按资金份额分配,以各资产的历史波动率(标准差)作为主要风险衡量。将每个事件的风险等同化应在收益不变的情况下提升夏普比率,而夏普比率正是阻挡晋升的 deflated-Sharpe/FDR 检验的输入。(来源:风险平价模型及策略精华汇总 - BigQuant量化交易 p.1) 4。[参数] 缩减并固定搜索空间(单一对称阈值、固定持仓期):将 gap_sigma_threshold_long 和 gap_sigma_threshold_short 合并为单一对称的 gap_sigma_threshold,定在 4.0。优化器将空头阈值设在 7.96,触及 8.0 边界,意味着空头腿实际上已被关闭。将 hold_days 固定在 20,而非在 [3, 30] 区间内搜索。这样剩余 0 或 1 个可搜索参数;若必须保留一个,则仅在 [3.0, 5.0] 区间内搜索 gap_sigma_threshold。分别报告多头腿和空头腿的损益,而非分别调优两者。— 阻碍来自程序层面 FDR(Benjamini-Hochberg 在 301 中保留 4)。deflated Sharpe 会被试验次数惩罚,并被精简的参数规格所奖励。过拟合文章警告,输入过多或灵活度过高的模型会记忆噪声,并建议『删除无用特征』。被钉在边界上的空头阈值正是如此:是非对称拟合,而非预注册的 3 sigma 多空规则。BigQuant 财报事件驱动示例(条件选股:基于财报的事件驱动策略)采用单一固定持仓期(持仓周期:30天)。这支持预先承诺 20-30 日区间的持仓期,而非搜索该参数;该文章中的业绩仅作为一项主张对待。(来源:机器学习中的过拟合 - BigQuant量化交易 p.1;条件选股:基于财报的事件驱动策略 - BigQuant量化交易 p.1)

结局总结

多腿日频组合必须将每根 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 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。