GBT
한국외국어대학교Global Business & Technology
금융 AI · 모듈 14 — K-means 군집화 — 시장의 계절을 나누다
목차 강의 홈 ↗
금융 AI 강의 · 모듈 14

K-means 군집화 —
시장의 계절을 나누다

"지금이 무슨 장인가"라는 질문에는 정답 라벨이 없다. 그래서 발상을 뒤집는다 — 라벨을 주입하는 대신, 데이터가 스스로 뭉치는 모양을 보고 나서 이름을 붙인다. 60년 넘은 고전 K-means를 버튼 한 번에 한 단계씩 직접 굴려 보고, 이 단순한 방법에도 미래 정보가 스며드는 문이 두 개나 있다는 것까지 확인한다. 다음 모듈(레짐 스위칭)로 가는 디딤돌이 되는 이론 모듈이다.

금융 AI · 비지도 학습5개 절 + 실행형 실습해설 · 퀴즈 포함원문 출처 링크
0
2020년 3월, 서울

달력에 없는 계절

"오늘부터 하락장"이라고 적어 주는 달력은 없다. 국면의 라벨은 언제나 사후에, 사람마다 다른 기준으로 붙는다.

도입 · 한 장면

"지금이 무슨 장입니까"라는 질문에 아무도 같은 답을 하지 않았다

2020년 3월 19일, 코스피는 1,457까지 밀렸고 그 달에만 매매를 일시 중단시키는 서킷브레이커가 두 차례 발동됐다. 뉴스는 "약세장 진입"을 말했다. 그런데 불과 두 달 뒤, 같은 화면 앞의 사람들은 "강세장"을 말하고 있었다. 도대체 하락장은 언제 시작해서 언제 끝난 것일까.

사후적으로야 "2020년 3월은 폭락장이었다"고 말할 수 있다. 그러나 그 판정조차 기준이 제각각이다. 고점 대비 20% 하락을 약세장이라 부르는 관례가 있지만 왜 20%인지 근거는 없고, 시작일과 종료일을 어디로 잡을지도 사람마다 다르다. 레짐(시장 국면)은 애초에 누군가 정의해 둔 정답이 존재하지 않는 개념이다. 억지로 라벨을 만들어 지도학습을 시키면, 그 라벨에 들어간 자의적 기준이 그대로 모델의 한계가 된다.

그래서 이 모듈은 발상을 뒤집는다. 라벨을 사람이 만들어 주입하는 대신, 데이터가 스스로 뭉치는 모양을 먼저 보고 나중에 이름을 붙인다. 지금까지 기계에게 "정답 맞히는 법"을 가르쳤다면, 이제 정답 없이 "데이터의 생김새 자체"를 읽게 한다. 도구는 K-means라는 고전 하나면 충분하다.

K-means 군집화를 다룬 4컷 만화
여는 만화. 이 모듈의 핵심 질문을 압축한 예고편이다 — "지금이 무슨 장인가"에는 정답 라벨이 없는데, 기계는 무엇을 근거로 시장의 계절을 나눌 수 있는가. 만화의 답이 왜 "데이터가 스스로 뭉치게 한 뒤 사람이 이름을 붙인다"인지를 이 모듈에서 확인한다.
라벨 없이 배운다지도학습과 비지도 학습의 차이. 판단은 사라지는 게 아니라 라벨에서 좌표 선택으로 자리를 옮긴다
두 단계의 반복할당(가까운 중심으로)과 갱신(평균으로 이동). 이 반복이 왜 반드시 멈추는지, 어디에 멈추는지
여기도 컨닝 금지스케일러와 군집 중심 — 미래 정보가 스며드는 문이 두 개다. 전체 기간 학습은 룩어헤드다
더 읽기

이 모듈은 실험 플랫폼에 코드 모듈이 아직 없는 이론 모듈이다. 다음 모듈(레짐 스위칭)의 확률적 접근을 이해하기 위한 디딤돌로, "레짐을 데이터가 스스로 나누게 한다"는 발상을 가장 단순한 도구로 먼저 경험한다. 배우는 것은 알고리즘 하나가 아니라 사고방식의 전환이다 — 무엇이 비슷한지는 결국 사람이 정한 좌표가 결정한다는 것, 그리고 여기서도 미래 정보는 어김없이 스며들 수 있다는 것. 이 두 감각은 K-means를 손으로 굴려 봐야 몸에 붙는다.

생각해 볼 질문

"2022년은 하락장이었다"는 문장에 모두가 동의하더라도, 그 하락장의 시작일을 정확히 하루로 못 박으라고 하면 왜 답이 갈라질까. 이 모듈이 끝나면 "레짐 라벨은 왜 학습의 입력이 아니라 출력이어야 하는가"에 답할 수 있어야 한다.

1
지도학습에서 비지도 학습으로

라벨 없이 배우기 — 군집화라는 발상

군집화에는 자동 채점기가 없다. 사람의 판단은 사라지지 않고, 라벨 설계에서 좌표(피처) 선택으로 자리를 옮긴다.

개념 · 두 학습 방식

정답을 보고 배우기 vs 생김새를 읽기

