ARMA 모델과 Box-Jenkins 시계열 예측 운영
ARMA 모델의 정상성·가역성 조건과 Box-Jenkins 방법론을 바탕으로 시계열 식별, 추정, 진단, 운영화 흐름을 설명한다.
2026-08-14 · 최초 발행 2024-04-29
AR과 MA가 만나는 지점
ARMA(Autoregressive Moving Average)는 시계열의 현재값을 과거 관측값과 과거 충격으로 함께 설명하는 모형이다. 자기회귀의 관성과 충격 이후 남는 효과를 한 프레임에 담기 때문에, 비계절·정상 시계열의 단기 변화를 다룰 때 사용한다.
AR(p)는 현재값을 p 시차의 자기회귀 항으로 표현한다.
Xt = c + Σ(φ_i X{t-i}) + ε_t
MA(q)는 현재값을 q 시차의 오차, 즉 충격의 선형결합으로 설명한다.
Xt = c + ε_t + Σ(θ_j ε{t-j})
ARMA(p, q)는 두 구조를 결합한 혼합 모델이다. 여기서 혼합은 통계학의 혼합효과모델(mixed-effects model)을 뜻하지 않는다. AR이 나타내는 내생적 관성과 MA가 포착하는 충격의 잔향을 함께 모델링한다는 의미다. AR 부분의 정상성과 MA 부분의 가역성 조건 아래에서 MLE 기반 추정이 가능하다.
정상성 조건이 모델 선택을 가른다
정상성은 평균·분산·공분산이 시간에 따라 변하지 않는 성질이다. AR 부분에서는 근이 단위원 밖에 있어야 한다. 가역성 역시 MA 부분의 근이 단위원 밖에 위치해야 하며, 이는 식별의 안정성과 고유성을 확보하기 위한 조건이다.
비정상 시계열은 d차 차분으로 정상화할 수 있다. d=0이면 ARMA이고, d>0이면 ARIMA로 다룬다. 계절성이 확인되면 SARIMA 확장을 검토한다.
모형 후보를 정할 때는 ACF/PACF 패턴에서 p와 q 후보를 찾고, 비정상성이 있으면 차분·변환을 먼저 적용한다. 추정에는 최대우도추정(MLE) 또는 조건부 MLE를 사용하며, 수렴성과 초기값 민감도를 함께 살펴야 한다. AIC/AICc/BIC는 후보 모형을 고르는 기준이 된다.
식별부터 진단까지 반복하는 Box-Jenkins 흐름
Box-Jenkins 방법론은 단변량 시계열을 시간순으로 정렬하고 결측·이상치를 플래깅한 뒤, 식별·추정·진단·재식별을 반복해 예측과 운영으로 연결한다. 결과물은 선택된 ARMA(p, q) 사양, 예측값과 신뢰구간, 운영 메타데이터다.
진단에서는 잔차 백색성을 Ljung-Box로 확인하고, Q-Q plot을 통한 정규성 및 등분산성도 점검한다. 불필요한 파라미터의 신뢰구간과 유의성을 검토해 과대적합을 피한다.
정상성이 충족되지 않으면 차분·Box-Cox/로그 변환을 적용하고, 필요하면 ARIMA/SARIMA로 전환한다. 가역성 또는 수렴 문제가 생기면 파라미터 경계 제약, 초기값 재시도, 차수 축소를 검토한다. 잔차 상관이 계속되면 p 또는 q를 늘리거나 계절·외생변수(SARIMAX)를 도입하고, 구조적 변동 구간을 나누는 방법이 있다.
모형별로 달라지는 해석과 운용 부담
| 모델 | 성능(일반성) | 해석 용이성 | 안정성(추정 수렴) | 일관성(잔차 백색성) | 운영 편의 |
|---|---|---|---|---|---|
| AR(p) | 추세적 자기상관에 강함 | 계수-지연 해석 직관적 | 보통 | 데이터가 충격 주도 시 한계 | 단순 운용 용이 |
| MA(q) | 충격-잔향 포착에 강함 | 해석 비교적 단순 | 가역성 제약에 민감 | 자기상관 지배 시 한계 | 계수 수 적을 때 용이 |
| ARMA(p,q) | 폭넓은 패턴 커버 | 복합 구조로 다소 어려움 | 초기값/제약에 민감 | 적절 튜닝 시 우수 | 파이프라인화 권장 |
단기 예측과 모니터링에서의 사용
안정적 SKU의 주간 수요 예측에는 ARMA를 적용할 수 있다. 프로모션·휴일 영향이 낮은 품목에 적합하며, 롤링 재적합 주기 1~4주를 서비스 레벨 목표와 안전재고 산정에 활용한다.
네트워크나 시스템에서는 평균 지연시간의 단기 변동을 예측해 임계치 초과를 미리 경보할 수 있다. 예측 오차 분포를 바탕으로 동적 임계값을 두면 이상치 감지에 사용할 수 있다.
금융 단기 수익률에서는 로그수익률의 단기 자기상관과 미세구조 잡음을 포착한다. 변동성은 GARCH 계열과 결합하는 방식을 권장하며, 평균 방정식에는 ARMA를 두고 분산 방정식에는 GARCH를 둔다.
Python으로 수행하는 후보 탐색과 잔차 진단
이 예시는 Python 3.9+, statsmodels 0.13+, numpy, pandas, matplotlib, scipy를 전제로 한다. 비계절·정상 데이터를 ARMA로 가정하며, 비정상 시계열은 ARIMA(order=(p,d,q))에서 d>0을 적용한다.
# pip install numpy pandas matplotlib statsmodels scipy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import acf, pacf
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_process import ArmaProcess
np.random.seed(42)
# 1) 시뮬레이션: ARMA(2,1) 정상 시계열 생성
ar = np.array([1, -0.5, 0.25]) # 1 - 0.5L + 0.25L^2
ma = np.array([1, 0.4]) # 1 + 0.4L
arma_process = ArmaProcess(ar, ma)
y = arma_process.generate_sample(nsample=400)
ts = pd.Series(y, index=pd.date_range("2020-01-01", periods=400, freq="D"))
# 2) 정상성 검정
adf_stat, pval, *_ = adfuller(ts)
print(f"ADF p-value: {pval:.4f}") # p<0.05이면 정상성 가정 타당
# 3) 간단한 (p,q) 탐색: AIC 최소
candidates = [(p, q) for p in range(0, 4) for q in range(0, 4) if not (p==0 and q==0)]
results = []
for p, q in candidates:
try:
model = ARIMA(ts, order=(p, 0, q), trend="n")
fit = model.fit()
results.append(((p, q), fit.aic, fit))
except Exception as e:
# 가역성/수렴 실패 케이스 스킵
continue
best = sorted(results, key=lambda x: x[1])[0]
(p_best, q_best), aic_best, fit_best = best
print(f"Best order: ({p_best},{q_best}), AIC={aic_best:.2f}")
# 4) 진단: 잔차 백색성, 정규성 개략 확인
resid = fit_best.resid
lb = acorr_ljungbox(resid, lags=[12], return_df=True)
print(lb)
# 5) 예측
n_forecast = 14
fc = fit_best.get_forecast(steps=n_forecast)
fc_mean = fc.predicted_mean
fc_ci = fc.conf_int()
plt.figure(figsize=(10,4))
plt.plot(ts[-120:], label="observed")
plt.plot(fc_mean.index, fc_mean.values, label="forecast")
plt.fill_between(fc_ci.index, fc_ci.iloc[:,0], fc_ci.iloc[:,1], color="lightgray", alpha=0.6, label="95% CI")
plt.legend()
plt.title(f"ARMA({p_best},{q_best}) Forecast")
plt.tight_layout()
plt.show()
수렴 실패가 나면 초기값을 바꾸고, enforce_stationarity/enforce_invertibility 제약을 비활성화한 뒤 재시도하거나 차수를 축소한다. 일반화 성능은 시계열 CV(rolling-origin)로 확인하며, 기준선(naive, seasonal naive) 대비 상대개선 지표를 계산한다. 계절성이 있으면 SARIMA, 외생변수가 필요하면 SARIMAX, 다변량 상호작용이 있으면 VAR를 고려한다.
운영에 남는 판단 기준
단기 시계열에서는 naive 대비 MAPE 5~15% 개선을 기대할 수 있으며, 이는 데이터 도메인에 의존한다. 잔차 기반 품질 모니터링은 이상 조기 탐지율을 높이고 경보 오탐율을 낮추는 데 사용한다. 재고·용량 계획에서는 과투입·과소투입 리스크를 줄여 서비스 레벨을 안정화할 수 있다.
ARMA는 비계절·정상 시계열의 단기 동학을 간결하게 설명한다. 식별→추정→진단→운영의 폐루프를 갖추면 재현성과 안정성을 확보할 수 있다. 계절성·추세·외생효과가 있다면 ARIMA/SARIMA/SARIMAX 확장을 체계적으로 검토하고, 라이브러리 버전 변화와 추정 제약 옵션의 디폴트 값은 최신 정보를 확인한다.