跳转至

信号有没有用?14 个标的、7450 个事件的对照实验

仓位层实测把单标的结论押上四层考场,留下了一句看起来最稳的话:"跑赢持有"只有 9~13/18,但"回撤优于持有"有 14~18/18——于是"择时的第一价值是压回撤"成了整套系统的存在理由。这句话有个没被追问的前提:回撤更浅,凭什么算信号的功劳?空仓本来就没有回撤。这篇用三个实验回答它,答案不客气:回撤压缩是真的,功劳属于"在场时间少"这个机械事实,不属于信号。 单标的结论被证明不可移植之后,轮到跨标的结论接受同一把尺子。

代码在 example/2026/10/21-1,新增三个文件:scan.py(截面扫描与 breadth 回算)、event.py(pooled 事件研究)、perm.py(随机对照)。全部离线跑已有 CSV,种子固定。

考场:一个池子,两条铁律

项 内容
标的池 14 个权益(8 只 ETF + 6 只个股)+ 2 个基准指数,universe.json 配置
区间 2020-11-17 ~ 2026-10-20,1435 个有效交易日
事件 7450 个(金叉 / 死叉 / 双确认翻转),覆盖 1427 个交易日
信号 MA5x10、MA5x20、MA10x20、MACD、双确认(MA5x20 且 MACD)

两条铁律贯穿三个实验:

  1. 无未来函数:T 日收盘判定,T+1 日开盘成交——与三部曲同口径
  2. 去均值 + 按日期聚类:事件收益先减掉同期池内等权收益(剔除"这段时间市场在涨"),显著性按日期聚类计算——同一天的多个事件先平均成 1 个观测,消除截面相关(Petersen 2009 的简化版)

第二条是本系列之前的盲区。不做去均值,你量到的不是信号,是贝塔。

实验一:把时机打乱,回撤还浅吗

方法:圆形移位(circular shift)。把信号序列整体循环移位 k 天——在场天数、在场比例、持仓区间的长度与分布完全不变,只破坏信号与市场事件的时序对齐。这是最严格的对照:它控制住了"离场多少"这个混淆因素,只问"离场的时机对不对"。

对照公平性有硬指标:14 个标的的在场比例与随机序列的最大偏差 4.41e-04(≈0)。每个标的 500 次移位,判定用 p_dd = P(随机回撤 >= 真实回撤)——p 小才是信号的功劳。

策略 随机中位 p 值
最大回撤 -43.7% -40.7% p_dd = 0.448
总收益 +12.3% +0.7% p_ret = 0.462
买入持有 +8.7% / -55.5% — —

随机挑时机离场,回撤比信号还浅 3 个百分点。 14 个标的里回撤显著优于随机的只有 2/14,收益显著优于随机的 1/14。

改判:回撤优势的归因

"-43.7% vs 持有 -55.5%"是事实,但置换检验把功劳拿走了——对照组的在场比例一模一样,回撤却更浅。结论从"信号能识别风险"改判为"少在场就能压回撤"。前者值一套系统,后者值一句"降低仓位"。

更有意思的是那 2 个显著的标的:黄金 ETF(p_dd = 0.020)和 562500(p_dd = 0.028)。562500 正是三部曲选冠军的那只——样本内挑出来的标的恰好是全场最显著的两个之一,这是选择偏差的教科书案例:显著性检验没毛病,毛病在于样本是被结论挑剩下的。

反面同样清楚:华贸物流 p_dd = 0.920、华锦股份 0.928、悦心健康 0.766——这三个标的的信号离场时机系统性地差于随机。

实验二:单组 t 值是假象,差值才是判据

7450 个事件、四个持有期(5/10/20/60 日),先看原始收益口径的单组检验:

信号 类型 60 日收益 60 日胜率 t60
MACD golden +2.22% 51.6% 3.14
MA10x20 golden +2.05% 48.8% 2.72
MACD death +2.27% 47.5% 2.68
MA5x20 death +1.43% 48.0% 2.62

看起来很美——直到你注意到金叉和死叉的 t 值同时显著为正。金叉之后涨、死叉之后也涨,这只能说明一件事:这六年样本在涨。单组检验衡量的不是信号,是市场。

真正衡量"信号有没有区分度"的是两组之差(看多信号 − 看空信号,按日期聚类 Welch t):

信号 diff5 diff10 diff20 diff60
MA5x10 +0.06% (0.22) -0.14% (-0.34) +0.02% (0.04) -0.47% (-0.52)
MA5x20 -0.39% (-1.19) -0.66% (-1.43) -0.28% (-0.43) -0.20% (-0.18)
MA10x20 -0.03% (-0.08) -0.29% (-0.59) +0.24% (0.34) +1.31% (1.09)
MACD +0.01% (0.05) +0.22% (0.49) +0.55% (0.86) +0.63% (0.56)
双确认 +0.05% (0.18) +0.18% (0.38) +0.47% (0.71) +0.39% (0.36)

全部 |t| < 1.5,连"粗略显著"的边都没摸到,而且快信号(MA5x10 / MA5x20)的方向是负的——金叉还不如死叉。超额收益口径(已减池内等权)更弱,最大 |t| = 1.29。

