Освоение прогнозирования временных рядов с помощью авторегрессионных (AR) моделей: подробное руководство

Авторегрессионные модели предназначены для прогнозирования временного ряда, полагаясь исключительно на его предыдущие значения, также известные как лаги. Они основаны на предположении, что текущее значение переменной временного ряда линейно зависит от ее прошлых значений. Другими словами, авторегрессионная модель предсказывает будущие значения переменной, используя линейную комбинацию ее предыдущих наблюдений.

«Авторегрессивная» часть модели относится к тому факту, что она регрессирует переменную против самой себя. Порядок авторегрессионной модели, обозначенный как AR(p), указывает количество запаздывающих наблюдений, используемых для прогнозирования текущего значения. Например, в модели AR(1) используются только последние наблюдения, а в модели AR(2) — два последних наблюдения.

Модель AR(p) можно представить в виде:

  • y(t) является переменной в момент времениt.
  • c — постоянный термин.
  • φ — коэффициенты авторегрессии, подогнанные к лагам.
  • ε_t – это погрешность, отражающая случайные колебания или необъяснимую изменчивость.

Каждое наблюдение в серии, кроме начального, относится к предыдущему наблюдению. Эта рекурсивная связь распространяется на начало ряда, порождая так называемые модели долгой памяти.

Выбор заказа

Выбор порядка является важным шагом в построении модели AR, поскольку он определяет количество запаздывающих значений для включения в модель, тем самым фиксируя соответствующие зависимости в данных временных рядов.

Основная цель выбора порядка — найти баланс между сложностью модели и ее точностью. Модель с несколькими запаздывающими наблюдениями может не уловить важные закономерности в данных, что приведет к недообучению. С другой стороны, модель со слишком большим количеством запаздывающих наблюдений может страдать от переобучения, что приводит к плохому обобщению невидимых данных.

Существует несколько часто используемых методов определения соответствующего порядка (p) для модели дополненной реальности.

Автокорреляция (ACF — PACF)

Автокорреляционные функции — это статистические инструменты для измерения и определения структуры корреляции в наборе данных временного ряда.

Функция автокорреляции (ACF) измеряет корреляцию между наблюдением и его запаздывающими значениями. Это помогает понять, как связаны наблюдения с разной задержкой.

Функция частичной автокорреляции (PACF) устраняет влияние промежуточных задержек. Он измеряет прямую корреляцию между двумя наблюдениями.

Предположим, мы наблюдаем положительную корреляцию с отставанием в один день. Это указывает на то, что существует некоторая корреляция между ценой текущего дня и ценой предыдущего дня. Это предполагает, что цена имеет тенденцию проявлять определенную степень постоянства от одного дня к другому.

Например, репутация компании повышается, по мере повышения ее репутации все больше и больше людей покупают акции этой компании. Цена среды коррелирует с ценой вторника, которая коррелирует с ценой понедельника. По мере увеличения отставания корреляция может уменьшаться.

В случае PACF нет никакого влияния на промежутки между днями. Например, предположим, что магазин мороженого проводит кампанию по понедельникам и выдает бесплатные купоны на мороженое, действительные по средам, всем, кто покупает мороженое в этот день. В этом случае будет прямая зависимость между продажами в понедельник и среду. Впрочем, распродажи во вторник никак не влияют на эту ситуацию.

Мы можем использовать библиотеку statsmodels для построения графиков ACF и PACF в Python.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Generate a random time series data
np.random.seed(123)
n_samples = 100
time = pd.date_range('2023-01-01', periods=n_samples, freq='D')
data = np.random.normal(0, 1, n_samples).cumsum()

# Create a DataFrame with the time series data
df = pd.DataFrame({'Time': time, 'Data': data})
df.set_index('Time', inplace=True)

# Plot the time series data
plt.figure(figsize=(10, 4))
plt.plot(df.index, df['Data'])
plt.xlabel('Time')
plt.ylabel('Data')
plt.title('Example Time Series Data')
plt.show()

from statsmodels.graphics.tsaplots import plot_acf

# ACF plot
plot_acf(df['Data'], lags=20, zero=False)
plt.xlabel('Lags')
plt.ylabel('ACF')
plt.title('Autocorrelation Function (ACF)')

Метод plot_acf принимает несколько параметров:

  • x — это массив данных временных рядов.
  • lags указывает задержки для расчета автокорреляции.
  • alpha — уровень достоверности, значение по умолчанию — 0,05, что соответствует уровню достоверности 95 %. Это означает, что доверительные интервалы на графике АКФ представляют собой диапазон, в пределах которого мы ожидаем, что истинные коэффициенты автокорреляции населения попадают с вероятностью 95%.