팩터 랭킹 모듈메타레이블링 모듈은 모두 정답(다음 주 수익률, 신호의 성패)을 보고 배우는 지도학습이었다. "지금 시장이 어떤 국면인가"에는 그런 정답 라벨이 없다 — 이럴 때 쓰는 것이 비지도 학습, 그중에서도 비슷한 것끼리 뭉치게 하는 군집화(clustering)다.

구분지도학습 (랭킹 · 메타레이블링)비지도 학습 (이 모듈)
입력피처 + 정답 라벨피처만
기계가 배우는 것피처 → 정답의 대응 규칙데이터 자체의 구조(무리)
성적표정답과의 오차 (명확)"좋은 군집"의 기준 자체가 논쟁거리
사람의 역할라벨 설계피처(좌표) 선택과 사후 해석

표의 마지막 두 줄이 실전의 핵심이다. 지도학습은 틀리면 오차로 바로 드러나지만, 군집화에는 그런 자동 채점기가 없다. 결과가 그럴듯해 보여도 유용하다는 보장은 어디에도 없으므로, 해석과 검증의 책임이 고스란히 사람에게 남는다. 오토인코더 모듈이 정답 없이 "좋은 요약"을 배웠다면, 군집화는 정답 없이 "자연스러운 무리"를 찾는다 — 같은 비지도 학습의 두 얼굴이다.

더 읽기

"좋은 군집"의 기준이 논쟁거리라는 말을 가볍게 넘기면 안 된다. 지도학습에서는 검증 오차라는 단일 잣대가 모델 선택을 끌고 가지만, 군집화에서는 군집 내 거리 제곱합, 실루엣 계수(§2의 해설), 해석 가능성이 서로 다른 답을 가리키는 일이 흔하다. 이 애매함은 버그가 아니라 문제의 본질이다 — "무엇이 비슷한가"라는 질문 자체가 목적에 따라 달라지기 때문이다. 그래서 군집화 결과를 보고할 때는 "어떤 기준으로 좋다고 판단했는지"를 함께 밝히는 것이 정직한 관행이다.

직관 · 계절 비유

계절이 "저절로" 나뉘는 것은 좌표를 잘 골랐기 때문이다

기온·강수량·일조량을 매일 기록해 점으로 찍으면, 아무도 라벨을 붙이지 않아도 점들은 몇 개의 덩어리로 뭉친다. 우리는 그 덩어리에 나중에 "여름", "겨울"이라는 이름을 붙일 뿐이다. 시장도 같다 — 수익률·변동성·추세 지표를 좌표로 쓰면, 조용한 상승의 날들과 요동치는 하락의 날들은 서로 다른 곳에 뭉친다.

이 비유에서 놓치기 쉬운 대목이 하나 있다. 계절이 저절로 나뉘는 것처럼 보이는 이유는 우리가 기온과 일조량이라는 좋은 좌표를 골랐기 때문이다. 만약 "그날 뉴스 기사 개수"와 "지하철 승객 수"를 좌표로 썼다면 여름과 겨울은 뭉개져 섞였을 것이다. 군집화에서 "비슷하다"의 정의는 전적으로 어떤 피처를 좌표로 쓰느냐에 달려 있다. 알고리즘은 주어진 공간에서 거리를 잴 뿐, 어떤 공간이 의미 있는지는 말해 주지 않는다.

시장 레짐을 나눌 때 수익률과 변동성을 피처로 고르는 순간, 우리는 이미 "레짐이란 수익률과 변동성으로 구분되는 것"이라는 가설을 심은 셈이다. 비지도 학습이라고 해서 사람의 판단이 빠지는 것이 결코 아니다. 판단이 라벨에서 좌표 선택으로 자리를 옮겼을 뿐이다.

더 읽기

용어를 정리해 두자. 군집화는 비슷한 데이터끼리 그룹으로 묶는 비지도 학습이고, "무엇이 비슷한가"는 피처 공간에서의 거리로 정의된다. 비지도 학습은 정답 라벨 없이 데이터의 구조(무리, 요약, 밀도)를 찾는 학습의 총칭으로, 군집화와 차원 축소가 대표적이다. 이 정의를 그대로 뒤집으면 실무 체크리스트가 된다 — 군집 결과가 이상할 때 의심할 첫 번째 용의자는 알고리즘이 아니라 거리를 정의한 좌표다.

생각해 볼 질문

"시장의 계절"을 나누고 싶다. 수익률·변동성 외에 어떤 피처를 좌표에 추가하겠는가. 그 피처는 앞의 둘과 다른 정보를 담고 있는가, 아니면 사실상 같은 정보의 반복인가.

2
할당 · 갱신 · 반복

K-means — 두 단계의 반복

놀랄 만큼 단순한 두 단계가 군집 내 거리 제곱합을 매번 줄인다. 단, 도착지는 국소 최적까지만 보장된다.

알고리즘

가까운 중심으로 모이고, 중심은 평균으로 옮긴다

가장 널리 쓰이는 군집화 알고리즘이 K-means다. 군집 개수 \(k\)를 먼저 정하고, 두 단계를 수렴할 때까지 반복한다. 이름 그대로 "k개의 평균(means)"을 찾는다.

  1. 할당(assign) — 각 점을 가장 가까운 중심에 배정한다.
  2. 갱신(update) — 각 군집의 중심을 소속된 점들의 평균 위치로 옮긴다.
  3. 중심이 더 움직이지 않으면(할당이 더 바뀌지 않으면) 끝이다.

