October 27, 2022

Автокорреляционная функция временных рядов с Python

Автокорреляция является числовым отражениям связи между лаговыми значениями временного ряда. Рассмотрим, особенности ее подсчета и практической реализации в библиотеке Statsmodels.

Сначала скачаем тренировочный набор данных:

import pandas as pd
import pmdarima as pm
import numpy as np

ts = pm.datasets.load_airpassengers(as_series=True)
ts.index = pd.date_range('1949', '1961', freq='M')
ts.plot() 

Автокорреляцию между ts и его сдвигом на k можно посчитать так:

или более практичный вид:

Числовые коэффициенты в числителе и знаменателе считают по-разному, так как у основного ряда T членов, а лагового - (T-k). Кроме того, часто полагают, что ряд стационарный, соответственно, матожидания и дисперсии исходного ряда и его смещения можно считать равными. С учетом этих допущений формулу можно упростить до:

Проверим уравнение на практике. Воспользуемся функцией acf из модуля statsmodels.tsa.stattools:

from statsmodels.tsa.stattools import acf
acfs = acf(ts)
display(acfs[:5])

А теперь посчитаем вручную:

for k in range(5):
  display(((ts-ts.mean())*(ts.shift(k)-ts.mean())).mean()*(len(ts)-k)/len(ts)/(ts.var(ddof=0)))

Результаты совпадают. С параметром adjusted=True в acf формула примет вид:

from statsmodels.tsa.stattools import acf
acfs = acf(ts, adjusted=True)
display(acfs[:5])
for k in range(5):
  display(((ts-ts.mean())*(ts.shift(k)-ts.mean())).mean()/(ts.var(ddof=0)))