딥러닝과 머신러닝을 활용한 자동매매, Ensemble Learning 기반 매매 전략 여러 모델을 결합한 앙상블 학습을 통해 더 정확한 매매 신호 생성.

비트코인과 같은 암호화폐의 시장은 매우 변동성이 크며, 매일 수많은 거래가 이루어지고 있습니다. 이러한 시장 환경에서 수익을 창출하기 위해서는 고도화된 매매 전략이 필요합니다. 최근 인공지능(AI) 기술의 발전으로, 특히 딥러닝과 머신러닝을 활용한 자동매매 시스템은 더욱 각광받고 있습니다. 이 글에서는 앙상블 학습을 기반으로 한 비트코인 자동매매 전략을 심도 있게 설명하고, 이를 위한 예제 코드를 제공하겠습니다.

1. 앙상블 학습이란?

앙상블 학습(Ensemble Learning)은 여러 개의 머신러닝 모델을 결합하여 더 나은 예측 성능을 도모하는 기법입니다. 각각의 모델이 개별적으로 학습하고 예측한 결과를 조합함으로써, 단일 모델에서 발생할 수 있는 오차를 줄이고, 일반화 성능을 향상시킬 수 있습니다.

앙상블 학습의 주요 방법에는 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등이 있습니다.

1.1 배깅

배깅은 데이터를 여러 개의 부분 집합으로 나눈 후 각 부분 집합에 대해 독립적으로 모델을 학습시킵니다. 최종 예측은 각 모델의 예측 결과를 평균내거나 다수결로 결정합니다. 랜덤 포레스트(Random Forest)가 대표적인 배깅 알고리즘입니다.

1.2 부스팅

부스팅은 이전 모델의 오류를 수정하는 형태로 다음 모델을 학습시키는 기법입니다. 각 모델이 순차적으로 학습하며, 약한 학습기(weak learner)를 여러 개 결합하여 강한 학습기(strong learner)를 만드는 과정을 거칩니다. AdaBoost와 XGBoost가 유명한 부스팅 알고리즘입니다.

1.3 스태킹

스태킹은 여러 모델을 학습 후, 새로운 모델(메타모델)을 사용해 각 모델의 예측 결과를 학습하여 최종 예측을 수행하는 방식입니다. 다양한 모델의 장점을 취합하여 더욱 강력한 예측력을 갖춘 모델을 만들 수 있습니다.

2. 비트코인 자동매매 시스템 설계

이번 섹션에서는 CNN(합성곱 신경망)과 LSTM(장단기 기억 네트워크) 모델을 결합한 예제 시스템을 설계해보겠습니다. 이 자동매매 시스템은 역사적인 가격 데이터를 기반으로 비트코인의 가격 변동을 예측하고, 그 결과를 바탕으로 매매 신호를 생성하게 됩니다.

2.1 데이터 수집

비트코인 가격 데이터는 여러 API를 통해 수집할 수 있습니다. 이번 예제에서는 yfinance 라이브러리를 사용해 과거 가격 데이터를 가져오겠습니다.

2.2 데이터 전처리

수집한 데이터를 모델에 맞게 전처리해야 합니다. 결측치를 처리하고, 가격 데이터를 정규화(normalization)하는 것이 일반적입니다.

2.3 모델 훈련

훈련할 모델은 CNN과 LSTM을 조합해서 사용합니다. CNN은 시계열 데이터에서 중요한 특징을 추출하는 데 도움이 되며, LSTM은 시계열 데이터의 순서 정보와 장기 의존성을 학습하는 데 효과적입니다.

2.4 매매 신호 생성

훈련된 모델을 사용하여 예측을 수행하고, 특정 임계값(threshold)에 따라 매수 또는 매도 신호를 생성합니다. 예를 들어, 예측된 가격이 현재 가격보다 높으면 매수 신호, 낮으면 매도 신호를 보낼 수 있습니다.

3. 예제 코드

이제 실제 코드 예제를 통해 위에서 설명한 내용을 구현해보겠습니다.

    
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Conv1D, Dense, Flatten, Dropout

# 비트코인 데이터 수집
data = yf.download('BTC-USD', start='2020-01-01', end='2023-10-01')
data = data['Close'].values

# 데이터 전처리
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data.reshape(-1, 1))

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

