딥러닝과 머신러닝을 활용한 자동매매: K-Nearest Neighbors (KNN)를 활용한 매매 전략
오늘날 금융 시장에서의 자동매매 시스템은 데이터 과학, 딥러닝, 머신러닝 등의 기술을 활용하여 시장의 복잡한 패턴을 학습하고 이를 기반으로 매매 결정을 내리는 데 큰 역할을 하고 있습니다. 특히 비트코인과 같은 암호화폐 시장은 변동성이 크고 급격한 가격 변화가 잦아 이런 기술들이 더욱 중요하게 작용합니다. 본 강좌에서는 K-Nearest Neighbors (KNN) 알고리즘을 활용하여 유사한 과거 데이터를 분석함으로써 비트코인 매매 전략을 설계하는 방법에 대해 알아보겠습니다.
1. K-Nearest Neighbors (KNN) 알고리즘 개요
KNN은 머신러닝의 비지도 학습 기법 중 하나로, 주어진 데이터를 기반으로 유사한 데이터를 찾아 예측하는 방법입니다. KNN의 핵심 아이디어는 새로운 데이터 포인트가 주어졌을 때, 이웃 데이터 포인트 중 가장 가까운 K개를 찾아 그 중 다수의 클래스를 결과로 결정하는 것입니다. KNN은 주로 분류 문제에 많이 사용되지만, 회귀 문제에도 활용될 수 있습니다.
2. KNN의 원리
KNN 알고리즘은 다음과 같은 단계로 작동합니다:
- 데이터 세트에서 모든 포인트 간의 거리를 계산합니다.
- 주어진 포인트와 가장 가까운 K개의 이웃을 선택합니다.
- 가장 많이 등장하는 클래스나 평균 값을 반환하여 예측합니다.
KNN의 주요한 장점은 구현이 간단하고 이해하기 쉽다는 것입니다. 하지만 단점으로는 데이터가 많아질수록 계산 비용이 상승하고, 차원의 저주 문제에 민감하다는 것이 있습니다.
3. 자동매매 시스템 설계
비트코인 자동매매 시스템을 설계하기 위해서는 다음과 같은 단계를 거쳐야 합니다:
- 데이터 수집: 비트코인의 역사적 가격 데이터를 수집합니다.
- 데이터 전처리: 수집한 데이터를 정리하고 KNN 모델에 적합한 형식으로 변환합니다.
- 모델 학습: KNN 알고리즘을 사용하여 과거 데이터를 기반으로 모델을 학습시킵니다.
- 매매 전략 수립: 예측된 결과를 기반으로 매매 결정을 내리는 알고리즘을 설계합니다.
4. 데이터 수집
비트코인 가격 데이터를 수집하기 위해서는 다양한 데이터 제공 API를 사용할 수 있습니다. 여기서는 파이썬을 사용하여 코인게코(CoinGecko) API를 통해 데이터를 가져오는 방법을 소개하겠습니다. 아래의 코드는 비트코인의 일일 가격 데이터를 수집하는 예제입니다:
import requests
import pandas as pd
from datetime import datetime
# API 호출
url = 'https://api.coingecko.com/api/v3/coins/bitcoin/market_chart'
params = {
'vs_currency': 'usd',
'days': '30', # 마지막 30일 데이터
'interval': 'daily'
}
response = requests.get(url, params=params)
data = response.json()
# 데이터프레임 생성
prices = data['prices']
df = pd.DataFrame(prices, columns=['timestamp', 'price'])
# 타임스탬프 변환
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
# 데이터 출력
print(df.head())
5. 데이터 전처리
수집된 데이터는 이상값 제거, 결측값 처리 및 특성 엔지니어링을 통해 모델에 적합한 형태로 변환해야 합니다. 예를 들어, 가격 데이터를 기반으로 기술적 지표를 추가할 수 있습니다. 보통 사용하는 기술적 지표는 이동 평균(MA), 상대강도지수(RSI), MACD 등이 있습니다. 아래 코드는 이동 평균을 추가하는 예제입니다:
# 이동 평균 추가
df['MA_10'] = df['price'].rolling(window=10).mean()
df['MA_50'] = df['price'].rolling(window=50).mean()
df.dropna(inplace=True)
6. KNN 모델 학습
데이터가 준비되면 KNN 모델을 학습할 수 있습니다. 이를 위해 sklearn 라이브러리를 사용할 수 있으며, K 수치는 실험을 통해 최적화할 수 있습니다. 아래는 KNN 모델을 학습하고 예측하는 코드입니다:
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
# 특성과 레이블 분리
X = df[['MA_10', 'MA_50']].values
y = (df['price'].shift(-1) > df['price']).astype(int) # 다음 날 가격이 상승하면 1, 하락하면 0
# 훈련 세트와 테스트 세트로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# KNN 모델 학습
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 예측 및 평가
y_pred = knn.predict(X_test)
print(classification_report(y_test, y_pred))
7. 매매 전략 구현
모델의 예측 결과를 바탕으로 매매 결정을 내리는 알고리즘을 구현할 수 있습니다. 예를 들어, 모델이 비트코인의 가격이 상승할 것이라고 예측할 경우 매수하고, 하락할 것이라고 예측할 경우 매도하는 간단한 전략을 생각해볼 수 있습니다:
def trading_signal(prediction):
if prediction == 1:
return 'Buy' # 상승 예측
else:
return 'Sell' # 하락 예측
# 마지막 데이터에 대한 신호 생성
last_prediction = knn.predict(X[-1].reshape(1, -1))
signal = trading_signal(last_prediction[0])
print(f"Trading Signal: {signal}")
8. 성능 평가
매매 전략의 성능은 다양한 지표를 통해 평가할 수 있습니다. 수익률, 샤프 비율, 최대 낙폭 등을 고려할 수 있으며, 실험적인 백테스팅 방식을 통해 전략의 유효성을 검증할 수 있습니다. 과거 데이터를 기반으로 시뮬레이션을 시행하여 매매 결과를 분석하는 코드 예는 다음과 같습니다:
initial_balance = 1000 # 초기 투자금
balance = initial_balance
for i in range(len(X_test)):
if y_pred[i] == 1: # Buy
balance *= (1 + (df['price'].iloc[i+len(X_train)] - df['price'].iloc[i+len(X_train)-1]) / df['price'].iloc[i+len(X_train)-1])
else: # Sell
balance *= (1 - (df['price'].iloc[i+len(X_train)] - df['price'].iloc[i+len(X_train)-1]) / df['price'].iloc[i+len(X_train)-1])
final_balance = balance
profit = final_balance - initial_balance
print(f"Initial Balance: {initial_balance}, Final Balance: {final_balance}, Profit: {profit}")
9. 결론
KNN은 간단하면서도 효과적인 머신러닝 알고리즘으로, 비트코인 자동매매 전략을 세우는 데 유용한 도구가 될 수 있습니다. 본 강좌에서 소개한 방법을 통해 자동매매 시스템을 구축하고 KNN을 활용한 매매 전략을 수립하는 방법을 배워보았습니다. 하지만 KNN만으로는 한계가 있을 수 있으므로, 다른 알고리즘과 결합하거나 앙상블 기법을 통해 더욱 정교한 전략을 개발하는 것을 권장합니다. 기존의 매매 전략을 지속적으로 검증하고 조정하는 것도 중요합니다.
비트코인 자동매매에 대한 더 많은 정보와 전략을 원하신다면, 관련 문헌과 연구 자료를 참고하여 깊이 있는 지식을 확장해 나가시기 바랍니다.