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\) — ряд, продифференцированный \(d\) раз
- \(c\) — константа (свободный член)
- \(a_i\) — коэффициенты авторегрессии (AR)
- \(b_j\) — коэффициенты скользящего среднего (MA)
- \(\varepsilon_t\) — белый шум (ошибка прогноза) с нулевым математическим ожиданием и постоянной дисперсией
В операторной форме с использованием лагового оператора \(L\) (\(L X_t = X_{t-1}\)):
где:
- \(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-компонент |
Основные этапы построения модели
-
Проверка стационарности — визуальный анализ графика ряда и использование статистических тестов (например, тест Дики — Фуллера).
-
Дифференцирование — если ряд нестационарен, применяется дифференцирование порядка \(d\) для устранения тренда.
-
Идентификация порядка модели — выбор значений \(p\) и \(q\) на основе анализа автокорреляционной функции (ACF) и частной автокорреляционной функции (PACF):
| Форма ACF | Рекомендуемая модель |
|---|---|
| Экспоненциальное затухание | AR-модель |
| Резкий обрыв после нескольких лагов | MA-модель |
| Затухание после нескольких лагов | ARMA/ARIMA |
-
Оценка параметров — коэффициенты модели оцениваются методом максимального правдоподобия (MLE) или методом условной суммы квадратов (CSS).
-
Диагностика остатков — проверка того, что остатки модели являются белым шумом (некоррелированы).
-
Прогнозирование — построение прогноза на основе обученной модели.
Пример реализации на 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}')
Достоинства и недостатки
Достоинства:
- Интерпретируемость — параметры модели имеют чёткий статистический смысл (AR — влияние прошлых значений, MA — влияние прошлых ошибок, I — учёт тренда).
- Высокая точность для многих задач — ARIMA часто показывает результаты, сравнимые или превосходящие сложные модели машинного обучения, особенно при ограниченном объёме данных.
- Простота реализации — модель доступна во всех основных статистических пакетах (statsmodels в Python, forecast в R).
- Низкая вычислительная сложность — обучение ARIMA значительно быстрее, чем у нейросетей (LSTM, CNN), что важно для задач, требующих частого переобучения.
- Надёжность — модель устойчива к переобучению, в отличие от сложных нейросетевых архитектур.
Недостатки:
- Трудоёмкость выбора параметров — правильный выбор значений p, d, q критически важен и может требовать значительного опыта. Для автоматического подбора используются дополнительные методы (например, auto_arima в R и Python), но они не всегда дают оптимальный результат.
- Требование к объёму данных — для надёжной оценки коэффициентов требуется достаточно длинный временной ряд (обычно не менее 50–100 наблюдений).
- Линейность модели — ARIMA предполагает линейную зависимость в данных и плохо справляется с нелинейными паттернами, где нейросетевые модели могут быть эффективнее.
- Чувствительность к выбросам — модель чувствительна к аномалиям в данных, которые могут существенно искажать оценки параметров.
- Ограниченность при наличии сезонности — базовая модель ARIMA не учитывает сезонность; требуется расширение до SARIMA.
Области применения
- Экономика и финансы — прогнозирование курсов валют, цен акций, инфляции, ВВП, кредитного риска.
- Логистика и управление цепочками поставок — прогнозирование спроса на товары, оптимизация запасов (прогнозы продаж).
- Торговля и коммерция — анализ и прогнозирование продаж на маркетплейсах, динамическое ценообразование.
- Метеорология и климатология — прогнозирование температуры, осадков и других климатических переменных.
- Макроэкономическое прогнозирование — анализ и прогноз макроэкономических показателей для государственного планирования.
- Энергетика — прогнозирование потребления электроэнергии для планирования нагрузки на сети.