AI 투자 실험실, 기준을 완화했더니 후보가 너무 많이 남았다

지난번까지는 종목 데이터를 시장 흐름과 비교해보는 쪽으로 실험을 이어갔다. 처음에는 단순히 종목의 기간 수익률, 거래량 비율, 고저 변동폭만 보고 관찰 후보를 걸러보려고 했다. 그런데 막상 여러 기간에 돌려보니 문제가 하나씩 보이기 시작했다.

가장 먼저 만든 criteria v0는 너무 좁았다. 가격 조건, 거래량 조건, 절대 변동폭 조건을 모두 만족해야 했는데, 여러 기간에 돌려봐도 통과하는 샘플이 거의 나오지 않았다. 특히 변동폭을 절대값으로만 보니 시장 전체가 크게 움직인 구간까지 전부 “변동성이 높다”고 판단하는 문제가 있었다.

그래서 KOSPI 지수와 비교하는 기준을 넣어봤다. 종목의 고저 변동폭만 보는 것이 아니라, 같은 기간 KOSPI도 얼마나 움직였는지를 같이 보는 방식이었다. 이렇게 해서 criteria v0.1 후보를 만들었고, 이후 조금 더 완화한 criteria v0.2 후보도 추가했다.

기준값을 코드 밖으로 뺐다

기준 후보가 늘어나기 시작하니 또 다른 문제가 생겼다. 기준값이 코드 안에 직접 들어가 있으면, 새로운 기준을 실험할 때마다 Python 코드를 수정해야 했다.

처음에는 별문제 없어 보였다. 기준이 하나뿐이면 코드 안에 숫자가 있어도 크게 불편하지 않다. 하지만 v0, v0.1, v0.2처럼 후보가 늘어나면 이야기가 달라진다. 어떤 기준으로 어떤 기간을 돌렸는지 남기기도 어렵고, 기준값만 살짝 바꿔 비교하기도 불편하다.

그래서 criteria 기준값을 설정 파일로 분리했다.

config/criteria_v0.yaml
config/criteria_v01_candidate.yaml
config/criteria_v02_candidate.yaml

이제 기준값은 코드가 아니라 설정 파일에서 관리한다. 예를 들어 v0.1 후보는 거래량 비율 1.2배 이상, KOSPI 대비 변동폭 1.8배 이하를 사용하고, v0.2 후보는 거래량 비율 1.0배 이상, KOSPI 대비 변동폭 2.0배 이하를 사용한다.

중요한 건 v0.2를 최종 기준으로 정했다는 뜻이 아니다. 기준을 코드에서 분리해두면, 새로운 후보를 만들고 같은 방식으로 비교하기 쉬워진다. 이번 작업은 기준을 확정하는 일이 아니라, 기준을 실험하기 쉽게 만드는 작업에 가까웠다.

v0.2를 추가했더니 후보가 늘어났다

v0.2 후보는 v0.1보다 기준을 조금 완화한 버전이다. 가격 조건은 그대로 두고, 거래량 조건과 시장 대비 변동성 조건을 조금 느슨하게 했다.

v0.1 후보
- 기간 수익률 > -1.0%
- 거래량 비율 >= 1.2배
- KOSPI 대비 변동폭 비율 <= 1.8배

v0.2 후보
- 기간 수익률 > -1.0%
- 거래량 비율 >= 1.0배
- KOSPI 대비 변동폭 비율 <= 2.0배

당연히 기준을 완화하면 통과하는 후보는 늘어난다. 문제는 얼마나 늘어나느냐였다. 관찰 후보 필터의 목적은 전체 종목 중에서 추가로 살펴볼 대상을 줄이는 것이다. 그런데 너무 많이 남기면 필터 역할이 약해진다.

50개 샘플을 여러 기간에 돌려보니 결과가 꽤 달랐다.

2026-02-02 ~ 2026-02-27
v0.1 후보: 33개
v0.2 후보: 38개

2026-03-03 ~ 2026-03-31
v0.1 후보: 3개
v0.2 후보: 5개

2026-04-01 ~ 2026-04-30
v0.1 후보: 18개
v0.2 후보: 28개

2026-05-04 ~ 2026-06-04
v0.1 후보: 4개
v0.2 후보: 6개

2026-05-04 ~ 2026-06-05
v0.1 후보: 2개
v0.2 후보: 5개

