비트코인과 같은 암호화폐의 자동매매 시스템을 구축하기 위해서는 효과적인 가격 예측 모델이 필수적입니다. 본 글에서는 머신러닝 기법 중 하나인 가우시안 프로세스 회귀(GPR)를 활용하여 비트코인의 가격 변동을 예측하는 방법을 자세히 설명하겠습니다.
1. 머신러닝과 딥러닝 개요
머신러닝은 인공지능(AI)의 한 분야로, 데이터에서 패턴을 학습하여 새로운 데이터에 대한 예측을 가능하게 하는 기법입니다. 딥러닝은 머신러닝의 하위 분야로, 인공신경망을 이용하여 복잡한 데이터의 특징을 스스로 학습하는 방법입니다.
2. 가우시안 프로세스 회귀(GPR)란?
가우시안 프로세스 회귀(GPR)는 비모수 베이지안 통계 모델의 한 형태로, 특히 연속형 데이터의 예측에 효과적입니다. GPR은 주어진 데이터에 대해 확률적 모델을 생성하여 불확실성을 자연스럽게 내포할 수 있게 합니다. 이를 통해 예측값과 함께 예측의 신뢰도를 추정할 수 있습니다.
2.1 GPR의 수학적 배경
GPR는 가우시안 분포를 기반으로 하며, 입력 데이터와 출력 데이터 간의 함수 관계를 학습합니다. 주어진 훈련 데이터셋 (X, y)에 대해서, GPR은 다음과 같은 공분산 함수를 사용하여 예측을 수행합니다:
K(X, X') = σ² * exp(-||X - X'||² / (2 * l²))
여기서, K는 커널 함수, σ는 노이즈의 표준편차, l은 길이척도입니다. 이 커널 함수는 데이터 포인트 간의 유사성을 결정합니다.
3. 비트코인 가격 데이터 수집
비트코인 가격 예측 모델을 구축하기 위해서는 과거의 비트코인 가격 데이터가 필요합니다. 우리는 Python의 pandas
라이브러리와 yfinance
모듈을 사용하여 데이터를 수집할 것입니다.
import pandas as pd
import yfinance as yf
# 비트코인 데이터 다운로드
btc_data = yf.download('BTC-USD', start='2020-01-01', end='2023-01-01')
btc_data = btc_data[['Close']]
btc_data = btc_data.rename(columns={'Close': 'price'})
btc_data = btc_data.reset_index()
btc_data['Date'] = pd.to_datetime(btc_data['Date'])
btc_data.sort_values('Date', inplace=True)
print(btc_data.head())
4. 데이터 전처리
수집한 데이터를 GPR 모델에 적합하게 전처리해야 합니다. 특히, 시계열 데이터의 경우 날씨적 트렌드와 계절성을 제거해야 할 수 있습니다.
btc_data['returns'] = btc_data['price'].pct_change()
btc_data = btc_data.dropna()
# 인덱스 리셋
btc_data.reset_index(drop=True, inplace=True)
print(btc_data.head())
5. 가우시안 프로세스 회귀 모델 구축
모델 구축을 위해 scikit-learn
라이브러리의 GaussianProcessRegressor
클래스를 사용합니다. 이를 통해 비트코인 가격을 예측할 수 있습니다.
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
# 커널 정의
kernel = C(1.0, (1e-3, 1e3)) * RBF(1.0, (1e-2, 1e2))
# 모델 초기화
gpr = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
# 훈련 데이터
X_train = btc_data.index.values.reshape(-1, 1)
y_train = btc_data['price'].values
# 모델 피팅
gpr.fit(X_train, y_train)
6. 가격 예측
훈련된 GPR 모델을 사용하여 미래의 가격을 예측해봅시다. 예측할 날짜를 정하고, 이에 대한 인덱스를 생성하여 예측을 수행합니다.
import numpy as np
# 예측할 날짜 수
n_days = 30
X_test = np.arange(len(btc_data), len(btc_data) + n_days).reshape(-1, 1)
# 예측
y_pred, sigma = gpr.predict(X_test, return_std=True)
# 결과 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(btc_data['Date'], btc_data['price'], 'r.', markersize=10, label='Observed Data')
plt.plot(btc_data['Date'].iloc[-1] + pd.to_timedelta(np.arange(1, n_days + 1), unit='D'), y_pred, 'b-', label='Predicted Price')
plt.fill_between(btc_data['Date'].iloc[-1] + pd.to_timedelta(np.arange(1, n_days + 1), unit='D'),
y_pred - 2 * sigma, y_pred + 2 * sigma, color='gray', alpha=0.2, label='Confidence Interval')
plt.title('Bitcoin Price Prediction using Gaussian Process Regression')
plt.xlabel('Date')
plt.ylabel('Price in USD')
plt.legend()
plt.show()
7. 성능 평가
모델의 성능을 평가하기 위해 Root Mean Squared Error (RMSE)와 R²-Score를 사용할 수 있습니다. 이를 통해 예측의 정확도를 가늠할 수 있습니다.
from sklearn.metrics import mean_squared_error, r2_score
# RMSE 계산
y_train_pred = gpr.predict(X_train)
rmse = np.sqrt(mean_squared_error(y_train, y_train_pred))
r2 = r2_score(y_train, y_train_pred)
print(f"RMSE: {rmse:.2f}, R² Score: {r2:.2f}")
8. 실시간 자동매매 시스템 구축
최종적으로, 예측한 가격을 기반으로 자동매매를 구현할 수 있습니다. 이는 매매 신호(매수/매도)를 생성하는 로직을 포함해야 하며, 실제 거래를 위해 API를 통해 거래소와 연결할 수 있습니다.
def generate_signals(predicted_prices):
buy_signals = []
sell_signals = []
for i in range(1, len(predicted_prices)):
if predicted_prices[i] > predicted_prices[i - 1]:
buy_signals.append(predicted_prices[i])
sell_signals.append(np.nan)
elif predicted_prices[i] < predicted_prices[i - 1]:
sell_signals.append(predicted_prices[i])
buy_signals.append(np.nan)
else:
buy_signals.append(np.nan)
sell_signals.append(np.nan)
return buy_signals, sell_signals
buy_signals, sell_signals = generate_signals(y_pred)
plt.figure(figsize=(12, 6))
plt.plot(btc_data['Date'], btc_data['price'], label='Actual Price')
plt.plot(btc_data['Date'].iloc[-1] + pd.to_timedelta(np.arange(1, n_days + 1), unit='D'), y_pred, label='Predicted Price', color='orange')
plt.plot(btc_data['Date'].iloc[-1] + pd.to_timedelta(np.arange(1, n_days + 1), unit='D'), buy_signals, marker='^', color='g', label='Buy Signal', markersize=10)
plt.plot(btc_data['Date'].iloc[-1] + pd.to_timedelta(np.arange(1, n_days + 1), unit='D'), sell_signals, marker='v', color='r', label='Sell Signal', markersize=10)
plt.title('Buy/Sell Signals based on Predictions')
plt.xlabel('Date')
plt.ylabel('Price in USD')
plt.legend()
plt.show()
9. 결론
이번 강좌에서는 가우시안 프로세스 회귀를 이용하여 비트코인 가격의 예측 모델을 구축하는 방법에 대해 살펴보았습니다. GPR은 가격 예측의 불확실성을 잘 반영할 수 있는 장점이 있으며, 자동매매 시스템에 응용할 수 있습니다.
앞으로 이 시스템을 개선하기 위해 더 많은 피쳐를 추가하고, 다른 머신러닝 알고리즘을 테스트해보는 것도 좋은 방법입니다. 더불어, 실시간 데이터와의 통합을 통해 더욱 효과적인 자동매매 시스템을 구현할 수 있습니다.
끝으로, 주식이나 암호화폐의 매매는 항상 위험이 동반됨을 잊지 마세요. 충분한 연구와 테스트 후에 자동매매 시스템을 운영하는 것이 중요합니다.