[K-means clustering] 2.K-평균 클러스터링 개요 및 적용
본문 바로가기
비트코인 자동매매 프로그램/[전략개발] 인공지능

[K-means clustering] 2.K-평균 클러스터링 개요 및 적용

by 코딩 Play 2024. 6. 17.

2주차: K-평균 클러스터링 개요 및 적용

강의 목표: 이번 주차 강의에서는 K-평균 클러스터링 알고리즘의 작동 원리를 상세히 이해하고, 이를 주식 시장 데이터에 적용하여 클러스터링을 수행하는 방법을 학습합니다.


1. K-평균 클러스터링 알고리즘의 단계

K-평균 클러스터링은 데이터를 유사한 그룹으로 나누기 위해 사용되는 비지도 학습 알고리즘입니다. 다음은 K-평균 클러스터링 알고리즘의 주요 단계입니다:

  1. K 값 선택:
    • 클러스터의 수(K)를 설정합니다. 예를 들어, 3개의 클러스터로 나누고 싶다면 K=3으로 설정합니다.
  2. 초기 클러스터 중심 설정:
    • K개의 초기 클러스터 중심(centroids)을 무작위로 선택합니다. 클러스터 중심은 각 클러스터의 중심 위치를 나타내는 점입니다.
  3. 클러스터 할당:
    • 각 데이터 포인트를 가장 가까운 클러스터 중심에 할당합니다. 여기서 가장 가까운 중심은 유클리드 거리(Euclidean distance)를 사용해 계산합니다.
    • 유클리드 거리: 두 점 사이의 직선 거리를 의미하며, n차원 공간에서 두 점 (x1, y1)과 (x2, y2) 사이의 거리는 sqrt((x2 - x1)² + (y2 - y1)²)로 계산됩니다.
  4. 중심 업데이트:
    • 각 클러스터의 평균값을 계산하여 새로운 중심으로 설정합니다. 이때 평균값은 클러스터에 속한 모든 데이터 포인트의 좌표 평균을 의미합니다.
  5. 반복:
    • 클러스터 할당과 중심 업데이트를 중심이 더 이상 변하지 않을 때까지 반복합니다. 보통 몇 번의 반복(iteration) 후에는 중심이 안정화되어 변하지 않게 됩니다.

2. K 값 선택 방법

K-값을 선택하는 것은 클러스터링의 성능에 큰 영향을 미칩니다. 적절한 K 값을 선택하는 방법 중 하나는 엘보우(Elbow) 방법입니다. 엘보우 방법은 클러스터의 수에 따른 총 제곱 오차(SSE, Sum of Squared Errors)를 계산하여, SSE가 급격히 감소하는 지점을 찾는 방법입니다.

엘보우 방법 적용 예제:

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import yfinance as yf

# 데이터 다운로드
df = yf.download('AAPL', start='2023-01-01', end='2023-12-31')
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]

# 데이터 전처리
df.fillna(method='ffill', inplace=True)
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df)

# 엘보우 방법을 사용한 K 값 선택
sse = []
k_range = range(1, 11)
for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=0)
    kmeans.fit(scaled_features)
    sse.append(kmeans.inertia_)