3월이나 5~6월 구간에서는 v0.2가 5~6개 정도만 남겨서 나쁘지 않아 보였다. 그런데 2월에는 50개 중 38개, 4월에는 50개 중 28개가 통과했다. 이 정도면 관찰 후보를 줄이는 필터라고 보기에는 너무 넓다.

그래서 단순히 통과 개수만 보지 않고, 후보 비율도 같이 표시하게 했다. 기준이 샘플 중 몇 %를 통과시키는지 보고, 너무 좁은지 넓은지 라벨을 붙였다.

0~5%: 너무 좁음
5~20%: 적정 후보 범위
20~40%: 다소 넓음
40% 이상: 너무 넓음

이렇게 보니 v0는 모든 기간에서 너무 좁았고, v0.2는 일부 상승 구간에서 너무 넓게 작동했다. 기준을 완화하는 것 자체보다, 완화한 기준이 실제로 얼마나 많은 후보를 남기는지 확인하는 게 더 중요했다.

어디서 후보가 늘어났는지도 확인했다

후보가 늘어났다는 것만으로는 부족했다. v0.2는 v0.1보다 두 가지 조건을 완화했다. 거래량 조건을 낮췄고, 시장 대비 변동폭 조건도 넓혔다.

그러면 질문은 자연스럽게 바뀐다.

v0.2에서 새로 통과한 후보는 거래량 조건 완화 때문에 늘어난 걸까? 아니면 시장 대비 변동성 조건 완화 때문에 늘어난 걸까?

이걸 보기 위해 v0.1에서는 탈락했지만 v0.2에서는 통과한 샘플을 따로 분류했다. 신규 통과 원인을 거래량 조건 완화, 시장 대비 변동성 조건 완화, 둘 다 완화, 기타로 나눴다.

결과는 기간마다 달랐다.

2026-02-02 ~ 2026-02-27
신규 통과: 5개
거래량 조건 완화: 5개
시장 대비 변동성 조건 완화: 0개

2026-03-03 ~ 2026-03-31
신규 통과: 2개
거래량 조건 완화: 2개
시장 대비 변동성 조건 완화: 0개

2026-04-01 ~ 2026-04-30
신규 통과: 10개
거래량 조건 완화: 10개
시장 대비 변동성 조건 완화: 0개

2026-05-04 ~ 2026-06-04
신규 통과: 2개
거래량 조건 완화: 0개
시장 대비 변동성 조건 완화: 2개

2026-05-04 ~ 2026-06-05
신규 통과: 3개
거래량 조건 완화: 1개
시장 대비 변동성 조건 완화: 2개

2월, 3월, 4월에는 v0.2가 넓어진 이유가 주로 거래량 조건 완화였다. 반면 5~6월 구간에서는 시장 대비 변동성 조건 완화의 영향이 더 컸다.

여기서 바로 기준을 확정하기는 어렵다. 다만 한 가지는 알 수 있었다. v0.2가 넓어진다고 해서 항상 같은 이유로 넓어지는 것은 아니었다. 어떤 기간에는 거래량 조건이 필터 역할을 약하게 만들고, 어떤 기간에는 시장 대비 변동성 조건이 후보를 더 남겼다.

후보가 너무 많을 때는 상위 관찰 후보만 따로 봤다

후보가 5~6개라면 그냥 하나씩 보면 된다. 하지만 28개, 38개가 나오면 이야기가 다르다. 관찰 후보를 줄이려고 만든 기준인데, 통과 후보가 너무 많으면 다시 사람이 보기 부담스럽다.

그래서 이번에는 기준을 또 바꾸기보다, 통과 후보 중 상위 관찰 후보를 따로 보여주는 기능을 붙였다. 전체 후보를 모두 보는 대신, 우선 확인할 후보를 10개 정도로 줄여보는 방식이다.

처음 정렬은 단순하게 만들었다.

거래량 비율 높은 순
→ KOSPI 대비 변동폭 비율 낮은 순
→ 기간 수익률 높은 순

이 정렬은 좋은 종목 순위가 아니다. 거래량이 평균보다 살아 있는 후보를 먼저 보고, 그 안에서 시장 대비 변동폭이 과도한 후보를 뒤로 보내기 위한 임시 정렬이다. 실제 투자 판단이 아니라, 관찰 후보를 사람이 검토하기 쉽게 줄여보는 보조 장치다.

실제로 v0.2가 너무 넓게 나온 2월과 4월에 적용해보니, 후보 수를 줄이는 데는 도움이 됐다.

2026-02-02 ~ 2026-02-27
v0.2 후보: 38개
상위 관찰 후보: 10개

