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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:27:13