На графике ACF доверительные интервалы обычно отображаются в виде заштрихованных областей, часто светло-голубого цвета. Эти интервалы указывают диапазон значений, которые можно было бы ожидать для автокорреляций, вычисленных из большого количества случайных выборок из процесса белого шума (где автокорреляция отсутствует). Это означает, что эти интервалы представляют собой диапазон значений, которые мы ожидаем увидеть, если бы нам пришлось многократно генерировать случайные данные, которые не коррелируют.

Корреляция считается статистически значимой, если она выходит за пределы доверительного интервала, что указывает на то, что она вряд ли возникла случайно. Однако корреляция в пределах доверительного интервала не обязательно означает отсутствие корреляции, это просто означает, что наблюдаемая корреляция находится в диапазоне того, что мы ожидаем от процесса белого шума.

  • use_vlines указывает, строят ли вертикальные линии на каждой задержке, чтобы указать доверительные интервалы.
  • vlines_kwargs используется для определения дополнительных параметров внешнего вида.
from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(df['Data'], lags=20, zero=False)
plt.xlabel('Lags')
plt.ylabel('PACF')
plt.title('Partial Autocorrelation Function (PACF)')

plot_pacf принимает те же аргументы в качестве параметров, и, кроме того, мы можем выбрать, какой метод использовать:

  • «ywm» или «ywmle»: метод Юла-Уокера без корректировки. Это вариант по умолчанию.
  • «yw» или «ywadjusted»: метод Юла-Уокера с корректировкой размера выборки в знаменателе для оценки автоковариации.
  • «ols»: регрессия временного ряда по методу наименьших квадратов с собственными запаздывающими значениями и постоянным членом.
  • «ols-inefficient»: МНК-регрессия временного ряда по его запаздывающим значениям с использованием одной общей выборки для оценки всех коэффициентов частичной автокорреляции.
  • «ols-adjusted»: МНК-регрессия временного ряда по его запаздывающим значениям с корректировкой смещения.
  • «ld» или «ldadjusted»: метод рекурсии Левинсона-Дарбина с коррекцией смещения.
  • «ldb» или «ldbiased»: метод рекурсии Левинсона-Дарбина без коррекции смещения.

При оценке графиков ACF и PACF в первую очередь ищите коэффициенты корреляции, которые значительно отклоняются от нуля.

Затем обратите внимание на характер затухания на графике ACF. По мере увеличения задержки значения корреляции обычно должны уменьшаться и приближаться к нулю. Медленное затухание предполагает постоянную корреляцию, а быстрое затухание указывает на отсутствие долгосрочной зависимости. На графике PACF наблюдайте, падает ли корреляция после определенного лага. Внезапное отсечение предполагает, что прямая связь существует только до этого лага.

Информационные критерии

Информационные критерии, такие как информационный критерий Акаике (AIC) или байесовский информационный критерий (BIC), являются статистическими мерами, которые уравновешивают соответствие модели и ее сложность. Эти критерии обеспечивают количественную меру для сравнения различных моделей с различными порядками. Модель с наименьшим значением AIC или BIC часто считается наиболее подходящей моделью.

Информационный критерий Акаике (AIC) учитывает, насколько хорошо модель соответствует данным и насколько сложна модель. Он наказывает сложные модели, чтобы избежать переобучения, включая член, который увеличивается с количеством параметров. Он стремится найти модель, которая хорошо соответствует данным, но является максимально простой. Чем ниже значение AIC, тем лучше модель. Он имеет тенденцию отдавать предпочтение моделям с лучшим соответствием, даже если они относительно более сложны.

Байесовский информационный критерий (BIC) налагает более сильное ограничение на сложность модели. Он включает член, который растет с увеличением количества параметров в модели, что приводит к более значительному штрафу для сложных моделей. Он строго наказывает большую сложность, отдавая предпочтение более простым моделям. Это согласуется даже с меньшим размером выборки и предпочтительнее, когда размер выборки ограничен. Опять же, чем ниже значение BIC, тем лучше модель.

Теперь давайте на этот раз сгенерируем более сложные данные и рассчитаем AIC и BIC:

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg

# Generate complex time series data
np.random.seed(123)
n = 500  # Number of data points
epsilon = np.random.normal(size=n)
data = np.zeros(n)

for i in range(2, n):
    data[i] = 0.7 * data[i-1] - 0.2 * data[i-2] + epsilon[i]

# Plot the time series data
plt.figure(figsize=(10, 4))
plt.plot(data)
plt.xlabel('Time')
plt.ylabel('Data')
plt.title('Time Series Data')
plt.show()

# Fit AutoReg models with different orders and compare AIC and BIC
max_order = 10
aic_values = []
bic_values = []

for p in range(1, max_order + 1):
    model = AutoReg(data, lags=p)
    result = model.fit()
    aic_values.append(result.aic)
    bic_values.append(result.bic)

