
AI 투자 실험실을 진행하면서 한동안 criteria에 오래 머물렀다. 데이터를 모으고, 기준을 적용하고, 후보를 뽑고, 이후 기간을 복기했다. 자연스럽게 다음 단계는 v0.4 기준을 만드는 일이라고 생각했다.
그런데 결론은 예상과 달랐다.
v0.4는 만들지 않는다.
거래량 기준도 다시 봤고, ranking 방식도 바꿔봤다. 하지만 새 기준을 만들 만큼 강한 근거는 나오지 않았다. 그래서 이번에는 기준을 더 늘리는 대신, 뽑힌 후보를 어떻게 볼지로 방향을 바꾸기로 했다.
criteria는 완성된 매매 기준이 아니라 1차 필터다. 그렇다면 이제 중요한 질문은 “기준을 얼마나 더 정교하게 만들까?”가 아니라 “이 기준이 뽑은 후보를 어떤 정보와 함께 확인할까?”에 가까워졌다.
후보 중심 복기만으로는 부족했다
이전까지는 criteria를 통과한 관찰 후보를 중심으로 복기했다. v0.2나 v0.3 기준을 통과한 후보를 저장하고, 다음 기간에 그 후보들이 어떻게 움직였는지 확인하는 방식이었다.
이 방식은 필요하다. 내가 만든 기준이 어떤 후보를 골랐는지, 그리고 그 후보들이 이후에 어떤 흐름을 보였는지 확인할 수 있기 때문이다.
다만 한계도 있었다. 이미 기준을 통과한 후보만 보고 있었다.
기준 밖에 있던 종목은 분석에서 빠진다. 기준을 통과하지 못했지만 이후 흐름이 좋았던 종목도 있었을 수 있고, 반대로 기준을 통과했지만 별다른 의미가 없었던 후보도 있었을 수 있다.
그래서 질문을 바꿨다.
“관찰 후보 중 이후 흐름이 나았던 종목은 어떤 특징이 있었나?”가 아니라, “전체 샘플 중 이후 흐름이 나았던 종목은 관찰 당시 어떤 특징이 있었나?”를 보기로 했다.
전체 샘플 기준으로 다시 봤다
월별 전체 50개 샘플을 기준으로 관찰 기간의 feature와 다음 기간의 결과를 연결했다.
관찰 기간에서 본 값은 세 가지였다.
| 구분 | 확인한 값 |
|---|---|
| 가격 흐름 | 관찰 기간 수익률 |
| 거래량 | 평균 대비 거래량 비율 |
| 변동성 | KOSPI 변동폭 대비 종목 변동폭 비율 |
그리고 다음 기간에는 해당 종목의 이후 수익률, KOSPI 대비 차이, 전체 샘플 평균 대비 차이를 계산했다.
이렇게 보니 기준을 통과한 후보만 볼 때보다 시야가 넓어졌다. 전체 샘플 안에서 상대적으로 흐름이 나았던 종목들이 관찰 당시 어떤 모습을 보였는지 확인할 수 있었다.
결과를 정리해보니 거래량 비율은 계속 볼 만한 feature였다. KOSPI 대비 기준에서도, 전체 샘플 평균 대비 기준에서도 긍정적인 방향으로 나타난 경우가 상대적으로 많았다.
하지만 바로 기준을 바꿀 정도는 아니었다. 일부 기간에서는 방향이 갈렸고, 전체 샘플 기준 분석과 후보 중심 복기 결과가 항상 같지도 않았다.
거래량은 중요했지만, 기준으로 확정하기는 어려웠다
이번 분석에서 가장 눈에 들어온 값은 observation_volume_ratio였다. 관찰 기간의 최근 거래량이 평균 거래량에 비해 얼마나 늘었는지를 보는 값이다.
기존에도 거래량은 중요하게 봤다. 가격만 움직이는 것보다 거래량이 같이 붙는 흐름이 더 자연스럽다고 생각했기 때문이다.
하지만 거래량 비율이 높다고 항상 이후 흐름이 좋았던 것은 아니었다. 관찰 기간 수익률도 마찬가지였다. 많이 오른 종목이 다음 기간에도 계속 좋았다고 단정하기 어려웠다.
KOSPI 대비 변동폭 비율도 애매했다. 시장보다 덜 흔들린 종목이 항상 좋았던 것도 아니고, 더 크게 움직인 종목이 항상 나빴던 것도 아니었다.
그래서 거래량을 criteria 조건으로 바로 강화하기보다, ranking 쪽에서 먼저 실험해보기로 했다.
volume_weighted ranking을 추가해봤다
기존에는 top-N 관찰 후보를 볼 때 volume_first와 stability_first를 사용했다.
volume_first는 거래량 비율이 높은 후보를 먼저 보는 방식이다. stability_first는 시장 대비 변동폭이 낮은 후보를 먼저 보는 방식이다.
이번에는 여기에 volume_weighted ranking을 추가했다.
volume_weighted는 거래량만 보는 방식은 아니다. 거래량 비율을 가장 크게 반영하되, 시장 대비 변동폭과 관찰 기간 수익률도 함께 점수에 넣었다.
구조는 단순하게 잡았다.
| 항목 | 가중치 |
|---|---|
| 거래량 비율 | 0.5 |
| 시장 대비 변동폭 안정성 | 0.3 |
| 관찰 기간 수익률 | 0.2 |
이 ranking은 새로운 criteria가 아니다. 기존 v0.3 기준을 통과한 후보 안에서 관찰 우선순위만 바꿔본 것이다. 후보를 새로 탈락시키거나 기준값을 바꾸지는 않았다.
결과는 volume_first와 거의 같았다
v0.3 기준으로 volume_first, stability_first, common, volume_weighted를 같은 기간에서 비교했다.
결과는 단순했다.
volume_weighted는 volume_first와 거의 같은 후보군을 보여줬다. 평균 overlap ratio는 0.97이었다. exclusive 후보를 따로 봐도 volume_weighted에만 있는 후보가 총 3개, volume_first에만 있는 후보도 총 3개뿐이었다.
반대로 차이가 더 컸던 쪽은 volume 계열과 stability_first 사이였다.
| 비교 | exclusive 후보 |
|---|---|
| volume_weighted vs volume_first | 각각 3개 |
| volume_weighted vs stability_first | 각각 14개 |
| volume_first vs stability_first | 각각 15개 |
결국 volume_weighted는 완전히 새로운 관점이라기보다, volume_first를 점수 방식으로 약간 보정한 ranking에 가까웠다.
이 결과를 보고 v0.4의 핵심 근거로 삼기에는 약하다고 판단했다.
이번 결론은 분명했다
v0.4는 만들지 않는다.
거래량 비율은 계속 볼 만한 신호였다. 하지만 기준값을 더 올리거나 새로운 criteria config를 만들 정도로 강한 근거는 아니었다.
volume_weighted ranking도 실험해볼 가치는 있었다. 하지만 volume_first와 후보 구성이 거의 같았기 때문에, 별도 ranking을 기준 개선의 핵심으로 삼기는 애매했다.
억지로 기준을 하나 더 만들 수도 있었다. 거래량 기준을 더 높이거나, 변동폭 기준을 조정하거나, ranking 가중치를 다시 바꿔볼 수도 있었다.
하지만 그렇게 하면 기준을 개선하는 것이 아니라 결과에 맞춰 숫자를 계속 만지는 쪽으로 흐를 수 있다.
그래서 이번에는 기준을 추가하지 않고 멈췄다.
후보가 많이 나온 기간도 따로 봤다
기준을 바로 바꾸지 않기로 했지만, 후보가 많이 나오는 기간은 따로 확인했다. criteria가 너무 넓게 작동한 것인지, 아니면 시장 전체가 강해서 자연스럽게 후보가 많아진 것인지 보고 싶었다.
분석 대상은 후보가 많이 나왔던 2026년 2월과 2026년 4월이었다.
| 기간 | 전체 샘플 | v0.3 통과 후보 | 통과 비율 | KOSPI 수익률 | KOSPI 변동폭 |
|---|---|---|---|---|---|
| 2026년 2월 | 50개 | 35개 | 70.0% | 26.15% | 29.56% |
| 2026년 4월 | 50개 | 26개 | 52.0% | 20.45% | 30.56% |
두 기간 모두 시장 자체가 강하게 움직였다. 후보가 많이 나온 이유를 criteria 문제로만 보기는 어려웠다.
물론 v0.3 조건이 넓게 작동한 것도 맞다. 하지만 강한 시장에서는 많은 종목이 기준을 통과할 수 있다. 이럴 때는 기준을 바로 조이기보다 top-N이나 ranking으로 관찰 후보 수를 관리하는 편이 더 자연스러워 보였다.
criteria에 너무 오래 머물렀다
여기까지 진행하고 나니, criteria에 너무 오래 머물고 있다는 생각이 들었다.
처음부터 criteria는 1차 필터였다. 완벽한 매매 기준이 아니라, 볼 만한 후보를 줄이기 위한 장치였다.
지금까지 확인한 것만으로도 v0.3은 1차 필터 역할을 어느 정도 하고 있었다. 너무 말이 안 되는 후보는 걸러졌고, 강한 상승장에서는 후보가 많이 나왔으며, 변동성이 큰 구간에서는 후보가 적게 나왔다. ranking과 top-N도 관찰 후보 수를 줄이는 데 도움이 됐다.
이제 질문을 바꿔야 했다.
“기준을 어떻게 더 바꿀까?”가 아니라 “뽑힌 후보를 어떤 정보와 함께 볼까?”로 넘어가야 했다.
자동매매가 최종 목표인 것은 그대로다. 다만 지금 바로 자동 주문으로 갈 수는 없다. 먼저 후보가 뽑혔을 때 그 후보를 판단할 수 있는 정보 구조가 필요하다.
KOSPI 100개 종목으로 후보 풀을 넓혔다
다음에는 50개 샘플에서 벗어나 KOSPI 100개 universe로 관찰 대상을 넓혔다.
기존 50개는 실험용으로는 충분했다. 하지만 실제 후보를 뽑기 시작하려면 조금 좁았다. 그래서 KOSPI 대형주와 중형주 중심으로 100개 universe를 구성했다.
그리고 최근 20거래일 기준으로 v0.3 후보를 다시 확인했다.
| 구분 | 50개 기준 | 100개 기준 |
|---|---|---|
| 전체 샘플 수 | 50개 | 100개 |
| v0.3 통과 후보 수 | 4개 | 4개 |
| 후보 비율 | 8.0% | 4.0% |
관찰 기간은 2026년 5월 8일부터 2026년 6월 8일까지였다. KOSPI 100개 종목을 기준으로 데이터를 수집했고, 100개 모두 20거래일 row를 확인했다.
결과는 조금 의외였다. 100개로 넓혔는데도 후보 수는 늘지 않았다. 여전히 4개였다.
이 구간의 KOSPI 수익률은 -0.18%로 약보합이었지만, KOSPI 변동폭은 26.65%로 컸다. 방향성은 뚜렷하지 않은데 변동성은 큰 구간이었다.
그래서 이 후보들은 일반 후보가 아니라 관찰 전용 모드로 분류했다.
후보를 HTML 리포트로 정리했다
이제 종목 코드만 보고 넘어가면 안 되겠다고 생각했다. 후보가 나왔으면 그 후보가 어떤 상태인지 빠르게 볼 수 있어야 했다.
그래서 일반적인 문서보다 한 눈에 여러 정보를 습득할 수 있는 HTML 형식으로 리포트를 만들었다.
리포트에는 기본적으로 다음 정보를 넣었다.
| 구분 | 리포트에 포함한 정보 |
|---|---|
| 실행 정보 | 관찰 기간, KOSPI / KOSDAQ , 적용 기준, 정렬 방식 |
| 시장 정보 | KOSPI 수익률, KOSPI 변동폭, 시장 상태 |
| 후보 정보 | 종목명, 종목코드, 업종, 순위 |
| 가격/거래량 | 관찰 기간 수익률, 거래량 비율, 변동폭 |
| 시장 대비 | KOSPI 대비 수익률 차이, KOSPI 변동폭 대비 비율 |
수급 데이터도 붙였다
가격과 거래량만으로는 후보를 판단하기 어렵다. 그래서 외국인, 기관, 개인 수급 데이터도 붙였다.
KIS API에서 투자자별 수급 데이터를 수집했고, 이번 후보 4개에 대해 20거래일 기준 데이터를 저장했다. 현재는 순매수 수량 기준이다. 금액 기준은 아직 붙이지 않았다.
리포트에는 후보별로 다음 항목을 표시했다.
| 구분 | 내용 |
|---|---|
| 누적 수급 | 외국인, 기관, 개인 누적 순매수 |
| 최근 수급 | 최근 5거래일 외국인, 기관, 개인 순매수 |
| 지속성 | 외국인, 기관, 개인 순매수 일수 |
순매수 일수는 해당 기간 중 순매수한 날이 며칠인지 보는 값이다. 단순히 누적 수량만 보면 하루에 크게 산 것인지, 꾸준히 산 것인지 알기 어렵다. 그래서 순매수 일수도 같이 표시했다.
아직 LLM 판단은 넣지 않았다
여기서 바로 LLM에게 판단을 맡기고 싶기도 했다. 예를 들어 거래량이 늘었고 수급도 괜찮으니 매수 의견을 준다는 식이다.
하지만 아직 정보가 부족하다.
현재 리포트에 들어간 것은 가격, 거래량, KOSPI 대비 흐름, 투자자별 수급 정도다. 뉴스가 없고, 공시도 없고, 실적이나 섹터 이슈도 없다. 이런 상태에서 LLM이 의견을 내면 일부는 추정으로 채워질 수 있다.
그래서 LLM 판단은 보류했다.
대신 리포트에는 포함된 정보와 아직 포함되지 않은 정보를 분리해서 표시했다.
| 현재 포함된 정보 | 아직 포함되지 않은 정보 |
|---|---|
| 가격 흐름 | 뉴스 |
| 거래량 변화 | 공시 |
| KOSPI 대비 흐름 | 실적/가이던스 |
| 변동성 | 섹터 이슈 |
| 외국인·기관·개인 순매수 수량 | LLM 보조 의견 |
나중에 뉴스와 공시까지 붙이면, 그때 LLM에게 후보별 긍정 요인, 부정 요인, 중립 요인을 정리하게 할 수 있을 것 같다.
지금까지의 결론
이번 개발에서 가장 크게 바뀐 것은 기준이 아니다.
기준은 그대로 v0.3을 사용했다. v0.4도 만들지 않았다. ranking도 더 이상 새로 만들지 않았다.
대신 후보를 뽑은 뒤 그 후보에 대해 한 눈에 볼 수 있는 리포트를 만들기 시작했다.
기존에는 “기준을 어떻게 바꿀까?”를 계속 고민했다. 이제는 “기준이 뽑은 후보를 어떤 정보와 함께 볼까?”로 넘어갔다.
자동매매가 최종 목표인 것은 그대로다. 다만 자동매매로 가려면 먼저 후보에 어떤 정보가 붙어 있었고, 그 뒤 결과가 어땠는지를 계속 쌓아야 한다.
이번 단계는 그 중간에 있는 작업이다.
기준을 더 늘리는 대신, 후보를 판단할 수 있는 리포트 구조를 만들기 시작했다.
다음에는 뉴스 데이터를 붙여보려고 한다
다음 단계는 뉴스 수집이다.
처음부터 뉴스 요약이나 소재 분류까지 하지는 않을 생각이다. 후보별로 최근 7일 뉴스 제목, 출처, URL을 수집하고, URL이나 제목이 완전히 같은 경우만 중복 제거하는 정도로 시작하려고 한다.
동일한 소재의 뉴스라도 언론사나 제목이 다르면 일단 저장한다. 나중에 LLM을 붙이면 이 뉴스 목록을 보고 비슷한 소재끼리 묶고, 주요 이슈를 요약하게 할 수 있을 것 같다.
지금은 뉴스 자체를 해석하는 단계가 아니라, 후보 판단에 필요한 원천 데이터를 하나씩 모으는 단계다.
조금 돌아가는 것처럼 보이지만, 자동매매로 가려면 결국 이런 데이터 구조가 필요하다. 단순히 기준 하나로 매수·매도를 결정하기보다는, 기준이 뽑은 후보에 어떤 정보가 붙어 있었고, 그 뒤 결과가 어땠는지를 계속 쌓아야 한다.
이번에는 그 방향으로 한 걸음 넘어간 셈이다.
투자 유의사항
이 글은 개인적인 데이터 실험과 개발 과정을 기록한 글입니다. 특정 종목, 업종, 지수, 투자 전략에 대한 매수·매도 추천이 아닙니다.
주식 투자는 원금 손실 가능성이 있으며, 모든 투자 판단과 책임은 투자자 본인에게 있습니다. 본문에 언급된 기준, ranking, 후보 리포트, 수급 데이터는 제한된 샘플과 기간을 바탕으로 한 실험 기록일 뿐이며 실제 투자 성과를 보장하지 않습니다.