이 반복이 왜 항상 좋아지기만 할까. 두 단계가 각각 같은 양 — 각 점에서 자기 중심까지의 거리 제곱을 전부 더한 군집 내 거리 제곱합(WCSS, inertia) \( \sum_i \lVert x_i - c_{a(i)} \rVert^2 \) — 을 줄이거나 최소한 유지하기 때문이다. 할당 단계에서 점을 더 가까운 중심으로 옮기면 그 점의 거리 제곱은 당연히 줄어든다. 갱신 단계에서 중심을 평균으로 옮기는 것은, "점들과의 거리 제곱합을 최소로 만드는 한 점은 평균"이라는 수학적 성질 덕분에 역시 제곱합을 줄인다. 줄기만 하고 0 밑으로는 못 내려가는 양이므로 반복은 반드시 멈춘다. 다만 멈춘 곳이 전체에서 가장 좋은 답이라는 보장은 없다 — 바로 아래에서 확인한다.

더 읽기

오늘날 K-means라 불리는 절차는 1957년 벨 연구소의 스튜어트 로이드(Stuart Lloyd)가 신호를 적은 수의 대표값으로 압축하는 문제(양자화)를 풀며 고안했고, 논문은 1982년에야 정식 출판되었다. "k-means"라는 이름 자체는 1967년 맥퀸(MacQueen)의 논문에서 나왔다. 알고리즘의 한계도 태생에서 나온다. 첫째, 수렴이 보장되는 것은 국소 최적까지다. 초기 중심에 따라 다른 답에 멈추므로, 여러 초기값을 시도하거나 첫 중심들을 서로 멀리 떨어뜨려 뽑는 개선된 초기화(k-means++)가 표준이 되었다. 둘째, 거리 제곱합을 줄이는 구조상 K-means는 비슷한 크기의 둥근 덩어리를 찾는 데 최적화되어 있다. 길게 늘어진 군집, 크기가 극단적으로 다른 군집, 도넛처럼 속이 빈 모양은 잘 못 찾는다.

셋째, 평균을 쓰기 때문에 이상치에 민감하다. 평균은 극단값에 끌려가는 통계량이므로, 단 하루의 폭락 데이터가 군집 중심을 끌고 갈 수 있다. 금융 수익률에는 극단적인 날이 정규분포의 예상보다 훨씬 자주 나타나므로 이 민감성은 장식이 아니라 실전 이슈이고, 평균 대신 중앙값 계열 대표점을 쓰는 변형이 존재하는 이유이기도 하다.

출처 Lloyd, S. P. (1957년 작성, 1982년 출판). "Least Squares Quantization in PCM." IEEE Transactions on Information Theory 28(2). doi:10.1109/TIT.1982.1056489 · MacQueen, J. (1967). "Some Methods for Classification and Analysis of Multivariate Observations." Proc. 5th Berkeley Symposium.

손계산 · 1차원 다섯 점

손으로 굴려 보는 K-means — 그리고 초기값이 가르는 운명

1차원 점 5개면 전 과정을 손으로 따라갈 수 있다. 일일 수익률 −3, −2, 0, +2, +3(%)에 \(k=2\), 초기 중심을 −3과 +2에 두자.

단계초기 중심 (−3, +2)초기 중심 (0, +2)
할당{−3, −2} vs {0, +2, +3}{−3, −2, 0} vs {+2, +3}
갱신중심 −2.5 와 +1.67중심 −1.67 과 +2.5
재할당변화 없음 → 수렴변화 없음 → 수렴
결과0이 상승 무리에 속함0이 하락 무리에 속함
제곱합(WCSS)0.5 + 4.67 ≈ 5.174.67 + 0.5 ≈ 5.17

같은 데이터, 같은 \(k\)인데 초기 중심에 따라 0의 소속 — 곧 경계 — 이 달라졌다. 이 예시는 데이터가 좌우 대칭이라 우연히 점수가 같은 두 답이 나왔지만, 실제 데이터에서는 초기값에 따라 제곱합이 크게 다른 국소해에 멈추는 일이 흔하다. 그래서 실무에서는 초기값을 바꿔 여러 번 돌리고 제곱합이 가장 작은 결과를 채택한다.

더 읽기

왼쪽 열을 끝까지 검산해 보자. 할당 {−3, −2} vs {0, +2, +3} 뒤 갱신하면 중심은 (−3−2)/2 = −2.5 와 (0+2+3)/3 ≈ +1.67. 재할당에서 0은 −2.5까지 거리 2.5, +1.67까지 1.67이므로 그대로 상승 무리 — 수렴이다. 제곱합은 왼쪽 군집 (−3+2.5)² + (−2+2.5)² = 0.5, 오른쪽 군집 (0−1.67)² + (2−1.67)² + (3−1.67)² ≈ 4.67, 합 ≈ 5.17. 오른쪽 열도 같은 방식으로 4.67 + 0.5 ≈ 5.17이 나온다.

한 가지 주의 — 초기 중심을 (−3, +3)처럼 정확히 대칭으로 두면 0이 두 중심과 등거리가 되어, 어느 쪽에 배정할지는 동률 처리 규칙이라는 구현 세부에 달리게 된다. 손계산 예시의 초기값을 (−3, +2)로 둔 것은 그 모호함을 피하기 위해서다. 실제 라이브러리들도 동률을 임의로 깨므로, "같은 데이터인데 결과가 다르다"는 현상의 범인은 종종 이런 사소한 규칙이다.

