15、基差回归模型的时间窗口选择:滚动窗口、递归窗口、自适应窗口
做基差回归模型,说白了就是在跟时间赛跑。
你想想看,基差这东西,它不是一成不变的。市场结构在变,参与者结构在变,连交易所的规则都在变。你用一套固定的参数去拟合所有时期的数据,那结果肯定不靠谱。
我个人习惯,每次搭建基差回归模型时,第一个要纠结的问题就是:时间窗口到底选多长?
太长了吧,模型反应迟钝。太短了吧,又容易过拟合。嗯,这里面的门道,我今天跟你好好聊聊。
15.1 为什么时间窗口这么重要?
基差回归模型的核心,是捕捉基差与某些因子之间的稳定关系。但问题是,这种关系本身就在漂移。
举个例子。我记得2020年那会儿,疫情刚爆发,很多品种的基差结构一夜之间就变了。如果你还用过去三年的数据去训练模型,那模型根本反应不过来。反过来,如果你只用最近一周的数据,那模型又会被短期噪音带偏。
所以,时间窗口的选择,本质上是在稳定性和敏感性之间找平衡。
核心矛盾:
- 窗口太长 → 模型滞后,跟不上市场变化
- 窗口太短 → 模型抖动,容易被噪音欺骗
15.2 三种主流窗口方案
我这些年做下来,常用的就三种:滚动窗口、递归窗口、自适应窗口。各有各的脾气。
15.2.1 滚动窗口(Rolling Window)
这是最直观的做法。固定一个窗口长度,比如60个交易日,然后每天往前滑一格。
说白了,就是「只认最近N天的数据,更早的统统不要」。
# 滚动窗口示例(伪代码)
window_size = 60
for today in range(window_size, len(data)):
train_data = data[today - window_size : today]
model.fit(train_data)
prediction = model.predict(data[today])
我在项目中遇到过一个问题:滚动窗口对市场突变特别敏感。有一次做螺纹钢的基差回归,窗口设了30天,结果遇到一次政策调控,模型直接崩了。后来我改成90天,虽然反应慢了点,但至少稳住了。
我的经验:
滚动窗口适合波动率相对稳定的品种。如果你做的是股指期货,窗口可以设短一点(20-40天)。如果是商品期货,尤其是受季节性影响大的品种,窗口建议拉长到60-90天。
15.2.2 递归窗口(Recursive Window)
递归窗口的思路正好相反——数据只增不减。
从第一天开始,每来一天新数据,就把它加进去。窗口越来越大,模型见过的数据越来越多。
# 递归窗口示例(伪代码)
for today in range(1, len(data)):
train_data = data[0 : today]
model.fit(train_data)
prediction = model.predict(data[today])
这种做法的好处是,模型越往后越稳定。但坏处也很明显——早期的「坏数据」会一直跟着你。
我曾经在豆粕的基差模型上用过递归窗口。刚开始效果不错,但后来发现,2018年贸易战期间的那些极端数据,一直在拖累模型的预测能力。说白了,递归窗口对历史数据没有「遗忘机制」。
注意:
递归窗口适合结构性变化较少的市场。如果你做的品种经历过重大规则变更(比如交割标准调整),千万别用递归窗口。那些旧数据会变成毒药。
15.2.3 自适应窗口(Adaptive Window)
这个就有点意思了。窗口长度不是固定的,而是根据市场状态自动调整。
市场平稳时,窗口拉长,让模型更稳定。市场剧烈波动时,窗口缩短,让模型快速适应。
# 自适应窗口示例(伪代码)
base_window = 60
volatility = calculate_volatility(recent_data)
if volatility > threshold_high:
window = base_window // 2 # 波动大,缩短窗口
elif volatility < threshold_low:
window = base_window * 2 # 波动小,拉长窗口
else:
window = base_window
train_data = data[today - window : today]
model.fit(train_data)
我个人最喜欢这种方案。虽然实现起来麻烦一点,但效果确实好。
我记得有一次做铁矿石的基差交易,市场突然因为港口库存数据爆表而剧烈波动。自适应窗口模型在两天内就完成了参数调整,而滚动窗口模型还在用旧参数「硬扛」。结果嘛,自适应窗口那周赚了,滚动窗口亏了。
15.3 三种方案的对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 滚动窗口 | 实现简单,对近期数据敏感 | 窗口长度难选,容易过拟合 | 波动率稳定的品种 |
| 递归窗口 | 模型稳定,参数估计更准 | 无法遗忘历史噪音 | 市场结构长期不变 |
| 自适应窗口 | 灵活,适应性强 | 实现复杂,需要调参 | 波动率变化大的品种 |
15.4 我的实战建议
说了这么多,给你几条实在的建议。
- 先做回测,别拍脑袋。 我见过太多人,上来就拍一个60天的窗口,结果回测一跑,惨不忍睹。不同品种、不同周期,最优窗口差异很大。
- 自适应窗口是趋势。 如果你有精力,我建议直接上自适应窗口。虽然初期调试麻烦,但长期来看,它帮你省下的「模型维护时间」远多于投入。
- 别忘了做窗口敏感性分析。 我曾经在铜的基差模型上,把窗口从30天试到120天,发现50-70天这个区间效果最稳定。这个分析花了我一下午,但之后半年都没再调过参数。
一句话总结:
时间窗口没有「万能答案」,只有「最适合当前品种」的方案。多试、多测、多复盘,比什么都强。
15.5 核心逻辑图
下面这张图,帮你理清三种窗口的核心逻辑和适用边界。
一个小技巧:
如果你刚开始做基差回归,我建议先从滚动窗口入手。等跑通了整个流程,再慢慢尝试自适应窗口。别一上来就搞复杂的,容易把自己绕进去。