14. 基差与库存的领先滞后关系:Granger因果检验
做基差交易这么多年,我一直在琢磨一个问题:到底是库存变化驱动了基差,还是基差变化反过来影响了库存?
这个问题看着简单,但实际交易中特别要命。你想想看,如果你判断错了因果关系,那你的交易逻辑从一开始就是错的。我见过太多人,看到库存降了就冲进去做多基差,结果被市场狠狠教育了一顿。
嗯,今天我们就来聊聊怎么用Granger因果检验,把这个问题彻底搞清楚。
14.1 为什么需要Granger因果检验?
先说说直觉。库存和基差之间,理论上应该是双向影响的:
- 库存→基差:库存高了,现货压力大,基差走弱;库存低了,现货紧张,基差走强
- 基差→库存:基差走强,说明现货紧缺,贸易商愿意囤货,库存反而可能增加
你看,这里有个循环。光靠肉眼观察K线图,根本分不清谁先谁后。
我记得2019年做螺纹钢的时候,当时库存连续下降,基差也在走强。很多人说这是库存驱动基差,但我用Granger检验跑了一下,发现其实是基差领先库存大概两周。这个发现让我调整了交易节奏,效果还不错。
核心观点:Granger因果检验不是检验"谁导致了谁",而是检验"谁先发生,谁后发生"——这是一个时间上的领先滞后关系。
14.2 Granger因果检验的原理
说白了,Granger因果检验的逻辑特别简单:
如果变量X的过去值能帮助预测变量Y的当前值,那我们就说X是Y的Granger原因。
具体怎么做的?我习惯用VAR模型来跑。假设我们有两个时间序列:库存变化(ΔInv)和基差变化(ΔBasis):
ΔBasis_t = α₁ + Σβ₁ᵢ·ΔBasis_{t-i} + Σγ₁ᵢ·ΔInv_{t-i} + ε₁_t
ΔInv_t = α₂ + Σβ₂ᵢ·ΔInv_{t-i} + Σγ₂ᵢ·ΔBasis_{t-i} + ε₂_t
检验库存是否是基差的Granger原因,就是看第一个方程里所有γ₁ᵢ是否联合显著。如果显著,说明库存的过去值对基差的当前值有预测能力。
小提示:做Granger检验前,一定要确保两个序列都是平稳的。我一般先用ADF检验,如果不平稳就做一阶差分。这个步骤不能省,否则结果全是假的。
14.3 实战:用Python跑Granger因果检验
直接上代码。这是我实际项目中用过的模板,稍微改了一下数据,但逻辑完全一样。
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import grangercausalitytests
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# 加载数据(假设你有库存和基差的日度数据)
df = pd.read_csv('inventory_basis_data.csv', index_col=0, parse_dates=True)
# 先做平稳性检验
def check_stationarity(series, name):
result = adfuller(series.dropna())
print(f'{name} ADF统计量: {result[0]:.4f}, p值: {result[1]:.4f}')
if result[1] < 0.05:
print(f' → {name} 是平稳的')
else:
print(f' → {name} 不平稳,需要差分')
check_stationarity(df['inventory_change'], '库存变化')
check_stationarity(df['basis_change'], '基差变化')
# 做Granger因果检验
# 检验库存变化是否是基差变化的Granger原因
print('\n=== 检验:库存变化 → 基差变化 ===')
result_1 = grangercausalitytests(df[['basis_change', 'inventory_change']], maxlag=5, verbose=True)
# 检验基差变化是否是库存变化的Granger原因
print('\n=== 检验:基差变化 → 库存变化 ===')
result_2 = grangercausalitytests(df[['inventory_change', 'basis_change']], maxlag=5, verbose=True)
跑完代码后,你会看到每个滞后阶数下的F统计量和p值。我一般这么看结果:
- p值 < 0.05:拒绝原假设,说明存在Granger因果关系
- p值 ≥ 0.05:不能拒绝原假设,说明没有显著的预测关系
注意:滞后阶数的选择很关键。选少了可能漏掉信息,选多了又容易过拟合。我个人的习惯是用AIC或BIC准则来确定最优滞后阶数,或者直接试1到10阶,看哪个阶数下结果最稳定。
14.4 一个真实的案例
2021年我做铜的基差交易时,遇到过这么个情况。
当时LME铜库存一直在降,从25万吨降到了10万吨以下。基差从贴水变成了升水,而且升水幅度越来越大。看起来是库存驱动基差,对吧?
但我用Granger检验跑了一下,结果让我有点意外:
| 检验方向 | 滞后1阶p值 | 滞后2阶p值 | 滞后3阶p值 | 结论 |
|---|---|---|---|---|
| 库存变化 → 基差变化 | 0.032 | 0.048 | 0.071 | 短期显著,中期不显著 |
| 基差变化 → 库存变化 | 0.001 | 0.003 | 0.008 | 非常显著 |
你看,有意思的地方来了:
- 库存变化对基差变化的影响,只在滞后1-2阶时显著,说明库存对基差的影响是短期的
- 基差变化对库存变化的影响,在所有滞后阶数下都非常显著,说明基差对库存有持续的预测能力
这个结果告诉我什么?
在这个时间段,其实是基差在引领库存变化。基差走强后,贸易商看到有利可图,开始囤货,库存反而慢慢回升了。如果我只盯着库存做交易,就会错过基差先行这个信号。
实战建议:做基差交易时,不要只看库存的绝对值。先用Granger检验搞清楚当前市场是谁在引领谁,再决定你的交易策略。
14.5 常见坑和避坑指南
做Granger因果检验这些年,我踩过不少坑。挑几个最典型的说说:
- 数据频率不匹配:库存数据通常是周度或月度的,基差数据是日度的。直接拿日度基差和周度库存跑检验,结果会失真。我一般先把基差数据降频到周度,或者用库存的周度变化来匹配。
- 忽略结构性突变:市场结构变了,因果关系也会变。比如2020年疫情前后,很多品种的库存-基差关系都发生了根本性变化。我建议分时段做检验,不要用全样本一刀切。
- 过度解读结果:Granger因果不是真正的因果。它只告诉你时间上的先后关系,不告诉你背后的经济逻辑。我曾经看到有人把检验结果直接当交易信号用,结果亏得很惨。
我的习惯:每次做Granger检验前,我都会先画一张库存和基差的走势对比图,肉眼看一下有没有明显的领先滞后关系。然后再用统计方法验证。这样心里更有底。
14.6 知识体系总结
为了让你更直观地理解这一章的内容,我画了一张流程图:
这张图把整个流程串起来了。你从数据准备开始,一步步走到结果应用,每个环节都不能跳过。
最后说一句:Granger因果检验是个好工具,但它不是万能的。我见过太多人把统计结果当圣杯,结果在市场里碰得头破血流。记住,工具是帮你做决策的,不是替你做决策的。
嗯,这一章就到这里。如果你在实际操作中遇到什么问题,欢迎来交流。
公众号:蓝海资料掘金营,微信deep3321