2026-04-01 ~ 2026-04-30
v0.2 후보: 28개
상위 관찰 후보: 10개

다만 한계도 있었다. 거래량 비율을 1순위로 두다 보니, 상위 후보가 거래량이 크게 증가한 종목 위주로 쏠렸다. 거래량 증가는 관심을 둘 만한 신호일 수 있지만, 그것만으로 좋은 후보라고 볼 수는 없다. 단기 이슈나 과열, 변동성 확대 때문에 거래량이 늘 수도 있기 때문이다.

그래서 정렬 방식도 하나로 고정하지 않기로 했다.

volume_first
- 거래량 비율 높은 순
- KOSPI 대비 변동폭 비율 낮은 순
- 기간 수익률 높은 순

stability_first
- KOSPI 대비 변동폭 비율 낮은 순
- 거래량 비율 높은 순
- 기간 수익률 높은 순

기본값은 기존 동작을 유지하기 위해 volume_first로 두었다. 대신 필요할 때 stability_first로도 비교할 수 있게 했다. 이렇게 하면 “거래량이 먼저냐, 안정성이 먼저냐”를 감으로 정하지 않고 같은 기간에서 비교해볼 수 있다.

아직 기준을 확정한 건 아니다

이번 작업을 했다고 해서 관찰 기준이 완성된 것은 아니다. 오히려 기준을 하나로 확정하기 전에, 기준이 어떤 상황에서 너무 넓어지고 어떤 조건 때문에 후보가 늘어나는지 확인한 단계에 가깝다.

지금까지 정리하면 이렇다.

v0
- 모든 기간에서 너무 좁게 작동

v0.1 후보
- v0보다 현실적이지만 상승 구간에서는 여전히 후보가 많을 수 있음

v0.2 후보
- 약세나 혼조 구간에서는 적정 후보 범위에 들어오기도 함
- 하지만 강한 상승 구간에서는 너무 넓게 작동할 수 있음

top-N 관찰 후보
- 후보가 너무 많을 때 검토 부담을 줄이는 보조 장치

rank-sort 옵션
- 거래량 우선과 안정성 우선 정렬을 비교하기 위한 실험 옵션

처음에는 단순히 기준값을 조금 바꾸면 될 줄 알았다. 그런데 여러 기간에 돌려보니 기준은 한 번에 정하기 어려웠다. 같은 기준도 시장 흐름에 따라 너무 좁아지거나 너무 넓어질 수 있었다.

그래서 이번에는 새로운 기준을 확정하기보다, 기준을 바꿔가며 비교할 수 있게 만들고, 후보가 많을 때는 상위 관찰 후보만 따로 보는 구조를 붙였다. 아직 갈 길은 멀지만, 적어도 이제는 “왜 후보가 늘었는지”와 “후보가 너무 많을 때 어떻게 먼저 볼지”를 조금 더 구체적으로 확인할 수 있게 됐다.

이후 같은 기간에 volume_first와 stability_first를 나란히 돌려봤다. 결과는 생각보다 꽤 달랐다. 2월 구간에서는 상위 10개 중 5개만 겹쳤고, 4월 구간에서는 4개만 겹쳤다.

volume_first는 거래량 비율이 높은 후보를 빠르게 끌어올렸다. 움직임이 강한 후보를 먼저 보기에는 좋지만, 거래량이 갑자기 늘어난 이유까지는 따로 확인해야 했다.

반대로 stability_first는 KOSPI 대비 변동폭이 낮은 후보를 먼저 보여줬다. 후보가 너무 많은 구간을 조금 더 차분하게 보는 데는 도움이 됐지만, 거래량 강도가 약한 후보도 상단에 올라올 수 있었다.

결국 지금 단계에서는 둘 중 하나를 정답으로 정하기 어렵다. volume_first는 거래량 관점, stability_first는 시장 대비 안정성 관점의 관찰 후보로 나눠서 보는 편이 더 자연스러워 보였다.

투자 유의사항

이 글은 개인적인 개발 실험 기록이며, 특정 종목이나 금융상품에 대한 매수·매도 추천이 아닙니다. 글에서 언급한 criteria는 투자 판단 기준이 아니라 데이터를 관찰하기 위한 실험용 필터입니다. 실제 투자 판단은 개인의 상황, 자금 계획, 리스크 감내 수준 등을 종합적으로 고려해 신중하게 결정해야 합니다.

Scroll to Top