regime 分层之后同样没有稳定模式:

  • 趋势↓ 组:MACD 死叉后 5 日胜率 71.8%(t60 = 1.94)——方向反了,杀跌之后是超跌反弹
  • 震荡组:双确认翻空后 t20 = 2.14——同样反向,减仓之后继续涨
  • 趋势↑ 组:双确认翻多后 t60 = -3.00——追涨之后是回吐

方法论:先问对照,再问显著

单组 t 值高不说明任何事,除非你先证明"另一组不是也高"。这个坑在事件研究里极其常见:本样本所有 ret60 都为正,t 值自然好看。差值检验 + 截面去均值是两道必做的工序,缺一道就会把贝塔当成 alpha。

实验三:breadth 是同步指标,不是领先指标

第三个实验不看信号,看市场宽度:breadth_dual = 池内双确认多头占比。直觉上它是领先指标——多数标的转多,行情是不是要来了?

与基准 20 日收益的相关(breadth 领先 k 个交易日):

领先 k 上证指数 中证500
0(同期) 0.545 0.533
5 0.575 0.548
10 0.487 0.445
20(干净预测检验) -0.023 -0.045

前三个相关系数看着不错,但窗口重叠——breadth 的 20 日窗口与收益的 20 日窗口高度重合,相关是被构造出来的。只有 k = 20 是干净的预测检验(用今天的 breadth 预测未来 20 日):-0.023 ≈ 0。

breadth 的正确用法

它是同步温度计,不是领先指标。当前 breadth_dual = 7.1% @ 2026-10-20,正好落在历史 10% 分位(均值 38.9%,历史最低 0%)——它告诉你"现在市场极弱",不告诉你"下个月会怎样"。用它做择时的入场许可,等于用一个同步指标假装预测。

改判之后:系统还值不值得用

三个实验把结论推到了一个不太舒服的位置,但结论本身要说清楚:

原结论 改判后
信号能压回撤 少在场就能压回撤(随机离场更浅,p_dd 0.448)
信号有选股/择时能力 差值检验全部
breadth 领先市场 同步指标,k=20 相关 ≈ 0

没有翻盘的活口有两个,都没验:

  1. 三档仓位管理——唯一可能的 edge 来源。移动止损的收益可能来自路径依赖,与"信号挑时机"是完全不同的机制。难点:三档的在场比例随价格路径变化,无法构造等 exposure 的随机对照,对照不再严格,需要如实报告差异。
  2. 静态降仓位基准——如果信号唯一的作用是压暴露,那么 38% 固定仓位是更便宜的替代品:无交易成本、无 2~8pp 费率损耗。粗略估算其回撤约 -21%~-25%,优于信号策略的 -43.7%。这是决定这套系统值不值得用的关键比较,本次未做。

第二点是真正的判据:信号策略要成立,得先赢过"什么都不做、只把仓位降下来"。

注意事项

  • ⚠️ 适用范围严格限定:A 股、日线、均线/MACD 交叉类信号、2020-2026、14 个标的。不适用于趋势跟踪文献里的跨市场时间序列动量(如 AQR 1880-2016 的证据)——频率与资产类别都不同
  • ⚠️ 未做多重检验校正:p 值未校正,Bonferroni 阈值应为 0.05/14 = 0.0036;也未做 Deflated Sharpe / White's Reality Check。校正只会让结论更负面
  • ⚠️ 零费率:三档系列换手是裸信号的 1.3~2.4 倍,按单边 0.1% 计 5 年多损 2~8pp——静态降仓位基准比起来更省
  • ⚠️ 幸存者偏差:随机样本取自当前上市清单,窗口内退市标的缺席;新浪 ETF 行情不复权,债券类分红被低估
  • ⚠️ 窗口口径:置换检验跑各标的的全历史 CSV(长度不一),与仓位层实测横截面的统一五年窗口(2021-10 ~ 2026-10)不完全一致——562500 的持有收益在两种窗口下分别是 -8.7% 与 -16.3%。横截面对比同口径,跨篇对比需注意
  • ⚠️ 数据陈旧:各标的 CSV 末行日期不一致(10-20 / 10-21 / 10-22),日常使用前需先跑 fetch_data.py 对齐,否则 breadth 末端失真
  • ✅ 对照的公平性有硬指标:在场比例偏差 4.41e-04;向量化回测与原引擎对账差异 1.11e-16

复现三条命令:

.venv/bin/python perm.py --perm 500          # 随机对照实验
.venv/bin/python event.py --metric both --group regime   # 事件研究 + 差值检验
.venv/bin/python scan.py --history           # breadth / flow / 离散度 回算

小结

一句话概括:回撤压缩是真的,功劳不属于信号——属于"在场时间少"这个机械事实;7450 个信号的差值检验给不出任何区分度证据。

改判之后仍然能照着做的部分(三档阶梯、冷却协议、网格准入),连同这条边界一起整理进了《复合交易系统操作手册》。

这个系列一路走来,每一层的结论都在被下一层收窄:单标的数字被横截面收窄成"路径运气",横截面的回撤优势现在被对照实验收窄成"暴露效应"。但收窄不等于白干——证伪的精度在提高:从"不知道对不对",到"知道它在单标的上对",再到"知道它对的原因是离场而不是预测"。

下一步只有一个问题值得先回答:信号策略能不能赢过静态降仓位。赢不了,整套系统的存在理由就该从"择时"改成"仓位"。


最后更新:2026-10-24

评论