# Plot AIC and BIC values
order = range(1, max_order + 1)
plt.plot(order, aic_values, marker='o', label='AIC')
plt.plot(order, bic_values, marker='o', label='BIC')
plt.xlabel('Order (p)')
plt.ylabel('Information Criterion Value')
plt.title('Comparison of AIC and BIC')
plt.legend()
plt.show()

Класс AutoReg используется для соответствия моделям авторегрессии. Он принимает несколько параметров:

  • endog — зависимая переменная.
  • Параметр lags определяет порядок задержки. Это может быть целое число, представляющее одно значение задержки, или список/массив значений задержки.
  • trend определяет компонент тренда, включенный в модель. Он может принимать следующие значения:

«c»: добавляет постоянное значение к уравнению модели, допуская ненулевое среднее значение. Предполагается, что тренд представляет собой горизонтальную линию.

‘nc’: нет постоянного члена. Он исключает константу из уравнения модели, предполагая, что ряд имеет среднее значение, равное нулю. Ожидается, что тренд будет колебаться вокруг нуля без систематического восходящего или нисходящего движения.

‘t’: линейный тренд. Модель предполагает, что тренд идет по прямой линии вверх или вниз.

‘ct’: сочетает постоянные и линейные тренды.

  • seasonal указывает, должна ли модель включать сезонный компонент.
  • exog — это экзогенные или внешние переменные, которые мы хотим включить в модель.
  • hold_back указывает количество начальных наблюдений, которые необходимо исключить из процесса подбора.
  • period используется, когда seasonal=True и представляет продолжительность сезонного цикла. Это целое число, указывающее количество наблюдений за сезон.

model.fit() возвращает объект AutoRegResults, и мы можем получить AIC и BIC из связанных атрибутов.

Поскольку мы намеренно генерировали более сложные данные, ожидается, что BIC будет больше отдавать предпочтение более простым моделям, чем AIC. Поэтому BIC выбрал модель более низкого порядка (более простую) по сравнению с AIC, что указывает на предпочтение простоты при сохранении разумного соответствия данным.

Тест Юнга-Бокса

Тест Льюнга-Бокса — это статистический тест, используемый для определения наличия значительной автокорреляции во временном ряду.

Тест подгоняет авторегрессионную модель к данным. Остатки этой модели фиксируют необъяснимые или остаточные изменения в данных. Затем рассчитывается статистика Ljung-Box для различных лагов. Они количественно определяют величину остаточной автокорреляции.

Чтобы определить, является ли автокорреляция статистически значимой, статистика Льюнга-Бокса сравнивается с критическими значениями распределения хи-квадрат. Эти критические значения зависят от выбранного нами уровня значимости. Если статистика выше критического значения, это предполагает наличие значительной автокорреляции, указывающей на то, что модель не уловила все зависимости в данных. С другой стороны, если статистика ниже критического значения, это означает, что автокорреляция в остатках незначительна, что указывает на хорошее соответствие авторегрессионной модели.

Изучив результаты теста Льюнга-Бокса для различных задержек, мы можем определить соответствующий порядок (p). Лаговый порядок без значительной автокорреляции в остатках считается подходящим для модели.

import numpy as np
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.stats.diagnostic import acorr_ljungbox

max_order = 10
p_values = []

for p in range(1, max_order + 1):
    model = AutoReg(data, lags=p)
    result = model.fit()
    residuals = result.resid

    result = acorr_ljungbox(residuals, lags=[p])
    p_value = result.iloc[0,1]
    p_values.append(p_value)
    
# Find the lag order with non-significant autocorrelation
threshold = 0.05
selected_order = np.argmax(np.array(p_values) < threshold) + 1
print("P Values: ", p_values)
print("Selected Order (p):", selected_order)

"""
P Values:  [0.0059441704188493635, 0.8000450392943186, 0.9938379305765744, 0.9928852354721004, 0.8439698152504373, 0.9979352709556297, 0.998574234602306, 0.9999969308975543, 0.9999991895465976, 0.9999997412756536]
Selected Order (p): 1
"""

Перекрестная проверка

Перекрестная проверка — еще один метод определения соответствующего порядка (p). Во-первых, мы делим данные нашего временного ряда на несколько сгибов или сегментов. Обычный выбор — использовать подход скользящего окна, когда мы перемещаем окно фиксированного размера по данным.

Для каждой складки мы подбираем модель AR с определенным порядком задержки (p), используя обучающую часть данных. Затем мы используем подобранную модель для прогнозирования значений тестовой части данных.

Затем мы рассчитываем показатель оценки (например, среднеквадратичную ошибку, среднюю абсолютную ошибку) и вычисляем среднюю производительность для каждой складки.

Наконец, мы выбираем лаговый порядок (p), который дает наилучшую среднюю производительность по сгибам.

