You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:协整向量(存在协整关系时有效)

检验逻辑

  1. 迹检验:
    • 从原假设r=0(无协整关系)开始,比较迹统计量和对应置信水平的临界值
    • 若统计量>临界值,拒绝原假设,说明至少存在1个协整关系;继续检验r≤1,直到无法拒绝为止
  2. 最大特征值检验:
    • 检验原假设r=r0 vs 备择假设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:43:23