딥러닝과 머신러닝을 활용한 자동매매, 머신러닝을 이용한 가격 예측 회귀 모델을 사용하여 비트코인의 단기 가격 움직임 예측하기.

머신러닝을 이용한 비트코인 가격 예측

비트코인은 최근 몇 년간 금융 시장에서 가장 인기 있는 자산 중 하나로 자리 잡았습니다.
많은 투자자들이 비트코인의 가격 변동성을 활용하여 수익을 창출하고자 합니다.
이 강좌에서는 딥러닝과 머신러닝 기법을 활용하여 비트코인의 단기 가격 움직임을 예측하는 방법을 배워보도록 하겠습니다.
특히, 회귀 모델을 사용하여 비트코인 가격을 예측하는 과정에 집중할 것입니다.

1. 데이터 준비

비트코인 가격 예측에 사용할 데이터셋은 주로 비트코인의 가격과 거래량, 고가 및 저가 등의 정보를 포함합니다.
일반적으로 코인마켓캡이나 바이낸스와 같은 암호화폐 거래소에서 제공하는 API를 통해 실시간 데이터를 수집할 수 있습니다.
본 강좌에서는 예제를 위해 역사적 가격 데이터를 사용합니다.

import pandas as pd

# Binance API에서 CSV 파일로 데이터를 다운로드하고 읽어옵니다.
df = pd.read_csv('bitcoin_price.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 필요한 컬럼만 선택하여 데이터프레임을 만듭니다.
data = df[['Open', 'High', 'Low', 'Close', 'Volume']]
data.head()

2. 데이터 전처리

머신러닝 모델의 성능을 높이기 위해서는 데이터 전처리가 매우 중요합니다.
결측치 처리, 스케일링, 병합 등 여러 전처리가 필요합니다.
또한, 가격의 시계열 데이터 특성상, 과거 가격 정보가 미래 가격에 영향을 미칠 수 있다는 점을 활용합니다.

# 결측치 처리
data = data.fillna(method='ffill')

# 데이터 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)

# 시퀀스 데이터 생성
def create_dataset(dataset, time_step=1):
    X, y = [], []
    for i in range(len(dataset) - time_step - 1):
        X.append(dataset[i:(i + time_step), 0:dataset.shape[1]])
        y.append(dataset[i + time_step, 3])  # Close price
    return np.array(X), np.array(y)

# 시간 단계 설정
time_step = 10
X, y = create_dataset(scaled_data, time_step)

# 훈련용과 테스트용 데이터셋으로 분리합니다.
train_size = int(len(X) * 0.8)
X_train, X_test = X[0:train_size], X[train_size:len(X)]
y_train, y_test = y[0:train_size], y[train_size:len(y)]

3. 모델 구축

우리는 LSTM(Long Short-Term Memory) 네트워크를 사용하여 시계열 데이터를 학습할 것입니다.
LSTM은 RNN(Recurrent Neural Network)의 일종으로, 시계열 데이터의 패턴을 잘 학습할 수 있습니다.

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))

model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=50))
model.add(Dropout(0.2))

model.add(Dense(units=1))  # 가격 예측
model.compile(optimizer='adam', loss='mean_squared_error')

4. 모델 학습

이제 모델을 학습시켜 보겠습니다.
충분한 에포크(Epoch) 수에 걸쳐 학습하여 모델이 데이터 패턴을 잘 학습하도록 하겠습니다.

# 모델 학습
model.fit(X_train, y_train, epochs=100, batch_size=32)

5. 모델 평가

학습이 끝난 모델을 검증 데이터셋으로 평가합니다.
모델의 예측 성능을 평가하기 위해 RMSE(Root Mean Square Error)를 사용할 것입니다.

import numpy as np

# 예측
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 역스케일링
train_predict = scaler.inverse_transform(np.concatenate((np.zeros((train_predict.shape[0], 4)), train_predict), axis=1))[:, 4]
test_predict = scaler.inverse_transform(np.concatenate((np.zeros((test_predict.shape[0], 4)), test_predict), axis=1))[:, 4]

# RMSE 계산
train_rmse = np.sqrt(np.mean((train_predict - y_train) ** 2))
test_rmse = np.sqrt(np.mean((test_predict - y_test) ** 2))

print(f'Train RMSE: {train_rmse}')
print(f'Test RMSE: {test_rmse}')

6. 예측 결과 시각화

마지막으로, 예측 결과를 시각화하여 모델의 성능을 평가하겠습니다.
실제 가격과 모델이 예측한 가격을 시각적으로 비교하여 모델의 예측 성능을 파악할 수 있습니다.

import matplotlib.pyplot as plt

# 시각화
plt.figure(figsize=(14, 5))
plt.plot(df.index[:len(y_train)], y_train, label='Actual Price (Train)', color='blue')
plt.plot(df.index[len(y_train):len(y_train)+len(y_test)], y_test, label='Actual Price (Test)', color='green')
plt.plot(df.index[:len(y_train)], train_predict, label='Predicted Price (Train)', color='red')
plt.plot(df.index[len(y_train):len(y_train)+len(y_test)], test_predict, label='Predicted Price (Test)', color='orange')
plt.title('Bitcoin Price Prediction')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()

결론

이번 강좌에서는 딥러닝과 머신러닝을 활용하여 비트코인 가격 예측 모델을 구축하는 방법을 배웠습니다.
LSTM 모델을 통해 과거 가격 데이터의 패턴을 학습하여 미래 가격을 예측할 수 있었습니다.
이와 같은 방식으로 여러 가지 모델을 시도해보면서, 더 나은 예측 성능을 달성할 수 있습니다.
비트코인 자동매매 시스템을 구축할 때, 가격 예측은 중요한 요소 중 하나이며, 이 과정은 투자 결정을 내리는 데 도움이 될 것입니다.

참고 자료