Skip to content

ARIMA (Autoregressive Integrated Moving Average)

ARIMA (Autoregressive Integrated Moving Average) — это классическая статистическая модель для анализа и прогнозирования временных рядов, которая сочетает в себе три компонента: авторегрессию (AR), интегрирование (I) и скользящее среднее (MA). Модель также известна как методология Бокса — Дженкинса.

Подробное описание

Постановка задачи

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

Входные и выходные данные

Входные данные:

  • Унивариантный временной ряд
  • Параметры модели (p, d, q):
  • p — порядок авторегрессионной части (AR)
  • d — порядок дифференцирования (I)
  • q — порядок скользящего среднего (MA)

Выходные данные:

  • Обученная модель с оценёнными коэффициентами
  • Прогноз на заданное количество шагов вперёд с доверительными интервалами

Ключевая идея

Основная идея ARIMA заключается в том, что нестационарный временной ряд можно привести к стационарному виду путём последовательного дифференцирования (взятия разностей). После этого к стационарному ряду применяется модель ARMA, сочетающая авторегрессию (зависимость от прошлых значений) и скользящее среднее (зависимость от прошлых ошибок прогноза).

Исторический контекст

Методология ARIMA была разработана Джорджем Боксом и Гвилимом Дженкинсом в 1970-х годах, поэтому модель часто называют моделью Бокса — Дженкинса. С тех пор ARIMA остаётся одной из наиболее популярных моделей для прогнозирования временных рядов благодаря своей интерпретируемости и эффективности.

Принципы работы

Математическая формулировка

Модель ARIMA(p,d,q) задаётся уравнением:

\[ \Delta^d X_t = c + \sum_{i=1}^{p} a_i \Delta^d X_{t-i} + \sum_{j=1}^{q} b_j \varepsilon_{t-j} + \varepsilon_t \]

Где:

  • \(\Delta^d X_t\) — ряд, продифференцированный \(d\) раз
  • \(c\) — константа (свободный член)
  • \(a_i\) — коэффициенты авторегрессии (AR)
  • \(b_j\) — коэффициенты скользящего среднего (MA)
  • \(\varepsilon_t\) — белый шум (ошибка прогноза) с нулевым математическим ожиданием и постоянной дисперсией

В операторной форме с использованием лагового оператора \(L\) (\(L X_t = X_{t-1}\)):

\[ a(L)(1-L)^d X_t = c + b(L)\varepsilon_t \]

где:

  • \(a(L) = 1 - \sum_{i=1}^{p} a_i L^i\) — полином авторегрессии
  • \(b(L) = 1 + \sum_{j=1}^{q} b_j L^j\) — полином скользящего среднего

Частные случаи:

Модель Параметры Описание
Белый шум ARIMA(0,0,0) \(X_t = \varepsilon_t\)
Случайное блуждание ARIMA(0,1,0) \(X_t = X_{t-1} + \varepsilon_t\)
Случайное блуждание с дрейфом ARIMA(0,1,0) с константой \(X_t = X_{t-1} + c + \varepsilon_t\)
Чистая авторегрессия ARIMA(p,0,0) Только AR-компонент
Чистое скользящее среднее ARIMA(0,0,q) Только MA-компонент

Основные этапы построения модели

  1. Проверка стационарности — визуальный анализ графика ряда и использование статистических тестов (например, тест Дики — Фуллера).

  2. Дифференцирование — если ряд нестационарен, применяется дифференцирование порядка \(d\) для устранения тренда.

  3. Идентификация порядка модели — выбор значений \(p\) и \(q\) на основе анализа автокорреляционной функции (ACF) и частной автокорреляционной функции (PACF):

Форма ACF Рекомендуемая модель
Экспоненциальное затухание AR-модель
Резкий обрыв после нескольких лагов MA-модель
Затухание после нескольких лагов ARMA/ARIMA
  1. Оценка параметров — коэффициенты модели оцениваются методом максимального правдоподобия (MLE) или методом условной суммы квадратов (CSS).

  2. Диагностика остатков — проверка того, что остатки модели являются белым шумом (некоррелированы).

  3. Прогнозирование — построение прогноза на основе обученной модели.

Пример реализации на Python

Ниже представлена реализация ARIMA с использованием библиотек statsmodels и pmdarima (для автоматического подбора параметров).

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import pmdarima as pm
import warnings
warnings.filterwarnings('ignore')

# 1. Генерация синтетических данных: тренд + шум
np.random.seed(42)
n = 200
time = np.arange(n)
# Нестационарный ряд с линейным трендом
data = 2 + 0.3 * time + np.random.normal(0, 5, size=n)

# Создание DataFrame
df = pd.DataFrame({
    'time': time,
    'value': data
})

# 2. Визуализация исходного ряда
plt.figure(figsize=(12, 8))

plt.subplot(2, 2, 1)
plt.plot(df['time'], df['value'])
plt.title('Исходный временной ряд (нестационарный)')
plt.xlabel('Время')
plt.ylabel('Значение')
plt.grid(True)

# 3. Проверка стационарности (тест Дики-Фуллера)
def check_stationarity(series, signif=0.05):
    result = adfuller(series, autolag='AIC')
    print(f'ADF-статистика: {result[0]:.4f}')
    print(f'p-значение: {result[1]:.4f}')
    print(f'Критическое значение (1%): {result[4]["1%"]:.4f}')
    print(f'Ряд {"стационарен" if result[1] < signif else "НЕ стационарен"}')
    return result[1] < signif

