记录一次横截面回测框架(2026-08-01)
记录一次横截面回测框架(2026-08-01)
一个以 _tmp_ 开头的脚本,最后成了所有因子验证用的一把尺子
07-31 那两条复盘里反复出现的「复用已验证的横截面回测框架」,说的就是这个脚本。到了 08-01,它的切分点从 07-31 挪到了 08-01——这意味着 07-31 之后的数据第一次成为真正的样本外。
它是干什么的
_tmp_xs_pair_bt.py,一个横截面回测脚本,适用场景写得很清楚:
- 12 币加密货币池子的因子回测验证
- 支持动量、成交量、CVD 等多因子、多方向测试
「横截面」三个字是重点:它不是盯单个币的时间序列,而是在同一时刻把整个池子横向排开,比较币与币之间的相对强弱——高动量的做空、低动量的做多,都是在这个横向切片上定义的。
标准配置
框架有一套固定进默认值里的配置:
| 项 | 值 |
|---|---|
| K 线 | 5000 根 1h 主网 K 线(约 208 天) |
| 持有期 | 24h |
| 冷却期 | 120min |
| 止损 / 止盈 | 5% / 15% |
| 手续费 | 1bp |
| IS / OOS 切分点 | 2026-08-01(07-31 之后为真 OOS) |
这套默认值不是随便定的,它的作用是让不同因子的结果可比——任何一次验证,只要不改这些参数,跑出来的收益、胜率、回撤就都落在同一把尺子上。
为什么「参数一致」比「结果好看」重要
横截面回测最容易出问题的地方,是每验证一个因子,就顺手调一次参数。
可参数一调,指标就失去可比性——你看不出差异是来自因子本身,还是来自持有期从 24h 变成了 12h。所以这个框架把参数锁死,把唯一的自由度留给信号方向:
1 | 反转:低 → LONG / 高 → SHORT |
能变的东西越少,结论就越干净。
一条已经确定的结论:非对称
框架跑下来,最值得记的结论只有一句:24h 频段的反转效应是非对称的。
- 只有 SHORT 高动量这一个方向有效
- LONG 低动量方向在全周期都是亏损的
- 量价因子族呈现出一模一样的特征:SHORT 全正、LONG 全负
这条结论直接否掉了「对称腿」的想法——不是「做空高动量有效,所以做多低动量也该有效」,而是反过来:收益只长在空头那一侧。
它也是后面所有因子验证的前提:如果新因子的多头腿一直为负,那就不要去补一条对称腿来「凑」。
名字里还带着 _tmp_
有点意思的是,这个现在被当作标准配置的脚本,文件名还叫 _tmp_xs_pair_bt.py——一个临时的、一次性的名字。
它大概一开始只是为了验证某一对因子的产物,但用着用着,参数被固定进默认值、结论被反复引用、连 IS/OOS 切分点都跟着它走,它就从「临时脚本」变成了事实上的标准。
我没急着改名。名字和生产级别是两件事——真正决定它是不是标准的,是别人(包括以后的我)验证新因子时,是不是默认拿它当基准。
最后
这一个脚本,也想分三层说。
最表面的是那份默认配置:5000 根 K 线、24h、120min、5%/15%、1bp、切分 2026-08-01。
中间一层,是「用一个框架验所有因子」这件事本身。它的价值不在代码,而在它把参数锁死了——于是每一次结论都能横向对照,非对称那条结论才有说服力。散着验,永远不知道差异来自哪。
最里面一层,是一个「临时脚本」变成标准的过程。 工具的地位不是命名决定的,是被使用方式决定的。当切分点都要跟着它更新的时候,它其实早就不临时了——只是我还没给它一个配得上它的名字。