import numpy as np
from statsmodels.tsa.ar_model import AutoReg
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import TimeSeriesSplit

np.random.seed(123)
data = np.random.normal(size=100)

max_order = 9
best_order = None
best_mse = np.inf

tscv = TimeSeriesSplit(n_splits=5)  
for p in range(1, max_order + 1):
    mse_scores = []
    
    for train_index, test_index in tscv.split(data):
        train_data, test_data = data[train_index], data[test_index]
        
        model = AutoReg(train_data, lags=p)
        result = model.fit()
        predictions = result.predict(start=len(train_data), end=len(train_data) + len(test_data) - 1)
        
        mse = mean_squared_error(test_data, predictions)
        mse_scores.append(mse)
    
    avg_mse = np.mean(mse_scores)

    if avg_mse < best_mse:
        best_mse = avg_mse
        best_order = p

print("Best Lag Order (p):", best_order)

"""
Best Lag Order (p): 3
"""

Прогнозирование

В этом примере мы рассмотрим набор данных о ценах на акции. В частности, мы сосредоточимся на самом последнем 40-дневном периоде и проанализируем цены акций компании AMD.

Нам понадобятся эти пакеты.

import datetime
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import TimeSeriesSplit
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox

Мы можем использовать библиотеку yfinance на Python для доступа к историческим данным по акциям из Yahoo Finance.

ticker = "AMD"
end_date = datetime.datetime.now().date()
start_date = end_date - datetime.timedelta(days=60)
data = yf.download(ticker, start=start_date, end=end_date)
closing_prices = data["Close"]
print(len(closing_prices))

"""
[*********************100%***********************]  1 of 1 completed
42
"""
plt.figure(figsize=(10, 6))
plt.plot(closing_prices)
plt.title("AMD Stock Closing Prices (Last 42 Days)")
plt.xlabel("Date")
plt.ylabel("Closing Price")
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

Мы разделим набор данных, назначив самую последнюю запись тестовыми данными, а остальные записи будем использовать для обучения. Наша цель — построить модели, которые могут предсказать цену текущего дня. Мы оценим и сравним производительность этих моделей на основе их прогнозов.

n_test = 1
train_data = closing_prices[:len(closing_prices)-n_test]
test_data = closing_prices[len(closing_prices)-n_test:]
print(test_data)

"""
Date
2023-06-14    127.330002
Name: Close, dtype: float64
"""

Теперь мы приступим к обучению авторегрессионных (AR) моделей с запаздыванием от 1 до 10. Мы будем использовать эти модели для прогнозирования последней цены в наборе данных и расчета ошибки для каждой модели.

error_list = []
for i in range(1,11):
    model = AutoReg(train_data, lags=i)
    model_fit = model.fit()
    predicted_price = float(model_fit.predict(start=len(train_data), end=len(train_data)))
    actual_price = test_data.iloc[0]
    error_list.append(abs(actual_price - predicted_price))
plt.figure(figsize=(10, 6))
plt.plot(error_list)
plt.title("Errors (Actual - Predicted)")
plt.xlabel("p")
plt.ylabel("Error")
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

Заключение

Мы изучили концепцию авторегрессионных (AR) моделей в анализе временных рядов и прогнозировании. Модели AR обеспечивают основу (отправную точку) для прогнозирования будущих значений на основе прошлых наблюдений.

Выбор порядка (p) является важным шагом в моделировании AR, поскольку он определяет количество запаздывающих наблюдений для включения в модель. Мы рассмотрели наиболее распространенные методы выбора ордеров; визуальный контроль с использованием графиков ACF и PACF, информационных критериев, теста Льюнга-Бокса и перекрестной проверки.

Модели AR предлагают ценную информацию о динамике и закономерностях данных временных рядов, что делает их бесценными в различных областях, таких как финансы, экономика и прогнозирование погоды. Используя возможности моделей дополненной реальности, мы можем получить более глубокое понимание, делать точные прогнозы и принимать обоснованные решения на основе исторических закономерностей и тенденций.

Читать далее











Источники

https://www.statsmodels.org/dev/generated/statsmodels.tsa.ar_model.AutoReg.html#statsmodels.tsa.ar_model.AutoReg

https://www.statsmodels.org/dev/generated/statsmodels.tsa.ar_model.AutoReg.fit.html#statsmodels.tsa.ar_model.AutoReg.fit

https://www.statsmodels.org/dev/generated/statsmodels.tsa.ar_model.AutoRegResults.html#statsmodels.tsa.ar_model.AutoRegResults

https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.acorr_ljungbox.html

https://www.statology.org/ljung-box-test-python/

https://www.researchgate.net/publication/337963027_Selecting_optimal_lag_order_in_Ljung-Box_test

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .