programming/Python

파이썬으로 비트코인 시세 예측하기 with ARIMA 모델

Jofresh 2023. 7. 20. 20:25
728x90
반응형

안녕하세요. 조신선입니다.

오늘은 전통적인 시계열 예측방법인 ARIMA 분석방법에 대해서 알아보도록 하겠습니다.

 

 

데이터 분석은 늘 VSCODE로 작업하고, 일반 파이썬 환경이 아닌 쥬피터 환경이라 부르는 환경에서 진행합니다.

우선 ARIMA 모델에 대해서 알아본 뒤, 코드로 비트코인 시세를 예측해보고, 실제 가격과의 차이를 확인해보도록 하겠습니다.

 

 

ARIMA 모델이란?

파이썬의 ARIMA는 자기회귀누적이동평균(Autoregressive Integrated Moving Average) 모델을 구현하는 데 사용되는 시계열 데이터 분석 도구입니다. ARIMA는 시계열 데이터의 특성과 패턴을 분석하여 미래의 값을 예측하거나 시계열 데이터의 변동과 추세를 이해하는 데 도움을 줍니다.
ARIMA는 세 가지 주요 매개변수를 가지고 있습니다:

  1. AR (Autoregressive): 자기회귀(AR)는 현재 값을 이전 값들의 선형 조합으로 모델링하는 방법입니다. 즉, 현재 값은 이전 값들에 의해 영향을 받는다고 가정합니다.
  2. I (Integrated): 누적이동평균(Moving Average) 모델에서 시계열 데이터의 차분(Difference)을 계산하여 정상성을 확보하는 과정을 뜻합니다. 이 과정은 시계열 데이터의 추세를 제거하고 정상성을 확보하기 위해 수행됩니다.
  3. MA (Moving Average): 이동평균(MA)은 이전 예측 오차들의 선형 조합으로 현재 값을 모델링하는 방법입니다. 이전 예측 오차들이 현재 값을 예측하는 데 영향을 미치는 것으로 가정합니다.

ARIMA 모델은 이러한 세 가지 매개변수를 조합하여 시계열 데이터를 모델링하고 예측합니다. ARIMA 모델은 다음과 같은 주요 기능을 가지고 있습니다:

  1. 예측 (Forecasting): ARIMA 모델은 과거 데이터를 기반으로 미래 값을 예측하는 데 사용됩니다. 이를 통해 시계열 데이터의 추세와 패턴을 이해하고 미래의 값을 예측할 수 있습니다.
  2. 시계열 데이터 분석 (Time Series Analysis): ARIMA 모델은 시계열 데이터의 변동과 추세를 분석하는 데 도움을 줍니다. 이를 통해 데이터의 패턴과 변동을 파악할 수 있으며, 시계열 데이터의 특성을 이해하는 데 도움이 됩니다.
  3. 정상성 검정 (Stationarity Testing): ARIMA 모델은 시계열 데이터의 정상성을 확인하는 데 사용됩니다. 정상성이 확보되지 않은 시계열 데이터는 ARIMA 모델에 적합하지 않으며, 차분을 통해 정상성을 확보할 필요가 있습니다.

ARIMA 모델은 주식 시장 예측, 경제 지표 예측, 기후 변화 예측 등 다양한 분야에서 사용됩니다. 또한 ARIMA 모델은 다른 모델과 결합하여 보다 정확한 예측을 수행하는 경우도 있습니다. ARIMA 모델은 시계열 데이터를 효과적으로 분석하고 예측하기 위한 강력한 도구로서 데이터 과학과 시계열 분석에서 자주 활용됩니다.

 

 

비트코인 시세 예측하기

market-price.csv
0.01MB

 

 

우선 비트코인의 가격은 위 파일에 정리해두었습니다. 위 파일은 블록체인닷컴에서 가져온 데이터입니다.

 

raw 데이터 기본 정보

총 364개의 데이터가 있고, 'day'와 'price'만 들어있는 심플한 데이터입니다.

 

ARIMA 모델 활용하기

ARIMA 분석의 파라미터는 일반적으로 p,d,q라는 가이드라인이 있습니다.

보통은 p와 q의 합이 2미만인 경우 , 혹은 p와 q의 곱이 0을 포함한 짝수인 경우가 좋은 파라미터의 조합이라고 알려져 있습니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# CSV 파일 경로
file_path = '../data/market-price.csv'

# CSV 파일을 데이터프레임으로 불러옵니다.
bitcoin_df = pd.read_csv(file_path, names=['day', 'price'])

# 'day' 열을 날짜 형식으로 변환합니다.
bitcoin_df['day'] = pd.to_datetime(bitcoin_df['day'])

# 시계열 데이터로 변환하기 위해 'day' 열을 인덱스로 설정합니다.
bitcoin_df.set_index('day', inplace=True)

# ARIMA 모델을 학습하기 위해 시계열 데이터를 생성합니다.
ts_data = bitcoin_df['price']

# ARIMA 모델 파라미터 설정 (AR=2, 차분=1, MA=2)
p, d, q = 2, 1, 2

# ARIMA 모델 생성
arima_model = sm.tsa.ARIMA(ts_data, order=(p, d, q))

# ARIMA 모델 학습
arima_model_fit = arima_model.fit()

# 미래 가격 예측 (forecasting)
future_steps = 5  # 5일 뒤를 예측합니다.
forecast_result = arima_model_fit.forecast(steps=future_steps)

