第二十节:基差回归模型的参数敏感性分析
各位做量化交易的朋友,咱们今天聊点实在的。参数敏感性分析,说白了就是看看你那些模型参数,稍微动一动,收益会怎么变。我见过太多人,模型回测漂亮得不行,一上实盘就崩。为什么?参数太敏感了,市场一波动就翻车。
我个人习惯,在任何一个基差回归模型上线前,先做一轮参数敏感性分析。这不是可选项,是必选项。你想想看,如果参数调一丁点,收益就大起大落,那这模型你敢用吗?
一、参数敏感性分析的核心逻辑
基差回归模型里,常见的敏感参数有哪些?我列几个:
- 回归窗口长度:用多少天的数据去拟合回归系数
- 均值回复速度:半衰期参数,决定回归的快慢
- 开仓阈值:偏离多少倍标准差才进场
- 止损倍数:亏多少就认输出局
- 持仓周期上限:最长持有多少天
这些参数,每一个都像螺丝钉。拧太紧,模型僵化;拧太松,模型松散。我们要做的,就是找到那个「松紧适度」的区域。
核心观点:参数敏感性分析不是找最优参数,而是找参数稳定区间。在这个区间内,收益波动小,策略才靠谱。
二、实战案例:窗口长度敏感性测试
我记得有一次做螺纹钢的基差回归策略。当时我选了20天、30天、40天、60天四个窗口长度,分别跑回测。结果很有意思:
| 窗口长度 | 年化收益率 | 最大回撤 | 夏普比率 |
|---|---|---|---|
| 20天 | 18.5% | -12.3% | 1.52 |
| 30天 | 22.1% | -9.8% | 1.89 |
| 40天 | 21.6% | -10.2% | 1.81 |
| 60天 | 15.2% | -15.7% | 1.21 |
看到没?30天和40天的结果很接近,但20天和60天就明显差了。这说明什么?30-40天这个区间是稳定的。我后来实盘就选了35天,取个中间值。
为什么会这样?窗口太短,噪声多,回归系数不稳定;窗口太长,又跟不上市场变化。嗯,这里要注意,不同品种的「稳定窗口」不一样。比如股指期货,我习惯用60-90天;而农产品,20-30天就够了。
三、稳健性检验:压力测试
参数敏感性分析只是第一步。真正的考验是稳健性检验。我把它分成三类:
- 时间维度稳健性:换不同时间段,结果是否一致?
- 品种维度稳健性:换相关品种,逻辑是否还成立?
- 参数扰动稳健性:参数随机波动,收益是否稳定?
我曾经犯过一个错。2018年做豆粕基差策略,参数在2015-2017年表现很好。结果2018年贸易战一来,参数全废了。后来我学乖了,做稳健性检验时,一定要包含极端行情。
我的小技巧:做参数扰动测试时,把每个参数在±20%范围内随机采样1000次,看收益分布。如果90%以上的采样结果都是正收益,那这个策略才算「稳健」。
四、代码实现:参数敏感性扫描
下面是我常用的一个参数扫描框架。说白了就是暴力枚举,但很管用。
import numpy as np
import pandas as pd
def parameter_sensitivity_scan(data, param_grid):
"""
参数敏感性扫描
param_grid: 字典,键是参数名,值是参数列表
"""
results = []
for window in param_grid['window']:
for threshold in param_grid['threshold']:
for stop_loss in param_grid['stop_loss']:
# 运行策略
strategy = BasisRegressionStrategy(window, threshold, stop_loss)
perf = strategy.backtest(data)
results.append({
'window': window,
'threshold': threshold,
'stop_loss': stop_loss,
'sharpe': perf['sharpe'],
'max_drawdown': perf['max_drawdown'],
'return': perf['annual_return']
})
df_results = pd.DataFrame(results)
# 找出参数稳定区域
stable_region = df_results[
(df_results['sharpe'] > df_results['sharpe'].quantile(0.7)) &
(df_results['max_drawdown'] < df_results['max_drawdown'].quantile(0.3))
]
return df_results, stable_region
这段代码,我建议你跑的时候加上并行计算。参数组合一多,单线程跑太慢了。我一般用joblib或者multiprocessing,速度能快10倍。
五、可视化:参数敏感性热力图
光看数字不够直观。我习惯画热力图,一眼就能看出参数敏感区域。
从这张图能清楚看到,窗口长度在30-45天、阈值在1.5-2.0σ这个区域,夏普比率最高且稳定。超出这个范围,收益就明显下滑了。
注意:热力图只能看两个参数的交互。如果有三个以上参数,我建议用平行坐标图或者参数重要性排序。别把所有参数都塞进一张图,那会变成一团乱麻。
六、避坑指南:我踩过的几个坑
做参数敏感性分析这些年,我踩过不少坑。分享几个典型的:
- 过度优化陷阱:我曾经为了追求高夏普,把参数调得特别精细。结果实盘一跑,参数稍微偏离最优值,收益就变负。后来我明白了,要的是「宽谷」而不是「尖峰」。
- 忽略交易成本:参数敏感时,交易频率会变。频率一高,手续费就把利润吃掉了。我建议在敏感性分析时,把手续费也作为一个参数加进去。
- 样本外验证不足:在训练集上做敏感性分析,结果再好也没用。一定要留出至少30%的数据做样本外验证。我习惯用滚动窗口验证,每半年重新校准一次参数。
嗯,说到这,我想起一个案例。去年有个朋友做甲醇基差策略,参数敏感性分析做得很好,但忽略了流动性变化。结果实盘时,基差回归速度变慢,策略连续止损。后来我帮他加了流动性过滤条件,情况才好转。
七、总结:参数敏感性分析的三个层次
我个人把参数敏感性分析分成三个层次:
- 单参数分析:固定其他参数,看单个参数变化对收益的影响。这是基础。
- 双参数交互:看两个参数同时变化时的收益曲面。热力图就是干这个的。
- 多参数稳健性:所有参数同时随机扰动,看收益分布。这是终极考验。
能做到第三层,你的策略基本就稳了。但说实话,大部分策略连第一层都做不好。所以,别嫌麻烦,一步一步来。
最后说一句:参数敏感性分析不是一次性工作。市场在变,品种在变,你的参数稳定区间也会变。我每季度都会重新做一次分析,确保策略还活着。