加密货币配对协整检验p值始终异常偏低问题排查
问题原因
你得到任意配对p值异常偏低的核心原因是用错了协整检验的输入序列:
- 协整检验的适用前提是输入为同阶单整的非平稳序列,配对交易场景下我们检验的是两个I(1)序列(即序列本身非平稳,一阶差分后平稳)是否存在长期稳定的线性关系。
- 你代码里输入的对数收益率,本质是对数价格的一阶差分结果,本身就是I(0)平稳序列,完全不满足协整检验的输入要求。
- 协整检验的核心逻辑是对两个输入序列做OLS回归,再检验回归残差是否平稳。如果输入本身就是平稳序列,其线性组合残差几乎必然平稳,自然会得到极小的p值,拒绝“不存在协整”的原假设——这个结果是统计方法误用导致的,和标的本身是否真的存在协整关系没有关联。
修正方案
按如下逻辑调整代码即可得到有效结果:
- 协整检验的输入替换为对数价格序列,不要用对数收益率。对数价格是典型的I(1)序列,符合协整检验的前提要求。
- 正式做协整检验前,先对两个对数价格序列分别做ADF单位根检验,确认两个序列均满足“本身非平稳、一阶差分后平稳”的I(1)特性,只有同阶单整的序列做协整检验的结果才有统计意义。
- 去掉对数收益率序列
fillna(0)的操作,缺失值直接丢弃即可,补0会人为引入噪声干扰检验结果。 - 注意协整关系对应的平稳价差是两个对数价格的线性组合残差,不是对数收益率的差值,不要混淆。
修正后的核心检验逻辑参考:
def check_pair(first_market, second_market, timeframe): first = get_ohlc_ccxt(first_market, timeframe) second = get_ohlc_ccxt(second_market, timeframe) if len(first) != len(second): length = min(len(first), len(second)) first = first.iloc[-length:] second = second.iloc[-length:] # 生成对数价格序列 first['log_price'] = np.log(first['close']) second['log_price'] = np.log(second['close']) x = first['log_price'] y = second['log_price'] # 此处补充ADF检验逻辑,确认x、y均为I(1)序列后再执行协整检验 coint_res = ts.coint(x, y) p_value = coint_res[1] print('Cointegration:', first_market, second_market, p_value) return first, second
内容的提问来源于stack exchange,提问作者JayK23
相关产品推荐
相关产品推荐

