2주차: K-평균 클러스터링 개요 및 적용
강의 목표: 이번 주차 강의에서는 K-평균 클러스터링 알고리즘의 작동 원리를 상세히 이해하고, 이를 주식 시장 데이터에 적용하여 클러스터링을 수행하는 방법을 학습합니다.
1. K-평균 클러스터링 알고리즘의 단계
K-평균 클러스터링은 데이터를 유사한 그룹으로 나누기 위해 사용되는 비지도 학습 알고리즘입니다. 다음은 K-평균 클러스터링 알고리즘의 주요 단계입니다:
- K 값 선택:
- 클러스터의 수(K)를 설정합니다. 예를 들어, 3개의 클러스터로 나누고 싶다면 K=3으로 설정합니다.
- 초기 클러스터 중심 설정:
- K개의 초기 클러스터 중심(centroids)을 무작위로 선택합니다. 클러스터 중심은 각 클러스터의 중심 위치를 나타내는 점입니다.
- 클러스터 할당:
- 각 데이터 포인트를 가장 가까운 클러스터 중심에 할당합니다. 여기서 가장 가까운 중심은 유클리드 거리(Euclidean distance)를 사용해 계산합니다.
- 유클리드 거리: 두 점 사이의 직선 거리를 의미하며, n차원 공간에서 두 점 (x1, y1)과 (x2, y2) 사이의 거리는
sqrt((x2 - x1)² + (y2 - y1)²)
로 계산됩니다.
- 중심 업데이트:
- 각 클러스터의 평균값을 계산하여 새로운 중심으로 설정합니다. 이때 평균값은 클러스터에 속한 모든 데이터 포인트의 좌표 평균을 의미합니다.
- 반복:
- 클러스터 할당과 중심 업데이트를 중심이 더 이상 변하지 않을 때까지 반복합니다. 보통 몇 번의 반복(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 값을 선택하는 데 도움을 줍니다:
- 데이터 다운로드:
yfinance
라이브러리를 사용하여 Apple(AAPL) 주식 데이터를 다운로드합니다.start
와end
매개변수를 통해 원하는 기간의 데이터를 설정합니다.df = yf.download('AAPL', start='2023-01-01', end='2023-12-31') df = df[['Open', 'High', 'Low', 'Close', 'Volume']]
- 데이터 전처리:
- 결측치를 이전 값으로 채웁니다(
fillna(method='ffill')
). - 데이터를 표준화합니다(
StandardScaler
). 표준화는 데이터를 평균이 0이고 분산이 1인 형태로 변환합니다.df.fillna(method='ffill', inplace=True) scaler = StandardScaler() scaled_features = scaler.fit_transform(df)
- 결측치를 이전 값으로 채웁니다(
- 엘보우 방법 적용:
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-평균 클러스터링을 적용합니다:
- 최적의 K 값 선택:
- 엘보우 방법을 통해 최적의 K 값을 선택합니다. 예를 들어, 최적의 K 값이 3이라면
optimal_k = 3
으로 설정합니다.optimal_k = 3
- 엘보우 방법을 통해 최적의 K 값을 선택합니다. 예를 들어, 최적의 K 값이 3이라면
- 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)
- 클러스터 결과 시각화:
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}')
이 코드는 다음과 같은 과정을 통해 클러스터 중심값을 확인합니다:
- 클러스터 중심값 확인:
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] 4. 종합 예제 및 전략 검증 (0) | 2024.06.19 |
---|---|
[K-means clustering] 3.시장 레짐 정의 및 거래 전략 수립 (2) | 2024.06.18 |
[K-means clustering] 1. 인공지능을 활용한 주식 시장 레짐 감지 및 거래 전략 수립 (0) | 2024.06.17 |
[K-means clustering] 0. 인공지능을 활용한 주식 시장 레짐 감지 및 거래 전략 수립 (0) | 2024.06.17 |
[LSTM] 8. 주가 변동 방향 예측 (2) | 2024.06.13 |