如何在Python中提升ADFuller系数的批量计算速度?
加速ADFuller价差检验计算的方案
问题根源
你的循环慢是因为adfuller是串行逐列计算的,每列的检验都是独立的CPU密集型任务,列数越多,累计耗时越长。下面是几种可行的加速方案:
1. 并行计算(最有效)
利用多进程并行处理每一列,因为各列的ADF检验完全独立,适合拆分到多个CPU核心同时运行。用concurrent.futures.ProcessPoolExecutor实现最简单:
from statsmodels.tsa.stattools import adfuller from concurrent.futures import ProcessPoolExecutor # 定义单独的ADF计算函数 def run_adf(series): return adfuller(series) # 提取需要计算的列(跳过第一列) target_cols = df_spread.columns[1:] # 启动进程池并行计算 with ProcessPoolExecutor() as executor: # 把每列的Series传入进程池 adf_results = list(executor.map(run_adf, [df_spread[col] for col in target_cols])) # 转换成原格式的字典 adf_spreads = dict(zip(target_cols, adf_results))
注意:Windows系统下,需要把这段代码放在
if __name__ == "__main__":代码块内,否则会出现进程启动异常。
这种方法能把计算时间压缩到接近单核心耗时除以核心数,列数越多,提速效果越明显。
2. 简化ADF检验参数
默认的adfuller会自动通过AIC选择最优滞后阶数,这个过程会额外消耗计算资源。如果你能根据数据特征(比如价差序列的自相关性)固定滞后阶数,能减少不少计算量:
adf_spreads = {} for col in df_spread.columns[1:]: # 固定最大滞后数为10,关闭自动滞后选择 adf_spreads[col] = adfuller(df_spread[col], maxlag=10, autolag=None)
提示:可以先对少量列做检验,观察最优滞后阶数的分布,再确定一个合适的固定值,避免影响检验结果的可靠性。
3. 简化代码但不提速:用apply语法糖
如果只是想简化代码而非提速,可以用DataFrame.apply替代显式循环,但本质还是逐列串行计算,速度和原循环差不多:
adf_spreads = df_spread.iloc[:, 1:].apply(adfuller).to_dict()
总结
- 列数多的时候优先用并行计算,这是最有效的提速手段;
- 若对检验结果的滞后阶数有把握,固定参数能进一步减少耗时;
apply只是简化代码,不能提速。
内容的提问来源于stack exchange,提问作者nuclear_engineer
相关产品推荐
相关产品推荐

