머신러닝 및 딥러닝 알고리즘 트레이딩, sklearn을 활용한 확률적 경사 하강법(SGD)

오늘날 금융시장에서는 데이터를 기반으로 한 알고리즘 트레이딩이 널리 사용되고 있습니다. 이에 따라 머신러닝과 딥러닝과 같은 기법이 투자 전략에 점점 더 많이 채택되고 있으며, 특히 확률적 경사 하강법(SGD)은 그 효율성과 빠른 수렴 속도로 인해 많은 주목을 받고 있습니다. 본 강좌에서는 머신러닝 및 딥러닝 알고리즘 트레이딩의 기본 개념부터 시작하여, scikit-learn 라이브러리를 이용해 SGD를 활용하는 방법에 대해 자세히 알아보도록 하겠습니다.

1. 머신러닝과 딥러닝의 기본 개념

머신러닝(Machine Learning)은 데이터로부터 자동으로 학습하는 알고리즘 설계를 목적으로 하는 인공지능(AI) 분야의 한 갈래입니다. 딥러닝(Deep Learning)은 머신러닝의 하위 분야로, 신경망을 기반으로 한 보다 깊고 복잡한 모델입니다. 우리는 이 두 가지 기법을 통해 데이터에서 가치 있는 패턴을 추출하고, 이를 바탕으로 예측 및 의사 결정을 할 수 있습니다.

1.1 머신러닝의 기초

  • 지도 학습(Supervised Learning): 레이블이 있는 데이터를 사용하여 모델을 학습시키는 방법으로, 주가 예측, 스팸 메일 분류 등이 있습니다.
  • 비지도 학습(Unsupervised Learning): 레이블이 없는 데이터를 통해 데이터의 구조를 파악하고군집화(clustering) 또는 차원 축소(dimensionality reduction) 등을 수행합니다.
  • 강화 학습(Reinforcement Learning): 에이전트가 환경과 상호작용하며 보상을 극대화하는 방향으로 학습하는 방법입니다.

1.2 딥러닝의 기초

딥러닝은 복잡한 층 구조를 가진 신경망을 통해 데이터를 처리합니다. 이는 특히 이미지 인식, 자연어 처리 및 금융 데이터 분석에서 뛰어난 성능을 발휘합니다.

2. SGD(확률적 경사 하강법)란?

확률적 경사 하강법(Stochastic Gradient Descent, SGD)은 최적화 알고리즘으로, 기계 학습에서는손실 함수를 최소화하기 위해 가중치를 업데이트하는 데 사용됩니다. 반목적으로 전체 데이터셋을 사용하기보다, 랜덤하게 선택한 작은 배치(batch)를 사용하여 경량화와 속도를 높이는 방법입니다.

2.1 SGD의 동작 원리

  • 초기 가중치 설정: 모델의 가중치를 임의로 초기화합니다.
  • 데이터 샘플링: 전체 데이터에서 무작위로 하나의 데이터 샘플 또는 작은 배치를 선택합니다.
  • 손실 계산: 현재 가중치와 선택한 샘플을 통해 손실 함수를 계산합니다.
  • 가중치 업데이트: 계산된 손실을 바탕으로 가중치를 업데이트합니다. 이 과정이 반복됩니다.

2.2 SGD의 장단점

  • 장점:
    • 빠른 수렴: 전체 데이터셋을 사용하는 것보다 적은 계산량으로 빠른 속도로 수렴합니다.
    • 메모리 효율성: 전체 데이터셋을 메모리에 로드하지 않아도 되므로 대규모 데이터 처리에 적합합니다.
  • 단점:
    • 잡음: 무작위로 샘플을 선택하기 때문에 손실 함수의 gradient가 불안정해질 수 있습니다.
    • 지역 최적: 가끔씩 지역 최적에 빠질 수 있습니다.

3. scikit-learn 라이브러리 소개

scikit-learn은 Python에서 머신러닝을 위한 가장 인기 있는 라이브러리 중 하나로, 간편한 인터페이스를 제공하며 다양한 알고리즘을 지원합니다. SGD를 포함한 선형 모델, 회귀, 분류 등 다양한 머신러닝 기법을 손쉽게 사용할 수 있습니다.

