跳至正文
全部策略

策略

在 SPY + QQQ 上的月初季节性多头叠加(USEQ,日线,仅在 [-1,+3] 月末窗口内且高于其 200 日趋势时持有各 ETF,其余时间平仓于 T-Bill,零佣金,3 参数)

结局: 已放弃

TurnOfMonthSeasonalOverlaySpyQqqUseq

结局总结

该策略忠实实现了一个有充分文献记录的日历异常——仅在月界附近持有 SPY 和 QQQ,且仅在它们高于自身长期趋势时持有——其回测在 33 年数据上看起来足够稳健(PF 1.43,60% 胜率,每笔交易优势高于 USEQ 费用下限),因此分析师批准其进入优化阶段。优化阶段暴露了问题:0.87 的样本内夏普比率在样本外降至 0.019,PBO 达到 0.77,而 0.020 的去膨胀夏普比率显示,该结果在 225 次试验中与噪声在统计上无法区分。三项不可豁免的硬性门槛同时未通过,因此分析师在一次迭代后放弃了该策略。它加入了持续存在的月初月末策略变体弃用系列,证实该效应太弱,无法推广为实盘叠加策略。

假设

严格按假设实现:在日线 USEQ 柱上交易 SPY.USEQ + QQQ.USEQ,仅在 [-1,+3] 月末窗口内持有,且仅当每个 ETF 高于其自身 200 日趋势时持有;其他时间保持平仓状态(现金/国库券),恰有三个自由参数(trend_sma_days、entry_days_before_end、exit_trading_day),另加一个结构性名义敞口上限。窗口根据由 bar.ts_event 推导的 CALENDAR TIME 锚定(民用日期算术 + 统计当前日历月中已观测的交易日),绝不依赖柱计数器,因此重启、回测和模拟盘重放时的时间安排完全一致;由于收盘时提交的市价单会在下一交易日开盘成交,因此在窗口开启前一个交易日提交入场单,使实际持有期恰为第 -1 天开盘至第 +4 天开盘。根据假设,交易场所为 USEQ(股票,免佣金);组合仅做多且不加杠杆,因此杠杆维持在 1.0,仓位规模计算中也不含杠杆项。趋势历史为 200 个交易日(min_bars_required=202,位于 500 柱缓冲区内);入场门槛是单一季节性条件(不是罕见的条件组合),因此每个标的每年触发约 12 次——在约 2400 日的沙盒窗口中约有 68 个窗口 / 130+ 次往返交易——预期每个窗口的指数波动(约 0.3-0.5%)足以覆盖 USEQ 的价差+冲击成本(往返交易约 0.02-0.05%),且仍有充足余量。记录并按要求实现的一项注意事项:沙盒中未对 US 市场假期建模(无法导入交易所日历),因此唯一的失效模式是阵亡将士纪念日落在某个月的最后一个工作日,导致该次入场每十年左右有几次延后一交易日。

过拟合且没有样本外优势:滚动前推 OOS 夏普比率 0.019(低于 0.5 有效性下限),而 IS 为 0.87;每个窗口 OOS 0.235/-0.017/-0.162,PBO 0.77(高于 0.5),且经失败的去膨胀夏普检验:DSR=0.020,在 225 次试验中预期最大值=0.47(有效试验数 43)——所选夏普比率与 N 次试验中的最佳噪声无法区分,未能通过项目级 FDR(272 项中保留 4 项),is_significant=false。三项 HARD 门槛未通过(OOS<0.5,is_overfitted,PBO>0.5),因此不可能晋级。每笔交易的优势超过 USEQ 费用下限,且留出样本的夏普比率名义上为正(0.36),但月初月末效应太微弱,无法推广为可交易的叠加策略——该策略拟合了样本内噪声。这与持续存在的策略族失败相符(月初月末季节性策略在 QQQ、BTC、BNB 以及相邻的 USEQ 趋势变体上均已放弃);将同一机制重新套用到另一个目标上,一再导致重新过拟合,因此没有可挽救的改写方案。

实现