실무 감각 · 표준화와 k

단위를 맞추지 않으면 거래량이 거리를 독점한다

두 가지 실무 감각이 필요하다. 첫째, 거리를 재려면 단위를 맞춰야 한다. 둘째, \(k\)는 알고리즘이 아니라 사람이 정한다.

어느 날 A는 수익률 +2%, 거래량 500만 주였고, 날 B는 수익률 −2%, 거래량 505만 주였다고 하자. 원 단위 그대로 거리를 재면 수익률 차이는 4, 거래량 차이는 50,000이다. 거리의 사실상 전부가 거래량에서 나오고, 수익률 부호가 정반대라는 결정적 차이는 소수점 아래로 사라진다. 그래서 페어트레이딩 모듈의 z-값, k-NN 모듈의 z-정규화와 정확히 같은 이유로, 각 피처를 표준화(평균 0, 표준편차 1)한 뒤 거리를 잰다. 손계산 하나 — 최근 5일 수익률이 −1, 0, +1, +2, +3(%)이고 오늘이 +3이면, 평균 +1, 표준편차 \( \sqrt{2} \approx 1.41 \)이므로 오늘의 z-값은 (3−1)/1.41 ≈ +1.41, "평균보다 표준편차 1.4개만큼 높은 날"이다.

\(k\)는 늘릴수록 군집 내 거리가 기계적으로 줄므로 "많을수록 좋다"가 아니다. 극단을 생각하면 자명하다 — \(k\)를 데이터 개수만큼 늘리면 모든 점이 자기 자신을 중심으로 갖는 군집이 되어 제곱합은 0이 된다. 완벽한 점수지만 아무것도 요약하지 못한 무의미한 답이다. 전향 평가 모듈의 과적합과 같은 구조로, 지표를 기계적으로 좋게 만드는 방향과 쓸모 있는 모델의 방향은 다르다. 관례는 \(k\)를 하나씩 늘리며 개선 폭이 급격히 꺾이는 지점(팔꿈치)을 찾는 엘보 방법이고, 시장 레짐 용도로는 해석 가능한 2~4가 보통이다.

더 읽기 · 엘보가 안 보일 때, 실루엣 계수

엘보 방법의 약점은 곡선이 완만해 팔꿈치가 애매한 경우가 많다는 것이다. 보완책으로 널리 쓰이는 것이 실루엣 계수다. 각 점에 대해 "자기 군집 동료들과의 평균 거리 \(a\)"와 "가장 가까운 남의 군집과의 평균 거리 \(b\)"를 재서 \( (b-a)/\max(a,b) \)를 계산한다. 자기 군집에 딱 붙어 있고 남의 군집과 멀수록 +1에 가깝고, 경계에 걸쳐 있으면 0, 남의 군집이 오히려 가까우면 음수다. 전체 평균 실루엣이 가장 높은 \(k\)를 고르면 "뭉침의 또렷함"을 기준으로 \(k\)를 정하는 셈이다.

다만 시장 레짐처럼 군집 사이 경계가 원래 흐릿한 데이터에서는 어떤 지표를 써도 \(k\)가 칼같이 정해지지 않는다. 그래서 이 강의는 통계 지표보다 "해석 가능한 2~4 중에서 목적에 맞게 고르고, 그 선택도 자유도의 하나로 정직하게 세라"는 태도를 권한다(§4).

출처 Rousseeuw, P. J. (1987). "Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis." J. Computational and Applied Mathematics 20. doi:10.1016/0377-0427(87)90125-7 · Arthur, D. & Vassilvitskii, S. (2007). "k-means++: The Advantages of Careful Seeding." SODA 2007. theory.stanford.edu (PDF)

L
직접 굴려 본다

K-means 실험실

고정된 30일치 점 위에서, 할당→갱신을 버튼 한 번에 한 단계씩. 몇 번 만에 멈추는지, 멈춘 군집에 이름이 있는지 눈으로 확인한다.

실습 · 실행형

버튼 한 번 = 반복 한 사이클

LAB · K-MEANS 한 단계씩

수익률 × 변동성 평면의 30일, 그리고 k개의 중심

목표 — 할당→갱신의 반복이 몇 번 만에 수렴하는지, 그리고 수렴한 군집 번호에는 아무 이름도 없다는 것을 눈으로 확인한다. 점 30개는 고정된 합성 데이터(가상의 30일: 가로 = 하루 수익률 %, 세로 = 그날의 변동성 %)이고, 초기 중심은 일부러 전부 오른쪽 아래 덩어리 안에 겹쳐 두었다 — 난수는 쓰지 않으므로 누가 돌려도 같은 과정이 재현된다.

군집 0 군집 1 군집 2 군집 3 ◆ = 군집 중심