plt.figure(figsize=(10, 5))
plt.plot(k_range, sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()

이 코드는 다음과 같은 과정을 통해 K 값을 선택하는 데 도움을 줍니다:

  1. 데이터 다운로드:
    • yfinance 라이브러리를 사용하여 Apple(AAPL) 주식 데이터를 다운로드합니다. startend 매개변수를 통해 원하는 기간의 데이터를 설정합니다.
      df = yf.download('AAPL', start='2023-01-01', end='2023-12-31')
      df = df[['Open', 'High', 'Low', 'Close', 'Volume']]
  2. 데이터 전처리:
    • 결측치를 이전 값으로 채웁니다(fillna(method='ffill')).
    • 데이터를 표준화합니다(StandardScaler). 표준화는 데이터를 평균이 0이고 분산이 1인 형태로 변환합니다.
      df.fillna(method='ffill', inplace=True)
      scaler = StandardScaler()
      scaled_features = scaler.fit_transform(df)
  3. 엘보우 방법 적용:
    • sse 리스트를 초기화합니다. 이 리스트에는 각 K 값에 대한 SSE 값이 저장됩니다.
    • 1부터 10까지의 K 값에 대해 K-평균 클러스터링을 수행하고, 각 K 값에 대한 SSE를 계산하여 sse 리스트에 추가합니다.
    • SSE 값은 kmeans.inertia_로 얻을 수 있습니다. 이는 클러스터 내 데이터 포인트와 클러스터 중심 간의 거리의 제곱 합입니다.
    • SSE 값을 그래프로 시각화하여 최적의 K 값을 찾습니다. 그래프에서 SSE가 급격히 감소하는 지점이 최적의 K 값이 됩니다.
      sse = []
      k_range = range(1, 11)
      for k in k_range:
        kmeans = KMeans(n_clusters=k, random_state=0)
        kmeans.fit(scaled_features)
        sse.append(kmeans.inertia_)
        
      plt.figure(figsize=(10, 5))
      plt.plot(k_range, sse, marker='o')
      plt.title('Elbow Method for Optimal K')
      plt.xlabel('Number of clusters')
      plt.ylabel('SSE')
      plt.show()

[Output]


3. Python을 이용한 K-평균 클러스터링 적용

이제 주식 시장 데이터에 K-평균 클러스터링을 적용해보겠습니다.

# 최적의 K 값 선택 (예: K=3)
optimal_k = 3

# K-평균 클러스터링 적용
kmeans = KMeans(n_clusters=optimal_k, random_state=0)
df['Cluster'] = kmeans.fit_predict(scaled_features)

# 클러스터 결과 시각화
plt.figure(figsize=(10, 5))
plt.scatter(df.index, df['Close'], c=df['Cluster'])
plt.title('Market Regime Clustering')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.show()

이 코드는 다음과 같은 과정을 통해 K-평균 클러스터링을 적용합니다:

  1. 최적의 K 값 선택:
    • 엘보우 방법을 통해 최적의 K 값을 선택합니다. 예를 들어, 최적의 K 값이 3이라면 optimal_k = 3으로 설정합니다.
      optimal_k = 3
  2. K-평균 클러스터링 적용:
    • KMeans 객체를 생성하고, 선택한 K 값(n_clusters=optimal_k)을 사용하여 클러스터링을 수행합니다.
    • fit_predict 메서드를 사용하여 데이터를 클러스터링하고, 각 데이터 포인트가 속하는 클러스터를 df['Cluster'] 열에 저장합니다.
      kmeans = KMeans(n_clusters=optimal_k, random_state=0)
      df['Cluster'] = kmeans.fit_predict(scaled_features)
  3. 클러스터 결과 시각화:
    • plt.scatter 함수를 사용하여 클러스터 결과를 시각화합니다. 각 데이터 포인트의 색깔은 해당 포인트가 속하는 클러스터를 나타냅니다.
    • x축은 날짜, y축은 종가(Close Price)로 설정하여 주식 가격의 변동과 클러스터를 시각적으로 확인할 수 있습니다.
      plt.figure(figsize=(10, 5))
      plt.scatter(df.index, df['Close'], c=df['Cluster'])
      plt.title('Market Regime Clustering')
      plt.xlabel('Date')
      plt.ylabel('Close Price')
      plt.show()

[Output]


4. 클러스터 결과 해석

클러스터링 결과를 해석하여 각 클러스터가 어떤 시장 레짐을 나타내는지 분석합니다. 이를 위해 클러스터 중심값을 확인하고, 각 클러스터의 특성을 파악합니다.

# 클러스터 중심값 확인
cluster_centers = scaler.inverse_transform(kmeans.cluster_centers_)
for i, center in enumerate(cluster_centers):
    print(f'클러스터 {i}: 중심값 = {center}')

이 코드는 다음과 같은 과정을 통해 클러스터 중심값을 확인합니다:

  1. 클러스터 중심값 확인:
    • scaler.inverse_transform 메서드를 사용하여 표준화된 중심값을 원래 값으로 변환합니다.
    • 각 클러스터의 중심값을 출력하여 해당 클러스터가 어떤 시장 상태를 나타내는지 이해하는 데 도움을 줍니다.
    • 예를 들어, 클러스터 중심값이 높은 가격 변동을 나타낸다면 해당 클러스터는 변동성 시장을 의미할 수 있습니다.
   cluster_centers = scaler.inverse_transform(kmeans.cluster_centers_)
   for i, center in enumerate(cluster_centers):
       print(f'클러스터 {i}: 중심값 = {center}')

 

[Output]


결론

이번 주차 강의에서는 K-평균 클러스터링 알고리즘의 작동 원리를 상세히 이해하고, 이를 주식 시장 데이터에 적용하여 클러스터링을 수행하는 방법을 배웠습니다. 또한, 엘보우 방법을 사용하여 최적의 K 값을 선택하고, 클러스터링 결과를 시각화하고 해석하는 방법도 학습했습니다.

 

다음 주차 강의에서는 클러스터링 결과를 바탕으로 시장 레짐을 정의하고, 각 레짐에 맞는 거래 전략을 수립하는 방법을 학습하겠습니다.

 

여러분이 오늘 배운 내용을 토대로 실습을 해보세요. 클러스터링 알고리즘의 작동 원리를 이해하고 직접 데이터를 분석해보는 것은 매우 중요한 과정입니다. 다음 주에 더 흥미로운 내용으로 찾아뵙겠습니다!

 

질문 및 피드백: 강의 내용에 대한 질문이나 피드백이 있으시면 댓글로 남겨주세요. 이 강의가 마음에 드셨다면 ❤️ 한 번 꾹 눌러주세요! Happy coding!

 

다음강의 : [K-means clustering] 3.시장 레짐 정의 및 거래 전략 수립 (tistory.com)

 

[K-means clustering] 3.시장 레짐 정의 및 거래 전략 수립

3주차: 시장 레짐 정의 및 거래 전략 수립강의 목표: 이번 주차 강의에서는 K-평균 클러스터링을 통해 감지한 시장 레짐을 정의하고, 각 레짐에 맞는 거래 전략을 수립하는 방법을 학습합니다.1.

codeplayground.tistory.com

 

최근댓글

최근글

skin by © 2024 ttuttak