time_step = 60
X, y = create_dataset(scaled_data, time_step)
X = X.reshape(X.shape[0], X.shape[1], 1)

# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# LSTM 모델 생성
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50))
model.add(Dropout(0.2))
model.add(Dense(1))

# 모델 컴파일
model.compile(optimizer='adam', loss='mean_squared_error')

# 모델 훈련
model.fit(X_train, y_train, epochs=50, batch_size=32)

# 예측
predicted_price = model.predict(X_test)
predicted_price = scaler.inverse_transform(predicted_price)

# 결과 시각화
plt.figure(figsize=(10,6))
plt.plot(scaler.inverse_transform(y_test.reshape(-1, 1)), color='blue', label='실제 가격')
plt.plot(predicted_price, color='red', label='예측 가격')
plt.title('비트코인 가격 예측')
plt.xlabel('시간')
plt.ylabel('가격')
plt.legend()
plt.show()
    
    

위 코드는 비트코인 가격을 예측하기 위한 간단한 LSTM 모델을 구현한 예입니다. 실제 매매 시스템이 되기 위해서는 추가적인 로직을 더해 매매 신호를 생성하는 부분이 필요합니다.

4. 매매 전략 구현

모델이 훈련된 후, 예측된 가격을 바탕으로 매매 전략을 수립하는 단계로 넘어갑니다. 여기서는 단순한 전략으로, 예측된 가격과 실제 가격의 차이를 바탕으로 매매 신호를 생성해 보겠습니다.

    
# 매매 신호 생성
def generate_signals(predicted_prices, actual_prices):
    signals = np.zeros(len(predicted_prices))
    for i in range(1, len(predicted_prices)):
        if predicted_prices[i] > actual_prices[i-1]:
            signals[i] = 1  # 매수 신호
        elif predicted_prices[i] < actual_prices[i-1]:
            signals[i] = -1  # 매도 신호
    return signals

signals = generate_signals(predicted_price.flatten(), scaler.inverse_transform(y_test.reshape(-1, 1)).flatten())
    
    

5. 성능 평가

완성된 매매 시스템의 성능을 평가하는 것은 중요합니다. 여러 지표를 통해 시스템의 성공 여부를 알 수 있습니다. 수익률, 최대 손실, 샤프 비율 등의 지표를 이용해 평가할 수 있습니다.

    
# 성능 평가
def evaluate_performance(signals, actual_prices):
    returns = np.zeros(len(signals))
    for i in range(len(signals)-1):
        if signals[i] == 1:  # 매수
            returns[i+1] = actual_prices[i+1] / actual_prices[i] - 1
        elif signals[i] == -1:  # 매도
            returns[i+1] = -1 * (actual_prices[i+1] / actual_prices[i] - 1)
    return np.cumprod(1 + returns) - 1

cumulative_returns = evaluate_performance(signals, scaler.inverse_transform(y_test.reshape(-1, 1)).flatten())

# 결과 시각화
plt.figure(figsize=(10,6))
plt.plot(cumulative_returns, color='green', label='누적 수익률')
plt.title('비트코인 자동매매 시스템 성능')
plt.xlabel('시간')
plt.ylabel('수익률')
plt.legend()
plt.show()
    
    

6. 마무리

이번 포스팅에서는 딥러닝과 머신러닝을 활용한 비트코인 자동매매 시스템을 앙상블 학습 원칙을 바탕으로 설계하고 구현하는 방법에 대해 알아보았습니다. 앙상블 학습은 다양한 모델의 장점을 결합하여 예측 성능을 향상시키는 유용한 기법입니다. 실제 매매 환경에서는 더욱 정밀한 매매 전략이 필요하며, 이 외에도 다양한 고급 알고리즘과 기법을 활용할 수 있습니다.

앞으로 비트코인 자동매매 시스템을 개선하고 발전시키기 위해 더 많은 실험과 연구를 진행하는 것이 중요합니다. 독자 여러분들도 자신만의 매매 전략을 개발하고, 이를 실험해보기를 권장합니다.

아울러, 암호화폐 시장은 매우 변동성이 크고 위험도가 높은 시장입니다. 따라서 실제 거래를 행하기 전에 충분한 연구와 검토가 필요함을 잊지 마시기 바랍니다.