1. 시계열 분석이란?
시계열 분석(Time Series Analysis)은 일정한 시간 간격으로 수집된 데이터를 분석하여 미래의 패턴을 예측하는 기법입니다. 주식 시장, 경제 데이터, 기후 변화, 수요 예측 등 다양한 분야에서 활용됩니다.
시계열 데이터는 일반적인 데이터 분석과 달리 시간 의존성(Temporal Dependency)과 자기 상관(Autocorrelation)을 고려해야 합니다.
2. 시계열 데이터의 주요 특징
- 추세(Trend): 데이터가 장기적으로 상승 또는 하락하는 경향
- 계절성(Seasonality): 일정 주기마다 반복되는 패턴
- 주기성(Cyclicality): 계절성과 비슷하지만 일정한 주기가 아닌 장기적인 변동
- 불규칙성(Irregularity): 예측할 수 없는 변동성
3. 시계열 분석 기법
(1) 이동평균법 (Moving Average)
이동평균법은 일정 기간 동안의 평균을 계산하여 데이터를 부드럽게 만드는 방법입니다.
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 로드
data = pd.read_csv("stock_prices.csv", parse_dates=["Date"], index_col="Date")
# 이동평균 계산 (30일)
data["SMA_30"] = data["Close"].rolling(window=30).mean()
# 시각화
plt.figure(figsize=(12,6))
plt.plot(data["Close"], label="Stock Price")
plt.plot(data["SMA_30"], label="30-day SMA", linestyle="dashed", color="red")
plt.legend()
plt.show()
(2) 자기 상관 함수 (ACF) & 부분 자기 상관 함수 (PACF)
자기 상관 함수(ACF)와 부분 자기 상관 함수(PACF)는 시계열 데이터의 의존성을 분석하는 데 사용됩니다.
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# ACF & PACF 플롯
plot_acf(data["Close"].dropna(), lags=30)
plot_pacf(data["Close"].dropna(), lags=30)
plt.show()
(3) 분해법 (Decomposition)
시계열 데이터를 추세(Trend), 계절성(Seasonality), 불규칙성(Residual)으로 분해하여 분석할 수 있습니다.
from statsmodels.tsa.seasonal import seasonal_decompose
# 시계열 분해
result = seasonal_decompose(data["Close"], model="additive", period=30)
# 시각화
result.plot()
plt.show()
4. 시계열 모델링
(1) ARIMA 모델 (AutoRegressive Integrated Moving Average)
ARIMA 모델은 자기회귀(AR), 차분(I), 이동평균(MA) 요소를 결합한 강력한 시계열 예측 모델입니다.
ARIMA 모델 구성 요소
- AR (AutoRegressive): 과거 값이 현재 값에 영향을 미치는 자기 회귀 요소
- I (Integrated): 데이터의 안정성을 위해 차분을 적용하는 과정
- MA (Moving Average): 과거 예측 오차를 고려하여 현재 값을 조정하는 요소
Python을 활용한 ARIMA 모델 예측
from statsmodels.tsa.arima.model import ARIMA
# 모델 학습
model = ARIMA(data["Close"], order=(2,1,2))
model_fit = model.fit()
# 예측 수행
forecast = model_fit.forecast(steps=30)
# 시각화
plt.figure(figsize=(12,6))
plt.plot(data["Close"], label="Actual")
plt.plot(forecast, label="Forecast", linestyle="dashed", color="red")
plt.legend()
plt.show()
(2) SARIMA 모델 (Seasonal ARIMA)
SARIMA 모델은 ARIMA 모델에 계절성을 반영한 확장 모델입니다.
from statsmodels.tsa.statespace.sarimax import SARIMAX
# SARIMA 모델 학습
sarima_model = SARIMAX(data["Close"], order=(2,1,2), seasonal_order=(1,1,1,12))
sarima_fit = sarima_model.fit()
# 예측 수행
sarima_forecast = sarima_fit.forecast(steps=30)
# 시각화
plt.figure(figsize=(12,6))
plt.plot(data["Close"], label="Actual")
plt.plot(sarima_forecast, label="SARIMA Forecast", linestyle="dashed", color="red")
plt.legend()
plt.show()
(3) LSTM (Long Short-Term Memory) 모델
딥러닝을 활용한 LSTM 모델은 장기 의존성을 고려하여 시계열 데이터를 예측하는 데 강력한 성능을 보입니다.
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 데이터 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data["Close"].values.reshape(-1,1))
# 데이터 준비
X, y = [], []
for i in range(60, len(data_scaled)):
X.append(data_scaled[i-60:i, 0])
y.append(data_scaled[i, 0])
X, y = np.array(X), np.array(y)
# LSTM 모델 구축
model = Sequential([
LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)),
LSTM(units=50),
Dense(units=1)
])
# 모델 컴파일 및 학습
model.compile(optimizer="adam", loss="mean_squared_error")
model.fit(X, y, epochs=20, batch_size=32)
# 예측 수행
predicted_price = model.predict(X)
predicted_price = scaler.inverse_transform(predicted_price)
# 시각화
plt.figure(figsize=(12,6))
plt.plot(data["Close"].values, label="Actual Price")
plt.plot(np.arange(60, len(predicted_price)+60), predicted_price, label="LSTM Prediction", linestyle="dashed", color="red")
plt.legend()
plt.show()
5. 결론: 어떤 시계열 모델을 선택해야 할까?
시계열 데이터 분석 및 예측은 다양한 모델을 적용하여 최적의 결과를 도출하는 것이 중요합니다.
모델 비교
모델 | 특징 | 적용 사례 |
---|---|---|
이동평균 (Moving Average) | 단순한 평균 기반 분석 | 단기적인 변동성 제거 |
ARIMA | 과거 값과 예측 오차를 활용한 모델 | 비계절성 데이터 예측 |
SARIMA | ARIMA에 계절성을 반영 | 계절성이 있는 금융 데이터 |
LSTM | 딥러닝 기반으로 복잡한 패턴 학습 | 장기 예측이 필요한 데이터 |
각 모델의 장단점을 고려하여, 시계열 데이터 특성에 맞는 모델을 선택하는 것이 중요합니다.