최근 몇 년 동안 비트코인은 급격한 가격 변동성을 보이며 많은 투자자들의 관심을 끌었습니다. 이를 바탕으로, 머신러닝 및 딥러닝 기법을 활용한 비트코인 가격 예측 모델이 발전하고 있습니다. 본 강좌에서는 ARIMA(AutoRegressive Integrated Moving Average) 모델을 활용하여 비트코인 가격 시계열을 예측하는 방법을 다룹니다.
1. ARIMA 모델 개요
ARIMA 모델은 시계열 데이터에서 패턴을 찾고 예측하는 데 널리 사용됩니다. ARIMA는 다음의 세 가지 구성 요소로 이루어져 있습니다:
- AR (자기회귀) 부분: 이전 시점의 값이 현재 시점의 값에 미치는 영향을 분석합니다.
- I (차분) 부분: 정형성을 확보하기 위해 시계열 데이터를 차분화하여 안정화합니다.
- MA (이동 평균) 부분: 이전 예측 오차가 현재 예측에 미치는 영향을 분석합니다.
ARIMA 모델은 ARIMA(p, d, q)
의 형태로 표현됩니다. 여기서 p
는 자기회귀 항수, d
는 차분 횟수, q
는 이동 평균 항수입니다.
2. 비트코인 가격 시계열 데이터 수집
비트코인의 가격 데이터를 수집하기 위해 여러 데이터 제공 API를 사용할 수 있습니다. 본 예제에서는 yfinance
라이브러리를 사용하여 데이터를 수집합니다. 이를 위해 필요한 라이브러리를 설치합니다.
pip install yfinance
데이터 수집 예제 코드
import yfinance as yf
import pandas as pd
# 비트코인 데이터 가져오기
btc_data = yf.download('BTC-USD', start='2020-01-01', end='2023-09-30')
btc_data['Close'].plot(title='Bitcoin Closing Prices', fontsize=14)
3. 시계열 데이터 전처리
ARIMA 모델을 적용하기 전, 데이터의 안정성을 확인해야 합니다. 이를 위해 시계열 데이터를 시각화하고, 정상성 검정을 수행합니다. 정상성을 확인하기 위해 ADF(확장된 딕키-풀러) 검정을 사용합니다.
정상성 검정 예제 코드
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# ADF 검정 함수
def adf_test(series):
result = adfuller(series, autolag='AIC')
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
for key, value in result[4].items():
print('Critial Values:')
print('\t%s: %.3f' % (key, value))
# 종가 데이터에 대해 ADF 검정 수행
adf_test(btc_data['Close'])
4. ARIMA 모델 훈련
데이터가 정상성을 갖춘 경우, ARIMA 모델을 훈련시킬 수 있습니다. 모델의 파라미터를 설정하는 데 있어 ACF(자기상관함수)와 PACF(부분자기상관함수) 플롯을 활용합니다.
ACF 및 PACF 플롯 생성 예제 코드
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# ACF 및 PACF 플롯
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(btc_data['Close'], ax=plt.gca(), lags=30)
plt.subplot(122)
plot_pacf(btc_data['Close'], ax=plt.gca(), lags=30)
plt.show()
ARIMA 모델 훈련 예제 코드
from statsmodels.tsa.arima.model import ARIMA
# ARIMA 모델 생성 (p, d, q는 적절한 값으로 설정)
model = ARIMA(btc_data['Close'], order=(5, 1, 0))
model_fit = model.fit()
# 모델 요약
print(model_fit.summary())
5. 예측 및 결과 시각화
모델을 훈련한 후, 예측을 수행하고 결과를 시각화합니다. 예측 결과와 실제 데이터를 비교하는 것이 중요합니다.
예측 및 시각화 예제 코드
# 미래 30일 가격 예측
forecast = model_fit.forecast(steps=30)
forecast_index = pd.date_range(start='2023-10-01', periods=30)
forecast_series = pd.Series(forecast, index=forecast_index)
# 실제 데이터 시각화
plt.figure(figsize=(10, 6))
plt.plot(btc_data['Close'], label='Actual Prices')
plt.plot(forecast_series, label='Forecasted Prices', color='red')
plt.title('Bitcoin Price Forecast')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
6. 모델의 성능 평가
모델의 예측 성능을 평가하기 위해 RMSE(Root Mean Squared Error)와 같은 평가 지표를 사용할 수 있습니다.
RMSE 계산 예제 코드
from sklearn.metrics import mean_squared_error
import numpy as np
# RMSE 계산
rmse = np.sqrt(mean_squared_error(btc_data['Close'][-30:], forecast_series))
print(f'RMSE: {rmse}')
결론
ARIMA 모델을 사용한 비트코인 가격 예측은 시계열 데이터 분석에 강력한 도구입니다. 그러나 모델의 성능은 데이터의 품질, 모델의 파라미터 조정, 그리고 외부 요인에 따라 달라질 수 있습니다. 추가적으로 다른 머신러닝 및 딥러닝 방법들과 결합하여 더 향상된 예측 성능을 얻을 수 있습니다.