# 예측 결과와 실제 결과를 DataFrame으로 정리합니다.
date_range = pd.date_range(ts_data.index[-1], periods=future_steps)
actual_prices = [6719.266154, 7000.04, 7054.276429, 6932.6625, 6981.946154]
comparison_df = pd.DataFrame({'Date': date_range, 'Forecasted Price': forecast_result, 'Actual Price': actual_prices})

# 결과를 시각화합니다.
plt.figure(figsize=(10, 6))
plt.plot(comparison_df['Date'], comparison_df['Forecasted Price'], label='Forecast', color='red')
plt.plot(comparison_df['Date'], comparison_df['Actual Price'], label='Actual', color='green')
plt.scatter(comparison_df['Date'], comparison_df['Actual Price'], color='green', marker='o')
plt.legend()
plt.xlabel('Date')
plt.ylabel('Bitcoin Price')
plt.title('Bitcoin Price Forecast vs. Actual')
plt.show()

 

#출력 결과

 

일부러 예측기간만 시각화 하였습니다.

실제로는 가격이 많이 상승했는데, 예측결과는 그다지 정확하지 못 합니다.

ARIMA 모델 출력 결과

 

 

그러면 모델링 결과를 한 번 보겠습니다.

모델링 결과 요약

 

  1. 모델 정보:
  • 모델: ARIMA(2, 1, 2)
  • 시계열 데이터 총 개수: 365
  • 로그 우도 (Log Likelihood): -2787.490
  • AIC (Akaike Information Criterion): 5584.980
  • BIC (Bayesian Information Criterion): 5604.466
  • HQIC (Hannan-Quinn Information Criterion): 5592.725
  1. 모델 계수:
  • ar.L1 (자기회귀항 1): 0.2418, p-value: 0.427 (0.05보다 크므로 유의하지 않음)
  • ar.L2 (자기회귀항 2): 0.6072, p-value: 0.002 (0.05보다 작으므로 유의함)
  • ma.L1 (이동평균항 1): -0.1513, p-value: 0.621 (0.05보다 크므로 유의하지 않음)
  • ma.L2 (이동평균항 2): -0.6705, p-value: 0.001 (0.05보다 작으므로 유의함)
  1. 잔차 분석:
  • 잔차 변동의 분석을 위해 Ljung-Box 검정과 Jarque-Bera 검정을 수행하였습니다.
  • Ljung-Box 검정에서 p-value는 0.79로, 잔차들이 랜덤한 변동을 가지고 있다는 가정을 지지합니다.
  • Jarque-Bera 검정에서 p-value는 0.00으로, 잔차들이 정규분포를 따른다는 가정을 기각합니다.
  1. 기타 정보:
  • 시계열 데이터의 편차 비율 (Heteroskedasticity): 0.14
  • 첨도 (Kurtosis): 9.90

해석 결과, 모델의 계수 중 일부는 유의하지 않은 것으로 나타났으며, 잔차들이 랜덤한 변동을 보이는 것으로 확인되었습니다. 그러나 잔차들은 정규분포를 따르지 않는 것으로 나타났습니다. 이러한 정보를 바탕으로 모델의 성능과 예측 결과를 평가할 수 있습니다.

 

모델의 계수 중 일부가 유의하지 않다는 것은 해당 모델이 데이터에 적합하지 않을 수 있다는 의미입니다. 이러한 경우 모델의 성능을 개선하기 위해 다양한 방법을 고려할 수 있습니다.

  1. 모델 파라미터 조정: ARIMA 모델은 (p, d, q)와 같은 세 가지 파라미터를 가지고 있습니다. 이들을 조정하여 다른 모델을 생성해볼 수 있습니다. 예를 들어, (1, 1, 1)이나 (3, 1, 3)과 같이 다른 파라미터 조합으로 모델을 학습시켜 성능을 비교해볼 수 있습니다.
  2. 다른 시계열 모델 적용: ARIMA 외에도 시계열 예측에 사용할 수 있는 다른 모델들이 있습니다. 예를 들어, SARIMA, Seasonal ARIMA, Prophet 등의 모델들을 고려해 볼 수 있습니다.
  3. 데이터 전처리: 데이터 전처리를 통해 이상치나 결측치를 처리하거나, 데이터를 정규화하는 등의 방법으로 모델 성능을 개선할 수 있습니다.
  4. 외부 변수 추가: 모델의 성능을 향상시키기 위해 다른 변수들을 모델에 추가하는 것을 고려할 수 있습니다. 예를 들어, 주식 가격을 예측하는 경우 경제 지표나 관련 뉴스의 데이터를 함께 사용해볼 수 있습니다.
  5. Cross-validation: 모델의 성능을 평가하기 위해 cross-validation을 수행하고, 다양한 평가 지표를 활용하여 모델을 비교할 수 있습니다.
  6. 모델 앙상블: 여러 모델들을 조합하여 모델 앙상블을 수행하여 예측 결과를 향상시킬 수도 있습니다.

모델 성능을 개선하기 위해서는 위와 같은 다양한 접근 방법을 고려하고 실험해보는 것이 중요합니다. 데이터의 특성과 목적에 맞게 적절한 방법을 선택하여 모델을 최적화하고 더 정확한 예측을 할 수 있도록 노력해야 합니다.

 

 

 

 

728x90
반응형