조작 안내 — k=3에서 "할당→갱신 한 단계"를 반복해 누른다. 수렴 후 "처음부터"를 누르고 k=2, k=4로도 돌려 본다. 관찰 포인트 — ① 제곱합(WCSS)이 클릭마다 단조 감소한다: k=3이면 39.8 → 6.8 → 3.7, 그리고 네 번째 클릭에서 아무것도 바뀌지 않는다 — 그것이 수렴이다(k=2는 여섯 번째, k=4는 다섯 번째 클릭에서 수렴). ② 수렴한 화면에서 기계가 아는 것은 "군집 0·1·2"라는 번호와 각 군집의 평균 피처뿐이다. readout의 평균 수익률·평균 변동성을 보고 "상승장 / 하락장 / 횡보장"이라는 이름을 붙이는 것은 지금 화면을 보고 있는 사람이다. ③ k=2는 상승과 횡보 덩어리를 하나로 뭉개고(WCSS 10.4), k=4는 자연스러운 덩어리 하나를 5일 + 5일로 억지로 쪼갠다(WCSS 3.2). k=2→3에서 제곱합이 크게 꺾이고(10.4→3.7) k=3→4에서는 조금밖에 안 준다(3.7→3.2) — 방금 엘보 방법으로 k=3을 고른 것이다.

더 읽기

초기 중심을 일부러 한 덩어리 안에 몰아 둔 것은 실전에서 흔한 "나쁜 초기화"의 재현이다. 그런데도 이 데이터에서는 몇 단계 만에 자연스러운 세 덩어리를 찾아낸다 — 덩어리들이 서로 충분히 떨어져 있기 때문이다. 항상 그런 것은 아니다. 같은 30개 점에 k=4로 다른 초기값(각 덩어리에 하나씩 + 하락 덩어리에 하나 더)을 주면 하락 덩어리가 4일 + 6일로 쪼개진 채 제곱합 3.11에 수렴한다. 위 실습의 k=4가 도착한 3.16과 다른 국소해다. 어느 쪽도 "틀린" 실행이 아니고, 실무는 그저 여러 초기값 중 제곱합이 가장 작은 답을 채택한다.

이 실습의 좌표는 표준화를 생략했는데, 두 축이 이미 비슷한 크기(퍼센트 단위 한 자릿수)라서다. 실제 데이터에서 수익률과 거래량처럼 척도가 다른 피처를 섞는 순간, §2의 표준화가 선택이 아니라 전제가 된다.

3
피처 → 군집 → 명명

시장의 계절 나누기 — 군집으로 레짐 정의

절차는 세 단계 — 피처 만들기, 표준화 후 K-means, 그리고 사람이 이름 붙이기. 이름은 언제나 사후 해석이다.

절차

날마다 시장의 상태를 요약하고, 뭉치게 하고, 이름 붙인다

절차는 세 단계다. ① 피처 만들기 — 날짜마다 시장 상태를 요약하는 숫자들을 계산한다. ② 표준화 후 K-means — 예컨대 \(k=3\)으로 군집화한다. ③ 해석과 명명 — 각 군집의 평균 피처를 보고 사람이 이름을 붙인다.

피처레짐의 어떤 얼굴을 비추나
최근 수익률방향 — 오르는 중인가
변동성온도 — 얼마나 요동치는가
이동평균 괴리 (이동평균 모듈)추세의 성숙도 — 단기가 장기를 얼마나 앞질렀나
RSI (상대강도지수)쏠림 — 한쪽으로 과하게 달렸나. 최근 상승폭·하락폭 비율을 0~100으로 요약
볼린저밴드 폭긴장도 — 이동평균 위아래 표준편차 띠의 폭 자체가 변동성의 척도

서로 다른 각도의 요약을 함께 좌표로 써야 "조용히 오르는 날"과 "요동치며 오르는 날"처럼 방향은 같아도 체질이 다른 국면이 분리된다. 반대로 거의 같은 정보를 담은 피처를 여럿 겹쳐 넣으면(예: 5일 수익률과 6일 수익률) 그 방향의 거리만 이중으로 세어져 군집이 그쪽으로 왜곡된다. 피처 목록은 길수록 좋은 것이 아니라 서로 다른 정보일수록 좋다.

더 읽기 · 군집 해석 연습

\(k=3\)으로 돌렸더니 각 군집의 평균 피처가 다음과 같았다고 하자. 군집 0: 수익률 +0.08%/일, 변동성 0.7%, RSI 62. 군집 1: 수익률 −0.15%/일, 변동성 2.1%, RSI 35. 군집 2: 수익률 +0.01%/일, 변동성 1.0%, RSI 50. 읽는 법 — 군집 0은 완만히 오르고 조용하며 매수 우위이니 "상승장". 군집 1은 하루 −0.15%씩 흘러내리며 변동성이 세 배이니 "하락장". 군집 2는 방향도 쏠림도 없는 "횡보장"이다.

눈여겨볼 점은 하락 군집의 변동성(2.1%)이 상승 군집(0.7%)의 세 배라는 것이다. "내릴 때는 요동치며 내린다"는 시장의 오래된 비대칭이, 라벨 없이도 군집 구조로 드러난다. 코스피에 이 절차를 돌려 보면 2020년 3월의 급락기나 2022년의 긴 하락 구간은 대체로 "수익률 음(−), 변동성 높음" 군집에, 2020년 하반기~2021년 초의 강한 반등기는 "수익률 양(+)" 군집에 몰리는 결과를 얻게 된다. 다만 경계 부근의 날들은 군집이 수시로 바뀌며 라벨이 며칠 단위로 튀는 것도 함께 보게 되는데, 이 "튐"이야말로 §5에서 말할 K-means의 본질적 한계다.

