我们在 5 分钟盘上找到过一个很漂亮的规律,回测稳定为正,撑了很久。 后来发现它整个是标签造出来的假象——判赢输用的那把尺, 和市场真正结算用的那把,不是同一把。
规律很简单:在 5 分钟盘上按一条规则决定买哪一侧,回测显示有 +2 到 +6 个百分点的超额。 换个口径还在,换个子集还在,分段看也在。
凡是这种「怎么切都在」的发现,都该先怀疑一件事:它是不是根本不在数据里,而在量尺里。
要判断一个 5 分钟盘的赢输,你得知道「这个窗口是涨还是跌」。而这句话里的「涨跌」, 取决于你拿什么价去比:
| 研究用的尺 | 市场结算用的尺 | |
|---|---|---|
| 取价 | 交易所现货的收盘价 | 预言机末 60 秒的时间加权均价 |
| 比什么 | 都和窗口开盘价比 | |
| 大部分时候 | 两者结论一致 | |
| 结果临界时 | 结论会不一样 | |
把全部 5 分钟窗口逐个用两把尺各判一遍,结果是:2,051 个窗口里有 207 个判断不一致, 无条件错标率 10.1%。
这 207 个不是随机散落的,它们集中在同一族窗口上——开盘价和收盘价贴得极近、 最后一分钟随便动一下就能改写结果的那种。我们叫它刀刃窗。
看到 10% 这个数,大多数人的第一反应是:噪声而已,会互相抵消。
不会。这是全文最要紧的一句。
误差要能抵消,前提是它和你的选择规则无关。而这里的问题恰恰是:两者高度相关。
那条选边规则挑出来的窗口,并不是在全体窗口里均匀分布的 —— 它们高度集中在同一族窗口上:开盘价与收盘价贴得极近、 最后一分钟随便动一下就能改写结果的那一族。
而那一族,正好就是刀刃窗,也正好就是两把尺最容易分歧的地方。 这不是巧合,但具体为什么会重合,属于策略内部的事,这里不展开 —— 要讲的道理不需要它。
① 选择规则挑出的窗口高度集中在刀刃窗 → ② 刀刃窗正是两把尺最容易分歧的地方 → ③ 而在这一族窗口里,分歧不是正负各半的,它系统性地偏向同一边 → ④ 于是这条规则系统性地站在被错标偏袒的那一边。
误差被自己的选择规则整流了。本来正负各半的噪声,被筛成了单向的偏差, 最后凝结成一个看起来稳定、其实不存在的 +2~6pp。
把 207 个错标窗口按方向拆开:125 个偏向我们、82 个偏向反面, 净偏 43 个窗口。
43 ÷ 2,051 = 2.1% 的窗口被系统性地判反了。而一个窗口判反, 在盈亏上就是 ±100 个百分点的差别(赢变输或输变赢)。两者相乘:
2.1% × 100pp ≈ 2.1pp 的虚高
而回测里观察到的超额正是 +2~6pp。下限严丝合缝对上了—— 这个「发现」的大小,恰好等于量尺偏差的大小。到这一步基本可以定案了。
换句话说:分歧率高不高不是重点,分歧带不带方向才是。 10% 的对称分歧无害,2% 的定向分歧就足以造出一个假发现。
两把尺打架,靠争论没用,得找第三方裁判。链上的结算结果就是那个裁判—— 它是真金白银赔付的依据,不由任何一方解释。
我们把有分歧的窗口逐一拿到链上核对结算真相(读合约的赔付结果), 结果是 207 : 0:链上全部站在市场口径这一边,没有一个例外。 同日对其余周期做同颗粒度审计时,另一组 31 个争议窗的链上核对同样是 31 : 0。
到这一步结论就无可回避了:研究用的那把尺是错的, 当初那一整族「发现」,是标签假象。
量尺出问题,第一件要做的事不是修,是先划定污染范围—— 同一把错尺还量过什么?我们把其余周期按同样颗粒度重审了一遍:
| 周期 | 两尺分歧 | 是否带方向 | 结论 |
|---|---|---|---|
| 5 分钟 | 10.1% 207/2051 |
125 : 82 带方向 | 发现作废 |
| 15 分钟 | 3.1% | 60 : 63 对称 | 无恙 |
| 1 小时 | 0% 0/1010 | — | 无恙 |
| 4 小时 | 0.4% 1/250 | 单例 | 无恙 |
周期越短,末 60 秒在整个窗口里占的比重越大(5 分钟盘里占 20%,4 小时盘里只占 0.4%), 所以 5 分钟盘首当其冲。
15 分钟盘虽然也有 3.1% 的错标,但方向是 60 : 63—— 几乎完全对称,甚至略微偏向不利的一边。没有被选择规则整流,所以不构成偏差。 这一栏才是判断「有没有被污染」的依据,而不是错标率那一栏。
这张表就是「污染范围」的答案:只死了一个,其余不用重做。 如果不做这一步,要么盲目地把所有结论都推翻(浪费),要么假设别的没事(危险)。
发现量尺坏掉之后,很自然的冲动是「换个角度再试试」。这条我们写成了硬规矩:
错的是量尺——先修尺,再用对的尺,重审所有被错尺判过的线。
为什么不能跳过重审?因为错尺不只可能造出假发现,也可能掩盖真发现。 分歧带方向的时候,被压下去的那一侧同样是被系统性歪曲的。不重审,你不知道自己丢了什么。
修尺的做法是把市场结算真相本身落库:单开一张结算标签表, 从公开接口逐窗取回真实结算结果,另开采集任务持续更新,并把历史窗口全部回填。 从此判赢输一律以这张表为准,原来那把尺降级成伴读口径—— 两个口径并排跑,每次都报差值,差值一变大就会自己冒出来。
用修好的尺,把原来的策略重新训练、重新回放。判据先写死在文件头,不看数据。
回放跑了四个格子:两种标签(旧的 / 修好的)× 两组配置, 这样既能看新标签下的结果,也能看同一套特征在两把尺下的差别。
结果:四格全负(−1.06 / −1.44 / −1.60 / …,z 值全部不显著)。
也就是说,这条线本来就是死的——错尺没有把一条活线害死,它只是把一条死线装扮成了活的。 判死的结论没变,但现在它站在正确的地基上了。
要是修完尺之后策略变正了,那意味着我们之前差点因为一个坏标签 错过一条真的线。要是修完还是正的、但幅度变了,那意味着我们之前 按错误的幅度在定仓位。
三种可能里,只有「本来就是死的」这一种是无害的。而在修尺之前, 你根本不知道自己抽到的是哪一种——这就是为什么修尺不能拖。
一、先问一句:判赢输的那个数,是不是市场结算真正用的那个数。 不是「差不多的数」,是同一个数。差不多在刀刃窗上就是不一样。
二、双口径并行,逐次报差。不要只留一个口径。两个并排跑、每次输出差值, 量尺漂移会自己浮出来,不用等到某天回头查。
三、检查你的选择规则和量尺误差相不相关。这是最容易漏的一步,也是本文的核心: 把你策略选中的窗口单独拎出来,看两个口径在这批窗口上的分歧率, 是不是显著高于全样本。高很多,就说明误差正在被整流。
四、看分歧的方向,不要只看分歧的比例。 对称的分歧是噪声,定向的分歧是偏差。前者可以忍,后者会直接变成假 alpha。
回测赢了,先别高兴。先确认赢的是策略,不是尺子。 尤其当你的选择规则,恰好会挑中两把尺最容易吵架的那批样本时—— 那不是发现,那是把自己的测量误差重新包装了一遍。