如何用statsmodels的Johansen协整检验分析两市场价格序列并解读结果?
Johansen协整检验的正确使用与结果解读
第一步:修正输入数据
你的DataFrame包含date列,协整检验只需要数值型的价格时间序列,必须先排除日期列,提取两个市场的价格数据:
import statsmodels.tsa.vector_ar.vecm as vecm # 提取价格列,排除date price_series = df[['CEASA-PE', 'CEAGESP']]
第二步:正确调用coint_johansen函数
你之前的代码只返回了结果对象,是因为没有提取属性;另外还要注意参数的合理设置:
det_order:控制确定性趋势项,0=无趋势,1=含常数项,2=含常数+线性趋势,根据数据走势选(月度价格一般选1)k_ar_diff:VECM模型的滞后差分阶数,不能盲目设为0,建议先通过信息准则选最优阶数
示例代码:
# 先选最优滞后阶数(推荐步骤) vecm_model = vecm.VECM(price_series, k_ar_diff=range(1,6), coint_rank=1, deterministic="ci") best_lag = vecm_model.select_order().aic_min_order # 执行Johansen检验 test_result = vecm.coint_johansen(price_series, det_order=1, k_ar_diff=best_lag)
如果暂时不想选阶数,可先尝试k_ar_diff=1(月度数据常用),后续再优化。
第三步:提取并解读检验结果
coint_johansen返回的JohansenTestResult对象包含所有检验信息,需要访问它的核心属性来解读:
核心属性说明
lr1:迹统计量(Trace Statistic),用于检验协整关系的数量lr2:最大特征值统计量(Maximum Eigenvalue Statistic)cvt:迹检验的临界值表(对应90%、95%、99%置信水平)cvmax:最大特征值检验的临界值表evec:协整向量(存在协整关系时有效)
检验逻辑
- 迹检验:
- 从原假设
r=0(无协整关系)开始,比较迹统计量和对应置信水平的临界值 - 若统计量>临界值,拒绝原假设,说明至少存在1个协整关系;继续检验
r≤1,直到无法拒绝为止
- 从原假设
- 最大特征值检验:
- 检验原假设
r=r0vs 备择假设r=r0+1,同样通过统计量与临界值的大小判断
- 检验原假设
提取结果的代码示例:
# 打印迹检验结果 print("迹统计量:", test_result.lr1) print("迹检验临界值(90%/95%/99%):\n", test_result.cvt) # 打印最大特征值检验结果 print("\n最大特征值统计量:", test_result.lr2) print("最大特征值检验临界值(90%/95%/99%):\n", test_result.cvmax) # 打印协整向量(若存在协整关系) print("\n协整向量:\n", test_result.evec)
举个例子:如果r=0时的迹统计量大于95%临界值,就说明两个市场的价格序列存在长期均衡的协整关系。
注意事项
- Johansen检验适用于I(1)序列(一阶差分后平稳),建议先通过ADF检验确认序列是一阶单整
- 滞后阶数选得太大会损失自由度,太小会遗漏自相关,优先用
select_order方法选最优阶数 det_order的选择要匹配数据趋势:如果价格有明显的固定偏移选1,有持续上涨/下跌趋势选2,无趋势选0
内容的提问来源于stack exchange,提问作者Vinícius Franca
相关产品推荐
相关产品推荐