3.1 scikit-learn 설치하기

pip install scikit-learn

3.2 scikit-learn의 주요 구성 요소

  • 데이터 전처리: 데이터 스케일링, 인코딩, 결측치 처리 등 다양합니다.
  • 모델 선택: 분류, 회귀, 클러스터링, 차원 축소 등 각종 알고리즘을 제공합니다.
  • 모델 평가: 교차 검증, 다양한 지표를 통해 모델 성능을 평가합니다.
  • 하이퍼파라미터 조정: GridSearchCV와 RandomizedSearchCV를 통해 최적의 하이퍼파라미터를 찾을 수 있습니다.

4. SGD를 이용한 주가 예측 모델 구현하기

이제 scikit-learn을 사용하여 확률적 경사 하강법을 기반으로 한 주가 예측 모델을 구현해 보겠습니다.

4.1 데이터 수집 및 전처리

주식 데이터를 수집하기 위해 yfinance 라이브러리를 이용합니다. 그리고 데이터를 전처리하여 모델에 사용할 수 있는 형식으로 변환합니다.

pip install yfinance

import yfinance as yf
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 수집
df = yf.download("AAPL", start="2015-01-01", end="2023-01-01")
df['Return'] = df['Adj Close'].pct_change()
df.dropna(inplace=True)

# 데이터 전처리
X = df[['Open', 'High', 'Low', 'Volume']]
y = (df['Return'] > 0).astype(int)  # 상승 여부 예측

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

4.2 모델 학습

SGDClassifier를 사용하여 모델을 학습합니다.


from sklearn.linear_model import SGDClassifier
from sklearn.metrics import accuracy_score

# 모델 초기화
model = SGDClassifier(loss='log', max_iter=1000, random_state=42)

# 모델 학습
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"모델 정확도: {accuracy:.2f}")

4.3 결과 분석

모델의 성능을 평가하고 분석합니다. 예측된 결과를 실제 주가와 비교하는 것도 중요한 과정입니다.


import matplotlib.pyplot as plt

# 실제 주가 데이터와 예측 결과 시각화
plt.figure(figsize=(12, 6))
plt.plot(df.index[-len(y_test):], df['Adj Close'][-len(y_test):], label='Actual Price')
plt.scatter(df.index[-len(y_test):][y_pred == 1], df['Adj Close'][-len(y_test):][y_pred == 1], color='green', label='Predicted Up')
plt.scatter(df.index[-len(y_test):][y_pred == 0], df['Adj Close'][-len(y_test):][y_pred == 0], color='red', label='Predicted Down')
plt.legend()
plt.title('Stock Price Prediction')
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

5. 하이퍼파라미터 튜닝

모델의 성능을 향상시키기 위해 하이퍼파라미터 튜닝 과정을 거칠 수 있습니다. Grid Search를 사용하여 최적의 파라미터를 찾는 방법을 살펴보겠습니다.


from sklearn.model_selection import GridSearchCV

# 하이퍼파라미터 그리드 설정
param_grid = {
    'loss': ['hinge', 'log'],
    'alpha': [1e-4, 1e-3, 1e-2],
    'max_iter': [1000, 1500, 2000]
}

grid_search = GridSearchCV(SGDClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 최적의 파라미터
print("최적의 파라미터:", grid_search.best_params_)

6. 결론 및 향후 방향

본 강좌에서는 머신러닝과 딥러닝을 활용한 알고리즘 트레이딩의 기초부터 시작하여 scikit-learn을 사용한 확률적 경사 하강법(SGD)에 대해 알아보았습니다. 이를 통해 주식 예측 모델을 구현하고 하이퍼파라미터 튜닝 방법까지 살펴보았습니다.

앞으로는 더 복잡한 딥러닝 모델, LSTM, 강화 학습 등을 활용하여 더욱 효과적인 트레이딩 전략을 개발할 수 있을 것입니다. 지속적인 학습과 실험을 통해 성공적인 트레이딩을 이룩하시길 바랍니다.

감사합니다!