在 SPY + QQQ 上的月初季节性多头叠加(USEQ,1-DAY 会话K线,仅做多,无杠杆,零佣金)。在每个会话收盘时,策略从其自身时间戳推导K线的公历日期(纯整数公历日期运算,无进程相对计数器),并计算 (a) 今天之后该月还剩多少个工作日,以及 (b) 今天是该月的第几个会话。策略在距离该月最后一个工作日前 `entry_days_before_end`(默认 1)个工作日的会话收盘时建仓 —— 因此次日开盘成交持有交易日 -1,持仓跨过转折点,并在新月第 `exit_trading_day`(默认 3)个会话收盘时平仓,捕获 [-1,+3] 开盘至开盘的区块。大约 80% 的日历时间保持现金空仓(「T-bill」腿不进行交易)。每个 ETF 是由其 OWN 长期趋势门控的独立等权重半仓位组合:仅当收盘价高于其自身 `trend_sma_days`(默认 200)SMA 时才买入该腿,否则该半仓保持现金,因此熊市月末(2008、2022)完全不会买入。仓位规模为整股(USEQ 规模精度 0),每腿占账户权益的 95%/2,于每次入场时根据 get_account_equity() 计算;两腿通过 _submit_entry_instrument/_submit_exit_position 手动管理,并设有「任何位置均无挂单」门控,基础钩子(should_enter/should_exit)保持惰性,因此基础模块永远不会提交竞争的 SPY 订单。

验证结果

可以选择依据观察到的交易时段 K 线(如 _session_index 已采用的方式)推导最后一个工作日锚点,而不是单纯按工作日计数,这样入场时点就像出场时点一样会考虑节假日。非必需。

入场时点以日历工作日算术(_weekdays_left)为锚点,NOT 对市场 US 假日建模;而出场时点以实际交易时段 K 线计数(_session_index)为锚点,因此能稳健处理假日。若月末假日落在最后两个工作日之一(例如阵亡将士纪念日),该次入场会延后一交易时段。开发者对此作了明确说明,且这不会改变交易方向;src/data/market_calendar.py(XNYS)确实存在,可以提高入场时点精度,但当前近似方法可以接受,不影响可测量性。

如果基类模板会调用子类覆盖方法来控制预热阶段(确实如此),则无需更改。仅供参考。

min_bars_required(self) 覆盖了一个框架方法(静态分析 base_shadow 警告)。这里这是有意为之——它返回 trend_sma_days + 2 来控制预热阶段——且行为正确,但请确认基类遵循此覆盖,而不是使用自身实现。

沙盒冒烟测试结果勉强:Sharpe 0.107(CI [-0.68, 0.94] 跨越零),avg_trade_return_pct 0.1535%(仅略高于约 0.02-0.05% USEQ 的点差/冲击下限),PF 1.15,win_rate 0.60。区间划分表现不佳 —— 利润集中在「正常」波动率三分位(+10.44%),而「平静」(-0.57%)和「压力」(-4.35%)均亏损,impact_cost_pct 为毛利的 16.4%,名义承载能力约 $3.7M。这是一项真实且文献充分记载的日历异常,且实现忠实,因此值得进行完整回测 —— 但分析师在优化前应确认逐窗口边缘在全历史点差+冲击下仍然存在,且未局限于单一波动率区间。

回测评审

夏普
0.19
总收益率
104.42%
最大回撤
12.25%
总交易数
500
胜率
60.2%
盈利因子
1.43

在 33 年完整历史样本(1993-2026)上,对有充分文献记录的日历异象(月末效应)进行忠实实现:500 笔做多交易 / 0 笔做空交易 / 约 28.5% 的敞口——交易完全符合假设(纯做多季节性叠加策略,其余时间持有现金)。

优势足以轻松覆盖 USEQ 成本:avg_trade_return_pct 0.338%(远高于 0.05% 放弃底线且高于 0.10% 偏好;通过 L75),profit_factor 1.43,win_rate 0.60,冲击成本仅占毛收益的 7.9%,容量约为 $15.9M。

QA 的关键疑虑是 NOT,完整历史数据证实了这一点:regime_performance 在三个波动率三分位组中有 ALL 为正(平静 +5.1%、正常 +37.3%、承压 +35.4%,only_one_regime=false)——平静/承压时期的亏损是截断沙盒造成的假象。

