시계열 \( y_t, y_{t-1}, \ldots, y_1 \)이 주어졌을 때, \( y_{t+1} \)의 예측치를 \( y_{t+1|t} \)로 표기합니다.
Random walk의 경우:
$$ y_{t+1} = y_t + \varepsilon_{t+1} \Rightarrow y_{t+1|t} = y_t $$
즉, 예측에 오직 \( y_t \)만을 사용하며 나머지 과거 관측치는 사용하지 않습니다.
반면, 평균 모형에서는:
$$ y_{t+1} = \mu + \varepsilon_t \Rightarrow y_{t+1|t} = \frac{1}{t} \sum_{i=1}^t y_i $$
즉, 전체 과거 데이터를 동일한 가중치로 평균하여 예측합니다.
Exponential Smoothing은 과거로 갈수록 가중치가 지수적으로 감소하는 방식의 평균으로 예측합니다:
$$ y_{t+1} = \alpha y_t + \alpha(1-\alpha)y_{t-1} + \alpha(1-\alpha)^2 y_{t-2} + \ldots + \alpha(1-\alpha)^t y_0 $$
여기서 \( 0 < \alpha < 1 \), \( \alpha \)는 초매개변수 (hyperparameter)로 예측 성능(MSE 등)을 기준으로 튜닝됩니다.
교과서에서는 다음 재귀식으로도 표현됩니다:
$$ l_t = \alpha y_t + (1-\alpha) l_{t-1} $$
이를 반복적으로 전개하면 결국:
$$ l_t = \alpha y_t + \alpha(1-\alpha)y_{t-1} + \alpha(1-\alpha)^2 y_{t-2} + \ldots + \alpha(1-\alpha)^t l_0 $$
\( l_0 = y_0 \)로 두면 기존의 지수평활 수식과 동일하게 됩니다. 예측값은 다음과 같이 정의됩니다:
$$ y_{t+1|t} = l_t $$
따라서, 최근 값일수록 더 큰 영향을 주는 평균을 이용해 다음 시점을 예측하는 방식이며, 추세나 계절성이 없는 시계열에 적합합니다.
import ccxt import pandas as pd from statsmodels.tsa.holtwinters import SimpleExpSmoothing exchange = ccxt.mexc() symbol = 'BTC/USDT' timeframe = '1h' ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=200) # OHLCV to DataFrame df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms') close_prices = df['close'] model = SimpleExpSmoothing(close_prices) fit_model = model.fit(smoothing_level=0.3, optimized=False) forecast = fit_model.forecast(1) print(f"\U0001F4C8 최근 가격: {close_prices.iloc[-1]}") print(f"\U0001F52E 예측된 다음 가격: {forecast.iloc[0]}")
→ \( \alpha = 0.3 \)으로 설정한 단순 지수평활법 모델을 통해, 최근 비트코인 가격 기반 예측을 수행합니다.