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 我的实战建议

说了这么多,给你几条实在的建议。

  1. 先做回测,别拍脑袋。 我见过太多人,上来就拍一个60天的窗口,结果回测一跑,惨不忍睹。不同品种、不同周期,最优窗口差异很大。
  2. 自适应窗口是趋势。 如果你有精力,我建议直接上自适应窗口。虽然初期调试麻烦,但长期来看,它帮你省下的「模型维护时间」远多于投入。
  3. 别忘了做窗口敏感性分析。 我曾经在铜的基差模型上,把窗口从30天试到120天,发现50-70天这个区间效果最稳定。这个分析花了我一下午,但之后半年都没再调过参数。

一句话总结:

时间窗口没有「万能答案」,只有「最适合当前品种」的方案。多试、多测、多复盘,比什么都强。

15.5 核心逻辑图

下面这张图,帮你理清三种窗口的核心逻辑和适用边界。

基差回归模型时间窗口选择 滚动窗口 递归窗口 自适应窗口 固定长度,滑动更新 优点:实现简单 缺点:窗口长度难选 适用:波动率稳定品种 数据只增不减 优点:模型稳定 缺点:无法遗忘历史 适用:结构长期不变 动态调整窗口长度 优点:灵活适应 缺点:实现复杂 适用:波动率变化大 核心原则:稳定性与敏感性的平衡

一个小技巧:

如果你刚开始做基差回归,我建议先从滚动窗口入手。等跑通了整个流程,再慢慢尝试自适应窗口。别一上来就搞复杂的,容易把自己绕进去。

公众号:蓝海资料掘金营,微信deep3321