4. 基差统计特征:均值回归、波动率聚类与季节性规律
各位同学,今天我们来聊聊基差的“脾气”。
做基差交易,说白了就是跟统计规律打交道。你如果不懂基差的统计特征,那跟闭着眼睛开车没啥区别。我个人习惯,拿到一个品种的基差数据,第一件事不是看价格,而是先做三件事:测回归、看波动、找周期。
这三件事,就是今天这节的核心。
4.1 基差的均值回归特性
先问大家一个问题:为什么基差会均值回归?
道理其实很简单。基差 = 现货价格 - 期货价格。当基差拉得太大,套利者就会冲进来。比如基差大到离谱,做空基差(卖现货买期货)就能赚钱,这钱谁不赚?赚的人多了,基差自然就被压回来了。
反过来也一样。基差负得太深,做多基差(买现货卖期货)有利可图,资金又会把它推回去。
这就是均值回归的底层逻辑——套利力量的存在。
核心结论:绝大多数商品期货的基差,在日频或周频上呈现显著的均值回归特征。回归半衰期通常在3-15个交易日之间。
我在项目中遇到过什么情况呢?有一次做螺纹钢的基差策略,我偷懒用了月频数据,结果回测曲线漂亮得不像话。一上实盘,直接被打脸。为什么?因为月频数据把日内回归的细节全抹平了,你看到的“回归”其实是假象。
避坑指南:我曾经用日频数据做回归检验,发现某些品种的基差其实有“伪回归”现象——看起来在回归,实际上是趋势项在作怪。所以,做均值回归检验前,一定先做单位根检验(ADF检验),别偷懒。
# Python示例:基差均值回归检验
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
# 假设 basis 是基差序列
result = adfuller(basis.dropna())
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
# 如果p值 < 0.05,拒绝单位根假设,说明基差是平稳的
# 平稳 = 具备均值回归特性
if result[1] < 0.05:
print('✅ 基差序列平稳,适合做均值回归策略')
else:
print('⚠️ 基差不平稳,需要差分或考虑其他结构')
实战小技巧:我个人习惯用半衰期(Half-life)来衡量回归速度。半衰期越短,回归越快,策略容量通常越小。半衰期在5天以内的品种,适合做高频回归策略;半衰期超过20天的,更适合做趋势跟踪。
4.2 基差的波动率聚类
波动率聚类,这个词听起来高大上,说白了就是:大波动后面跟着大波动,小波动后面跟着小波动。
你想想看,基差的波动率是不是这样?行情剧烈波动的时候,基差上蹿下跳,一天能变好几次方向。等行情平稳了,基差也老实了,每天就晃悠那么几个点。
为什么会这样?因为波动率有记忆性。市场情绪、资金博弈、政策冲击,这些因素不会一天就消失。一个大的冲击来了,市场需要时间消化,这个过程中波动率就会持续偏高。
核心结论:基差的波动率存在明显的GARCH效应(广义自回归条件异方差)。简单说,波动率不是随机的,而是可预测的——至少部分可预测。
我记得有一次做豆粕的基差策略,模型在2018年表现很好,到了2019年突然失效。我查了半天才发现,2019年豆粕的基差波动率结构变了——从低波动状态跳到了高波动状态,而我的模型还在用低波动时期的参数。
避坑指南:我曾经犯过一个低级错误——用全样本数据训练波动率模型。结果模型在样本内表现完美,样本外一塌糊涂。正确的做法是:滚动窗口训练,窗口长度至少500个交易日。
# Python示例:基差波动率聚类检测(GARCH模型)
from arch import arch_model
# 拟合GARCH(1,1)模型
model = arch_model(basis.dropna() * 100, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
print(result.summary())
# 检查alpha和beta系数
# alpha > 0.05 说明存在波动率聚类
# beta > 0.9 说明波动率冲击持久
alpha = result.params['alpha[1]']
beta = result.params['beta[1]']
print(f'Alpha (冲击系数): {alpha:.4f}')
print(f'Beta (持久系数): {beta:.4f}')
print(f'半衰期: {np.log(0.5)/np.log(beta):.2f} 天')
⚠️ 重要提醒:波动率聚类意味着你的止损和仓位管理必须动态调整。高波动时期,基差可能瞬间突破你的止损线;低波动时期,你的策略可能迟迟等不到开仓信号。我个人习惯用ATR(平均真实波幅)的倍数来动态设置止损。
4.3 基差的季节性规律与周期
这一块,是很多量化交易者容易忽略的。
基差有没有季节性?当然有。农产品看收获季,能化品看检修季,黑色系看开工季。这些季节性因素会直接影响现货的供需格局,进而影响基差。
举个例子:
- 豆粕:每年6-8月是美豆生长期,天气炒作导致期货波动大,基差往往走弱。9-10月收获季,现货压力大,基差可能走强。
- 螺纹钢:春节后复工季,现货需求旺盛,基差通常走强。7-8月高温淡季,需求减弱,基差可能走弱。
- 原油:炼厂检修季(春季和秋季),原油需求下降,基差可能走弱。夏季出行旺季,汽油需求推高原油,基差走强。
核心结论:基差的季节性规律,本质上是由现货的供需节奏决定的。期货价格反映的是预期,现货价格反映的是当下。当预期和现实出现错配,基差就会呈现季节性特征。
我做过一个统计:把过去10年所有品种的基差按月平均,画出来一看,大部分品种都有明显的“日历效应”。比如甲醇,每年1月和12月基差通常为正,7月和8月基差通常为负。这个规律稳定吗?说实话,最近3年有所减弱,但依然存在。
# Python示例:基差季节性分析
import pandas as pd
import numpy as np
# 假设 df 包含日期和基差数据
df['month'] = df['date'].dt.month
monthly_stats = df.groupby('month')['basis'].agg(['mean', 'std', 'count'])
# 计算每个月的基差均值是否显著偏离0
monthly_stats['t_stat'] = monthly_stats['mean'] / (monthly_stats['std'] / np.sqrt(monthly_stats['count']))
monthly_stats['p_value'] = 2 * (1 - stats.t.cdf(abs(monthly_stats['t_stat']), df=monthly_stats['count']-1))
print('基差季节性统计:')
print(monthly_stats[['mean', 't_stat', 'p_value']])
实战小技巧:季节性规律不是一成不变的。我建议每年重新做一次季节性分析,看看规律是否还在。另外,不要把季节性当成交易信号的全部,它只是一个“背景音”——告诉你当前基差处于历史上的什么位置。
4.4 知识体系总览
下面这张图,是我自己整理的知识框架。你把它存下来,以后做基差分析的时候,对着这张图一步步来,基本不会漏掉什么。
这张图你看懂了吗?三个模块不是孤立的。均值回归告诉你“基差会回来”,波动率聚类告诉你“什么时候回来风险大”,季节性规律告诉你“现在处于什么位置”。三者结合起来,才能构建一个完整的基差交易框架。
总结一下:
- 均值回归是基差交易的理论基础——没有回归,就没有套利空间。
- 波动率聚类是风险管理的关键——波动率变了,你的仓位和止损也得变。
- 季节性规律是策略优化的利器——知道历史规律,才能判断当前基差是否“异常”。
好了,这一节的内容就到这里。下一节我们会讲如何把这些统计特征用到实际的策略设计中。记住:理论是死的,市场是活的。多复盘,多总结,你才能真正吃透基差交易。