주의 · 번호와 이름

군집 번호에는 이름이 없다

군집 번호는 그냥 0, 1, 2다. "상승장"이라는 이름은 사람이 사후에 붙인 해석이고, 데이터를 바꿔 다시 돌리면 번호는 뒤섞인다. 이름이 아니라 군집의 평균 피처(수익률·변동성)가 본질이다.

이것은 실무에서 실제로 사고가 나는 지점이다. 어제까지 "군집 0 = 상승장"이던 코드가, 데이터를 하루 늘려 재학습하자 같은 성격의 군집이 번호 2를 달고 나오는 일은 흔하다(초기화의 무작위성 때문이다). 번호를 하드코딩해 "군집 0이면 매수"라고 짜 두었다면 전략은 조용히 반대로 뒤집힌다. 안전한 습관은 재학습 때마다 군집들의 평균 수익률을 비교해 가장 높은 군집을 "상승", 가장 낮은 군집을 "하락"으로 매번 다시 명명하는 것이다. 번호가 아니라 성격으로 식별한다.

레짐을 나눴다면 전략은 자연스럽다 — 상승 군집에서는 공격(모멘텀 매수), 하락 군집에서는 방어(현금·저변동), 횡보 군집에서는 보유 또는 평균회귀. 레짐 앙상블 모듈이 이 발상을 확률 배합으로 다듬는다.

더 읽기

실습에서 이미 겪었다 — 수렴 화면의 readout이 보여 주는 것은 "군집 0: 10일, 평균 수익률 +1.05%, 평균 변동성 0.82%" 같은 통계뿐이고, 그것을 "상승장"이라 부른 것은 화면 앞의 사람이었다. 색깔조차 번호를 따라간 우연일 뿐이다. 이 감각은 다음 모듈의 HMM에서도 한 글자도 달라지지 않는다 — 은닉 "상태 1"이 강세인지 약세인지는 언제나 추정된 파라미터를 보고 사람이 사후에 판정한다.

4
스케일러 · 중심 · 자유도

함정 — 여기서도 미래는 컨닝 금지

전체 기간으로 스케일러와 군집 중심을 학습하면 룩어헤드다. 미래가 스며드는 문이 두 개라는 것까지 짚는다.

함정 ① · 룩어헤드

미래가 스며드는 문은 두 개다

이 단순한 방법에도 이 강의의 제1 규칙이 그대로 적용된다. 전체 기간 데이터로 스케일러와 군집 중심을 한 번에 학습하면 룩어헤드다. 2020년의 어느 날을 "하락장"으로 분류할 때 쓰인 군집 중심이 2024년까지의 데이터로 계산된 것이라면, 그 분류에는 미래가 스며들어 있다.

널리 퍼진 오해

"군집화는 예측이 아니라 그냥 나누는 것이니, 전체 기간으로 학습해서 백테스트에 써도 괜찮다."

괜찮지 않다. 미래가 스며드는 문이 두 개나 있다. 첫째 문은 스케일러다 — 표준화에 쓰는 평균과 표준편차를 전체 기간으로 계산하면, 2020년의 변동성 4%를 "미래까지 통틀어 상위 몇 %인지" 알고 자리매김하는 셈이다. 둘째 문은 군집 중심 그 자체다 — 2022년 하락장의 데이터가 "하락 군집"의 중심을 또렷하게 만들어 준 덕에 2020년의 분류가 쉬워졌다면, 미래가 과거의 시험을 도와준 것이다. k-NN 모듈에서 이웃을 찾을 때 미래 조각을 제외해야 했던 것, 다음 모듈에서 스무딩이 금지되는 것과 완전히 같은 구조다.

올바른 방법은 확장 윈도 재학습이다. 매 시점 \(t\)에서 \(t\)까지의 데이터만으로 평균·표준편차·군집 중심을 전부 다시 계산해 그날 하루만 분류하고, 다음 날 또다시 계산한다. 번거롭고 초기 구간은 데이터가 적어 군집이 불안정하지만, 이것이 "그 시점에 실제로 알 수 있었던 것"의 정직한 재현이다. K-means는 계산이 가벼워 매일 재학습해도 부담이 거의 없다는 점이 이 방식과 잘 맞는다.

더 읽기 · 감각 실험

룩어헤드의 크기를 몸으로 재는 실험 하나 — 2015~2024년 전체로 학습한 군집과, 각 시점까지의 데이터로만 학습한 군집이 같은 날짜에 다른 라벨을 붙이는 비율을 세어 보라. 이 비율이 곧 "전체 학습 백테스트"가 부풀린 정보량의 크기다. 비율이 0에 가깝다면 그 데이터에서는 운 좋게 피해가 작았던 것이고, 크다면 전체 학습 백테스트의 성과 곡선은 실전에서 재현되지 않을 숫자다.

함정 ② ③ · 자유도와 착각

수십 개의 조합, 그리고 "묘사"를 "예측"으로 착각하기

둘째 함정은 자유도다. 피처 선택, \(k\), 표준화 방식의 조합이 수십 가지이고, 과거에 가장 그럴듯한 조합 하나를 골라 보고하면 전향 평가 모듈의 선택 편향이 그대로 재현된다. 셋째, 군집은 원인을 말해 주지 않는다 — 군집화는 묘사이지 예측이 아니다.