较低的 max_drawdown 12.2%,充足交易次数用于参数拟合。

主要夏普比率较低(0.194,CI [-0.12, 0.53] 跨越零值)——但这是一个大部分时间持有现金的叠加策略(市场参与时间为 28%),按完整市值计价权益曲线衡量,因此闲置现金会稀释夏普比率;晋级阶段应结合敞口评估风险调整后质量,而不是在此处评估。

CAGR 仅 2.64%——按设计属于叠加策略;资金约有 72% 的时间闲置,因此有空间进行组合或扩大规模,这并非缺陷。

部分年份亏损(2008 -6.7%,2022 -8.3%,2016 -4.1%),但该异常在大多数日历年份中为正。

分析

在 33 年完整历史样本上,对有充分文献记录的日历异象(月末效应)进行忠实、低换手率的实现;交易符合假设(500 做多 / 0 做空,约 28% 的敞口,在季节性窗口内且高于自身 200d 趋势时入场)。

每笔交易的优势超过 USEQ 费用下限(已优化 avg_trade_return_pct 0.21%,下限 0.05%);没有敏感性断崖;回撤较低(6.1%);样本外夏普比率技术上为正(0.36)。

在 trend_sma_days 和 exit_trading_day 范围内,敏感性曲面平坦且平滑——没有脆弱参数。

滚动前推结果明确显示过拟合:IS 夏普比率 0.87,对比 OOS 0.019;逐窗口 OOS 为 0.235 / -0.017 / -0.162——该优势无法在样本外保持。

PBO 0.77(>0.5)——参数选择很可能存在过拟合。

去膨胀夏普比率 0.020 且 PSR/is_significant=false;未能通过项目级 FDR(在 272 项中保留 4 项;候选 p=0.98)。优化后的夏普比率与 225 次试验(有效试验数 43)中的最佳噪声无法区分。

OOS 的 Sharpe 0.019 远低于 0.5 有效性下限 —— 三项 HARD,不可豁免的失败。

预先登记的预测在关键指标上未达预期:OOS 夏普比率为 0.019,而声明值为 0.9;PF 为 1.39,而预期为 1.5;avg_trade_return 为 0.21%,而预期为 0.30%。

策略族先验强烈偏负:月初月末季节性策略在相邻目标上被多次放弃(QQQ TOM fee_edge、BTC TOM fee_edge、BNB TOM 其他、QQQ 波动率管理趋势过拟合)。该异常在历史上确实存在,但过于微弱,无法在可交易的叠加策略中通过成本/去膨胀检验。

对 272 个项目候选使用 Benjamini-Hochberg 方法,设 q=0.10,保留 4。未能通过此检验的候选,即使单项统计结果看起来很好,也无法与项目自身噪声区分。

结局总结

月末异象在历史上确实存在,但力度太弱,无法在计入成本和多重检验去膨胀后,作为可交易叠加策略通过检验;把同一季节性改换到另一个目标上(继 QQQ、BTC、BNB 失败之后)仍一再导致过拟合,而非产生可泛化的优势。

分析师在优化后放弃了该策略:三项 HARD 有效性门槛未通过(OOS 夏普比率 0.019 < 0.5 下限,is_overfitted 为 true,PBO 0.77 > 0.5);去膨胀夏普比率与 225 次试验中的最佳噪声无法区分;且未能通过项目级 FDR,因此不可能晋级。

仅在月末 [-1,+3] 窗口内、且各自的 ETF 高于自身约 200 日趋势时,持有 SPY 和 QQQ(USEQ,日线)的纯做多月末季节性叠加策略;其余时间持有现金。

在完整的 1993-2026 样本中,该策略进行了 500 笔做多交易,胜率为 0.60,盈利因子为 1.43,单笔平均收益为 0.34%(优化后 0.21%),CAGR 2.64%,最大回撤为 12.2%;但主要夏普比率仅为 0.194(CI 跨越零值)。优化结果揭示了决定性的过拟合:滚动前推 IS 夏普比率 0.87,对比 OOS 0.019(逐窗口 0.235/-0.017/-0.162),PBO 0.77,且去膨胀夏普比率为 0.020。

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