최근 몇 년 간 비트코인과 같은 암호화폐의 인기가 급증함에 따라, 많은 거래자들이 자동매매 시스템을 구축하여 수익을 극대화하고자 노력하고 있습니다. 이 강좌에서는 머신러닝의 한 기법인 랜덤 포레스트(Random Forest)를 사용하여 비트코인의 매수 및 매도 신호를 예측하는 방법을 학습할 것입니다.
1. 랜덤 포레스트란?
랜덤 포레스트는 여러 개의 결정 트리(Decision Tree)를 결합하여 예측을 수행하는 앙상블 학습 알고리즘입니다. 이 기법은 주어진 데이터셋에서 무작위로 샘플링한 데이터로 여러 개의 결정 트리를 생성하고, 각 트리가 예측한 값을 통합하여 최종 예측 결과를 생성합니다. 랜덤 포레스트는 고차원 데이터와 노이즈에 강한 특성을 가지고 있어 금융 데이터의 예측에 적합합니다.
1.1 특징
- 과적합(overfitting)에 강함: 여러 개의 트리를 결합하여 예측하기 때문에 개별 트리의 과적합을 방지합니다.
- 상관 관계를 탐지: 다수의 트리를 통해 변수 간의 관계를 더 잘 파악할 수 있습니다.
- 특성 중요도 평가: 각 특성이 모델에 미치는 영향력을 평가할 수 있습니다.
2. 데이터 준비
랜덤 포레스트 모델을 훈련시키기 위해 필요한 데이터는 비트코인의 가격 데이터와 거래량, 이동 평균 등 다양한 지표들입니다. 데이터는 다음과 같은 형식으로 준비되어야 합니다.
날짜, 시가, 고가, 저가, 종가, 거래량
2021-01-01, 30000, 31000, 29000, 30500, 1000
2021-01-02, 30500, 31500, 29500, 30000, 850
...
2.1 데이터셋 수집
비트코인 가격 데이터는 다양한 방법으로 수집할 수 있습니다. API를 사용하여 자동으로 데이터를 가져오거나, CSV 파일로 다운로드할 수 있습니다. 이번 예제에서는 Pandas 라이브러리를 사용하여 CSV 파일을 읽는 방식을 보여주겠습니다.
2.2 데이터 전처리
import pandas as pd
# 데이터 읽기
data = pd.read_csv('bitcoin_data.csv')
# 날짜를 datetime 형식으로 변환
data['날짜'] = pd.to_datetime(data['날짜'])
# 결측치 처리
data.fillna(method='ffill', inplace=True)
3. 특징 엔지니어링
랜덤 포레스트 모델의 성능을 높이기 위해서는 적절한 특징(feature)을 선택하고 생성하는 것이 중요합니다. 비트코인의 가격 데이터에서 몇 가지 중요한 특징을 생성해 보겠습니다.
3.1 이동 평균(Moving Average)
가장 단순하면서도 유용한 지표 중 하나인 이동 평균을 계산하여 추가 특성으로 사용합니다.
# 5일 이동 평균
data['MA5'] = data['종가'].rolling(window=5).mean()
# 10일 이동 평균
data['MA10'] = data['종가'].rolling(window=10).mean()
3.2 변동성(Volatility)
변동성은 자산의 가격이 얼마나 변동하는지를 나타내는 지표입니다. 이를 계산하여 모델의 입력으로 사용할 수 있습니다.
# 표준편차를 사용하여 5일 변동성 계산
data['Volatility'] = data['종가'].rolling(window=5).std()
4. 매수/매도 신호 생성
매수/매도 신호를 생성하기 위해서는 이전 데이터의 특징을 사용하여 미래 가격 방향성을 예측해야 합니다. 이 예제에서는 종가 증가 여부로 매수/매도 신호를 생성합니다.
data['신호'] = 0
data.loc[data['종가'].shift(-1) > data['종가'], '신호'] = -1 # 매도 신호
data.loc[data['종가'].shift(-1) < data['종가'], '신호'] = 1 # 매수 신호
4.1 훈련 및 테스트 데이터 분리
모델의 성능을 평가하기 위해 훈련 데이터와 테스트 데이터를 나누도록 하겠습니다.
from sklearn.model_selection import train_test_split
# 특성과 타겟 변수 정의
X = data[['MA5', 'MA10', 'Volatility']].iloc[:-1] # 마지막 행은 제외
y = data['신호'].iloc[:-1] # 마지막 행은 제외
# 훈련 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
5. 랜덤 포레스트 모델 훈련
이제 랜덤 포레스트 모델을 훈련시키고, 테스트 데이터를 사용하여 예측을 수행해 보겠습니다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
# 랜덤 포레스트 모델 초기화
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 모델 훈련
model.fit(X_train, y_train)
# 테스트 데이터로 예측
y_pred = model.predict(X_test)
# 성능 평가
print("정확도:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
6. 매매 전략 개발
예측된 매수/매도 신호를 바탕으로 매매 전략을 개발할 수 있습니다. 예를 들어, 예측된 신호에 따라 매수 또는 매도를 실행하는 간단한 전략을 구현해 보겠습니다.
def trading_strategy(data, signals):
cash = 10000 # 초기 자본 금액
position = 0 # 보유중인 비트코인 수
for i in range(len(signals)):
if signals[i] == 1: # 매수 신호
position += cash / data['종가'].iloc[i]
cash = 0
elif signals[i] == -1 and position > 0: # 매도 신호
cash += position * data['종가'].iloc[i]
position = 0
return cash # 최종 자포부
final_amount = trading_strategy(data.iloc[len(data) - len(y_pred):], y_pred)
print("최종 자본 금액:", final_amount)
7. 결론 및 발전 방향
이번 강좌에서는 랜덤 포레스트를 이용하여 비트코인의 매수 및 매도 신호를 예측하는 방법을 배웠습니다. 이 과정에서 데이터 수집, 전처리, 특징 엔지니어링, 모델 훈련 및 매매 전략 개발까지의 전반적인 과정을 알아보았습니다. 앞으로는 추가적인 지표나 신호를 통한 성능 개선, 하이퍼 파라미터 튜닝, 머신러닝 모델의 통합 등 다양한 방향으로 연구를 진행할 수 있습니다.
비트코인 시장은 본질적으로 변동성이 크고 예측하기 어려운 환경입니다. 따라서 머신러닝을 활용한 자동매매 시스템 구축 시 항상 리스크 관리 및 적절한 전략을 수립해야 한다는 점을 잊지 말아야 합니다.