18、基差回归模型的回测框架:回测设计、绩效指标与过拟合防范
做基差交易的人,最怕什么?
怕模型在历史数据上跑得漂亮,一上实盘就翻车。我见过太多这样的案例了——回测曲线美得像教科书,实盘账户却像坐过山车。说白了,回测框架就是你的「防弹衣」,穿得不对,迟早要挨枪子。
回测设计:别让数据骗了你
回测设计这件事,我个人的习惯是「先定规矩,再跑数据」。没有规矩的回测,就像没有裁判的比赛,结果毫无意义。
时间窗口划分
基差回归模型对时间窗口特别敏感。你想想看,2015年的基差规律和2023年的能一样吗?
- 训练集:我一般用过去2-3年的日频数据。太短了学不到完整周期,太长了市场结构早就变了。
- 验证集:紧接训练集之后的6个月。用来调参,别让它偷看到测试集的信息。
- 测试集:最后6-12个月。这是真正的「考场」,模型之前从未见过这些数据。
关键点:一定要按时间顺序切分,别用随机抽样。基差数据有强烈的时间序列特性,随机抽样等于作弊。
滚动回测
静态回测有个大坑:你只测了一次,结果可能只是运气好。我建议用滚动窗口的方式——每3个月重新训练一次模型,然后回测接下来3个月。这样反复滚动,能模拟真实交易中模型更新的节奏。
# 伪代码示例:滚动回测框架
start_date = '2018-01-01'
window_size = 730 # 2年训练窗口
step_size = 63 # 3个月滚动一次
for train_end in range(start + window_size, end, step_size):
train_data = data[train_end - window_size : train_end]
test_data = data[train_end : train_end + step_size]
model = train_regression_model(train_data)
predictions = model.predict(test_data)
trades = generate_signals(predictions)
record_performance(trades)
我的经验:滚动回测虽然计算量大,但它能告诉你模型在不同市场环境下的稳定性。我曾经用静态回测选出的模型,在滚动回测中直接「现了原形」——某些年份表现极差,幸亏提前发现了。
绩效指标:别只看收益率
很多新手回测完只看总收益率,这是最危险的。收益率可以造假,但风险指标不会说谎。
夏普比率
夏普比率衡量的是「每承担一单位风险,能获得多少超额收益」。对于基差交易来说,我一般要求夏普比率在1.5以上才考虑实盘。
| 夏普比率 | 评价 | 基差交易中的含义 |
|---|---|---|
| < 0.5 | 差 | 风险调整后收益不如无风险利率 |
| 0.5 - 1.0 | 一般 | 勉强可用,但需谨慎 |
| 1.0 - 2.0 | 良好 | 适合实盘,但需监控 |
| > 2.0 | 优秀 | 警惕过拟合! |
注意:夏普比率超过3.0的基差模型,我基本直接判为过拟合。为什么?因为基差回归的收益来源有限,不可能持续获得如此高的风险调整后收益。
最大回撤
最大回撤是基差交易者的「生命线」。我个人能接受的最大回撤是15%,超过这个数,不管模型多赚钱我都会停掉。
回撤的计算方式很简单:
# 计算最大回撤
cumulative_returns = (1 + daily_returns).cumprod()
running_max = cumulative_returns.cummax()
drawdown = (cumulative_returns - running_max) / running_max
max_drawdown = drawdown.min()
但要注意,最大回撤有个缺点:它只关注了最坏的那一次。我还会看「回撤恢复时间」——从回撤底部回到前高需要多少天。如果超过60天还没恢复,说明模型的风控能力有问题。
其他关键指标
- 胜率:基差交易胜率一般在55%-65%之间。太高了反而不正常。
- 盈亏比:平均盈利/平均亏损。我要求至少1.5:1。
- 卡玛比率:年化收益率/最大回撤。比夏普比率更直观,我常用它做最终决策。
过拟合防范:回测最大的敌人
过拟合是量化交易的头号杀手。说白了,就是模型记住了历史数据的「噪音」,而不是「信号」。
我踩过的坑
我曾经做过一个基差模型,在回测中夏普比率高达2.8,最大回撤只有5%。我当时兴奋得不行,直接上了实盘。结果呢?三个月亏了20%。后来复盘发现,模型过度拟合了2019年某几个月的特殊行情——那些行情再也没出现过。
防范过拟合的实战方法
- 参数简约原则:能用3个参数解决的问题,别用10个。每多一个参数,过拟合风险就翻一倍。
- 交叉验证:别只用一组训练/测试集。我习惯做5折时间序列交叉验证——把数据按时间分成5段,每次用4段训练、1段测试,轮5次。
- 蒙特卡洛模拟:对回测结果做1000次随机扰动,看看模型的稳定性。如果稍微改一点数据,结果就大变样,那肯定是过拟合了。
- 样本外测试:留出最后20%的数据完全不碰,等模型全部定稿后再测一次。这是最后的「照妖镜」。
避坑指南:我曾经见过有人用100个技术指标做基差回归,回测曲线完美无瑕。但你想啊,100个指标里总有几个恰好和历史数据吻合,这不叫策略,这叫「数据挖掘偏差」。
回测框架的核心逻辑
下面这张图是我自己总结的回测框架流程,每次做新模型前我都会过一遍:
这个流程我用了好几年,核心思想就一句话:永远假设你的模型是过拟合的,直到被证据推翻。
写在最后
回测框架不是一次性工作,而是持续迭代的过程。每当我发现模型在实盘中表现异常,我都会回到回测框架中找原因——是数据泄露了?还是参数过拟合了?
嗯,基差交易这条路,回测框架就是你的「安全带」。系好了,才能开快车。