"묘사이지 예측이 아니다"를 한 번 더 눌러 두자. 오늘을 하락 군집으로 분류했다는 것은 "오늘이 과거의 하락일들과 닮았다"는 뜻일 뿐이다. 이 정보가 돈이 되려면 "하락 군집에 속한 날의 다음 날 수익률 분포가 실제로 다르다"는 별도의 사실이 성립해야 하고, 그것은 군집화가 아니라 시점별 재학습으로 만든 라벨을 놓고 OOS(표본외)에서 따로 검증해야 할 명제다. 흔한 착각 하나 더 — 군집이 예쁘게 나뉘었다(제곱합이 작다)는 것과 그 군집이 투자에 유용하다는 것은 완전히 별개다. 전자는 기하학의 성적표이고, 후자는 경제적 가설의 성적표다.

자유도 함정의 실용적 방어책도 지도학습 때와 같다. 피처 목록·\(k\)·표준화 방식을 백테스트 성과를 보기 전에 근거를 들어 고정하고, 시도한 조합의 개수를 정직하게 기록하며, 최종 후보 하나만 아껴 둔 OOS 구간에서 단 한 번 평가한다.

더 읽기

"\(k=3\)이 제일 좋길래 골랐다"와 "레짐을 상승·하락·횡보로 해석하려고 \(k=3\)을 먼저 정했다"는 결과가 같아도 증거의 무게가 전혀 다르다. 전자는 수십 번의 시도 중 살아남은 우연일 수 있지만, 후자는 사전에 세운 가설의 검증이다. 백테스트 성적이 아니라 사전 근거로 선택을 고정하는 습관은, 비지도 학습이라고 면제되지 않는다.

생각해 볼 질문

확장 윈도 재학습을 하면 초기 구간의 군집이 불안정하다고 했다. 이 불안정을 줄이겠다고 "처음 3년은 전체 기간 중심을 빌려 쓰자"고 제안하는 동료가 있다면, 무엇이라고 답하겠는가.

5
다음 모듈로 가는 다리

거리에서 확률로

K-means는 시간을 통째로 버리고, 회색을 표현할 언어가 없다. 이 두 한계가 은닉 마르코프 모형의 출발점이다.

한계 → 다음 도구

어제를 기억하지 못하는 분류기

K-means 레짐에는 본질적 한계가 있다. 오늘의 라벨은 오늘 좌표와 중심 사이의 거리만으로 정해진다. "어제까지 상승장이었다"는 사실은 전혀 반영되지 않고, 라벨이 하루 만에 튀어도 막을 장치가 없다. 그런데 실제 시장 국면은 끈끈하다 — 강세장은 몇 달씩 이어지고, 약세장도 하루 만에 끝나지 않는다.

데이터의 눈으로 보면 이렇다. K-means에게 날짜는 순서 없는 점 구름일 뿐이어서, 데이터를 시간순으로 넣든 뒤섞어 넣든 결과가 완전히 같다. 시계열을 다루면서 시간을 통째로 버리는 셈이다. 또 하나, K-means의 답은 "무조건 한 군집"이라는 딱딱한 라벨이다. 중심 두 개의 정확히 중간에 있는 애매한 날도, 중심에 딱 붙은 확실한 날과 똑같이 한 표를 받는다. "60%쯤 상승장 같다"는 회색을 표현할 언어가 없으니, 경계 부근에서 라벨이 덜컹거리고 그때마다 전략이 매수·매도를 오가며 거래비용(모듈 1)을 갉아먹는다.

시간의 구조(국면의 지속성, 전환 확률)를 정면으로 모형화하는 것이 다음 모듈의 은닉 마르코프 모형(HMM)이다. 딱딱한 라벨 대신 "오늘이 강세일 확률 P"라는 연속량을 주기 때문에, 배합 전략(레짐 앙상블 모듈)으로도 자연스럽게 이어진다.

더 읽기

그렇더라도 K-means로 얻은 감각은 그대로 이월된다. 레짐을 데이터가 나누게 한다는 발상, 표준화와 시점별 재학습의 규율, 그리고 군집(상태)에 이름을 붙이는 것은 언제나 사람의 사후 해석이라는 사실 — 이 셋은 HMM에서도 한 글자도 달라지지 않는다. 도구가 거리에서 확률로 바뀔 뿐, 규칙은 같다.

확인

퀴즈와 정리

답을 보기 전에 먼저 스스로 답해 본다. 전부 이 모듈 안에서 다룬 내용이다.