print('=== Проверка исходного ряда ===')
is_stationary = check_stationarity(df['value'])

# 4. Дифференцирование
df['diff1'] = df['value'].diff()  # первая разность

print('\n=== Проверка после дифференцирования ===')
is_stationary_diff = check_stationarity(df['diff1'].dropna())

# 5. Автокорреляционный анализ для выбора порядка модели
plt.subplot(2, 2, 2)
plot_acf(df['diff1'].dropna(), ax=plt.gca(), lags=20)
plt.title('ACF после дифференцирования')

plt.subplot(2, 2, 3)
plot_pacf(df['diff1'].dropna(), ax=plt.gca(), lags=20)
plt.title('PACF после дифференцирования')

# 6. Построение модели ARIMA
# Вариант А: Ручное задание параметров
print('\n=== Модель ARIMA(1,1,1) ===')
model_manual = ARIMA(df['value'], order=(1, 1, 1))
result_manual = model_manual.fit()
print(result_manual.summary())

# Вариант Б: Автоматический подбор параметров (auto_arima)
print('\n=== Автоматический подбор параметров ===')
model_auto = pm.auto_arima(
    df['value'],
    start_p=0, max_p=5,
    start_q=0, max_q=5,
    d=None,  # auto_arima определит d автоматически
    seasonal=False,
    trace=True,
    error_action='ignore',
    suppress_warnings=True,
    stepwise=True,
    information_criterion='aic'
)

print(f'\nВыбранные параметры: p={model_auto.order[0]}, '
      f'd={model_auto.order[1]}, q={model_auto.order[2]}')

# 7. Прогнозирование
forecast_steps = 30

# Прогноз для ручной модели
forecast_manual = result_manual.get_forecast(steps=forecast_steps)
forecast_values_manual = forecast_manual.predicted_mean
conf_int_manual = forecast_manual.conf_int()

# Прогноз для автоматической модели
forecast_auto = model_auto.predict(n_periods=forecast_steps)

# 8. Визуализация результатов
plt.subplot(2, 2, 4)
plt.plot(df['time'], df['value'], label='Исходные данные', color='blue')

# Прогноз ручной модели
forecast_idx = np.arange(n, n + forecast_steps)
plt.plot(forecast_idx, forecast_values_manual,
         label='Прогноз ARIMA(1,1,1)', color='orange')
plt.fill_between(forecast_idx,
                 conf_int_manual.iloc[:, 0],
                 conf_int_manual.iloc[:, 1],
                 color='orange', alpha=0.2,
                 label='Доверительный интервал 95%')

# Прогноз автоматической модели
plt.plot(forecast_idx, forecast_auto,
         label='Прогноз Auto-ARIMA', color='green', linestyle='--')

plt.title('Прогнозирование временного ряда с помощью ARIMA')
plt.xlabel('Время')
plt.ylabel('Значение')
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

# 9. Анализ качества модели
print('\n=== Анализ качества модели ARIMA(1,1,1) ===')
print(f'AIC: {result_manual.aic:.2f}')
print(f'BIC: {result_manual.bic:.2f}')
print(f'Log-Likelihood: {result_manual.llf:.2f}')
print(f'Дисперсия ошибки: {result_manual.sigma2:.4f}')

Достоинства и недостатки

Достоинства:

  1. Интерпретируемость — параметры модели имеют чёткий статистический смысл (AR — влияние прошлых значений, MA — влияние прошлых ошибок, I — учёт тренда).
  2. Высокая точность для многих задач — ARIMA часто показывает результаты, сравнимые или превосходящие сложные модели машинного обучения, особенно при ограниченном объёме данных.
  3. Простота реализации — модель доступна во всех основных статистических пакетах (statsmodels в Python, forecast в R).
  4. Низкая вычислительная сложность — обучение ARIMA значительно быстрее, чем у нейросетей (LSTM, CNN), что важно для задач, требующих частого переобучения.
  5. Надёжность — модель устойчива к переобучению, в отличие от сложных нейросетевых архитектур.

Недостатки:

  1. Трудоёмкость выбора параметров — правильный выбор значений p, d, q критически важен и может требовать значительного опыта. Для автоматического подбора используются дополнительные методы (например, auto_arima в R и Python), но они не всегда дают оптимальный результат.
  2. Требование к объёму данных — для надёжной оценки коэффициентов требуется достаточно длинный временной ряд (обычно не менее 50–100 наблюдений).
  3. Линейность модели — ARIMA предполагает линейную зависимость в данных и плохо справляется с нелинейными паттернами, где нейросетевые модели могут быть эффективнее.
  4. Чувствительность к выбросам — модель чувствительна к аномалиям в данных, которые могут существенно искажать оценки параметров.
  5. Ограниченность при наличии сезонности — базовая модель ARIMA не учитывает сезонность; требуется расширение до SARIMA.

Области применения

  1. Экономика и финансы — прогнозирование курсов валют, цен акций, инфляции, ВВП, кредитного риска.
  2. Логистика и управление цепочками поставок — прогнозирование спроса на товары, оптимизация запасов (прогнозы продаж).
  3. Торговля и коммерция — анализ и прогнозирование продаж на маркетплейсах, динамическое ценообразование.
  4. Метеорология и климатология — прогнозирование температуры, осадков и других климатических переменных.
  5. Макроэкономическое прогнозирование — анализ и прогноз макроэкономических показателей для государственного планирования.
  6. Энергетика — прогнозирование потребления электроэнергии для планирования нагрузки на сети.