군집화가 팩터 랭킹 학습과 근본적으로 다른 점은?
정답 라벨 없이 배우는 비지도 학습이다. 피처 → 정답의 대응 규칙이 아니라 데이터 자체의 구조(무리)를 찾고, 그래서 자동 채점기가 없어 해석·검증의 책임이 사람에게 남는다.
수익률과 거래량을 표준화 없이 K-means에 넣으면 무슨 일이 생기는가?
척도가 큰 거래량이 거리를 독점해 사실상 거래량만으로 군집이 정해진다. 수익률 +2%와 −2%라는 결정적 차이가 거래량 5만 주 차이에 묻힌다. 각 피처를 표준화(평균 0, 표준편차 1)한 뒤 거리를 재야 한다.
2024년까지 전체 데이터로 학습한 군집 중심으로 2020년을 분류하는 백테스트의 문제는?
군집 중심에 미래 정보가 스며든 룩어헤드다. 문은 두 개 — 전체 기간으로 계산한 스케일러(평균·표준편차)와 군집 중심 자체. 시점별 확장 윈도 재학습(매 시점 그때까지의 데이터로만 표준화·군집화)으로 해결한다.
k를 데이터 개수만큼 크게 잡으면 군집 내 거리 제곱합은 0이 된다. 왜 이것이 좋은 모델이 아닌가?
모든 점이 저마다 자기 군집이 되어 아무 요약도 하지 못한다. 지표만 기계적으로 좋아진 과적합과 같은 구조다. 그래서 k는 엘보(개선 폭이 꺾이는 지점)나 해석 가능성을 근거로 사람이 정한다.
재학습할 때마다 "군집 0"의 의미가 바뀌어 전략이 뒤집히는 사고를 막는 안전한 습관은?
번호를 하드코딩하지 않는다. 재학습 때마다 각 군집의 평균 피처(예: 평균 수익률)를 보고 가장 높은 군집을 "상승", 가장 낮은 군집을 "하락"으로 매번 다시 명명한다 — 번호가 아니라 성격으로 식별한다.
초기 중심을 바꿔 돌렸더니 서로 다른 군집 결과가 나왔다. 어느 쪽을 채택해야 하는가?
군집 내 거리 제곱합(WCSS)이 더 작은 쪽이다. K-means의 수렴은 국소 최적까지만 보장되므로, 여러 초기값으로 돌리고 목적함수가 가장 좋은 답을 고르는 것이 표준 관행이다(개선된 초기화 k-means++도 같은 문제의식에서 나왔다).
K-means 레짐이 HMM 레짐보다 못 담는 것은?
시간 구조 — 국면의 지속성과 전환 확률이다. K-means는 매일 독립적으로 거리만 재므로 데이터를 뒤섞어 넣어도 결과가 같고, 라벨이 하루 만에 튀는 것을 막을 장치도, "60%쯤 상승장"이라는 회색을 표현할 언어도 없다.
핵심 정리

① 군집화 = 정답 라벨 없이 비슷한 날들을 뭉치게 하는 비지도 학습이다. 레짐에 정답 달력은 없고, "무엇이 비슷한가"는 피처(좌표) 선택이 결정한다 — 사람의 판단은 라벨에서 좌표로 자리를 옮길 뿐이다.

② K-means는 할당(가까운 중심)과 갱신(평균 이동)의 반복이다. 제곱합은 단조 감소하므로 반드시 멈추지만, 도착지는 국소 최적까지만 보장된다 — 초기값을 바꿔 여러 번 돌리고 제곱합이 가장 작은 답을 쓴다. 표준화가 전제이고, k는 사람이 정한다.

③ 군집 번호에 "상승장" 이름을 붙이는 것은 사후 해석이다. 본질은 군집의 평균 피처이고, 재학습 때마다 성격으로 다시 명명한다.

④ 전체 기간으로 스케일러·중심을 학습하면 룩어헤드다(문이 두 개). 시점별 확장 윈도 재학습이 원칙이고, 군집이 예쁘게 나뉘는 것과 투자에 유용한 것은 별개다 — 유용성은 OOS에서 따로 검증한다.

⑤ K-means는 거리만 보고 시간 구조를 못 본다. 그 한계가 다음 모듈 HMM의 출발점이다.

원문으로 확인하기

참고문헌

연도와 알고리즘 서술은 아래 원문 기준이다. 링크는 공개 원문 또는 공식 등록처(DOI)가 확실한 것만 달았다.

원전 · 알고리즘

  1. Lloyd, S. P. (1957년 작성, 1982년 출판). "Least Squares Quantization in PCM." IEEE Transactions on Information Theory 28(2). doi.org/10.1109/TIT.1982.1056489 — 오늘날 K-means라 불리는 반복 절차의 원전. 벨 연구소의 신호 양자화 문제에서 출발했다.
  2. MacQueen, J. (1967). "Some Methods for Classification and Analysis of Multivariate Observations." Proceedings of the 5th Berkeley Symposium on Mathematical Statistics and Probability. — "k-means"라는 이름의 출처.
  3. Arthur, D. & Vassilvitskii, S. (2007). "k-means++: The Advantages of Careful Seeding." Proceedings of SODA 2007. theory.stanford.edu (저자 공개 PDF) — 초기 중심을 서로 멀리 뽑는 표준 초기화.
  4. Rousseeuw, P. J. (1987). "Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis." Journal of Computational and Applied Mathematics 20. doi.org/10.1016/0377-0427(87)90125-7 — 실루엣 계수의 원전.

이 모듈의 실습 수치는 고정된 합성 데이터(가상의 30일 좌표)에 대한 결정론적 계산이며, 실제 시장 데이터나 투자 성과를 시사하지 않는다. 군집 해석 연습의 수치도 설명을 위한 가상 예시다. 도입부의 코스피 1,457(2020년 3월 19일 종가 1,457.64)과 그 달의 서킷브레이커 발동은 한국거래소 공시 기준의 사실이다. "고점 대비 20% 하락 = 약세장"은 근거 있는 정의가 아니라 관례로 서술했다. 인용 원칙: 연도는 발표(작성)와 출판이 다른 경우 병기했다.