AI 투자 실험실, 관찰 후보를 저장하고 다시 확인해봤다

지난번까지는 종목 데이터를 모으고, 기준을 바꿔가며 관찰 후보를 줄이는 실험을 했다. 처음에는 단순히 기준을 통과하는지 아닌지만 보면 될 줄 알았다. 그런데 여러 기간에 돌려보니 후보가 너무 적게 나오기도 하고, 반대로 너무 많이 남기도 했다.

그래서 기준값을 설정 파일로 분리했고, v0.1과 v0.2 후보를 비교해봤다. 후보가 너무 많을 때는 top-N으로 줄여보고, 거래량을 먼저 보는 volume_first와 시장 대비 변동폭을 먼저 보는 stability_first 정렬도 나눠봤다. 여기까지는 “어떤 후보를 먼저 볼까?”에 가까운 작업이었다.

그런데 이 단계에서 한 가지가 더 필요해졌다. 후보를 뽑는 것만으로는 부족했다. 결국 나중에 다시 봤을 때, 그 후보들이 이후 기간에 어떻게 움직였는지 확인할 수 있어야 했다.

후보를 콘솔에서만 보면 금방 사라진다

처음에는 결과를 콘솔에서만 확인했다. 기준을 돌리면 v0.2 후보가 몇 개인지 나오고, volume_first 상위 후보와 stability_first 상위 후보도 표로 볼 수 있었다. 두 정렬 방식에 모두 포함된 공통 후보도 따로 확인할 수 있었다.

콘솔 출력은 바로 확인하기에는 편하다. 하지만 시간이 지나면 문제가 생긴다. 어떤 기간에 어떤 기준으로 후보를 뽑았는지, 그 후보가 어떤 정렬 방식에서 나왔는지, 나중에 다시 비교하려면 기록이 남아 있어야 한다.

그래서 상위 관찰 후보를 CSV로 저장하는 기능을 추가했다. 아직 DB까지 갈 단계는 아니라고 봤다. 지금은 기준도 계속 바뀌고 있고, 저장할 항목도 실험하면서 바뀔 가능성이 크다. 이런 단계에서는 DB 테이블을 먼저 만드는 것보다 CSV 파일로 가볍게 남기는 편이 낫다고 판단했다.

저장 경로는 data/observations로 잡았다. 실행 결과 파일이기 때문에 git에는 포함하지 않도록 .gitignore에도 추가했다.

data/observations/
  observation_20260401_20260430_v02_volume_first_top10.csv
  observation_20260401_20260430_v02_stability_first_top10.csv
  observation_20260401_20260430_v02_common_top10.csv

이렇게 저장해두면 나중에 “4월에 v0.2 기준으로 뽑았던 공통 관찰 후보가 이후에 어떻게 움직였지?” 같은 질문을 다시 할 수 있다. 이때 중요한 건 이 파일이 투자 판단 결과가 아니라, 관찰 후보 기록이라는 점이다.

관찰 후보를 다시 확인해봤다

후보를 저장했으니 다음 단계는 복기였다. observation CSV에 저장된 종목 코드를 읽고, 이후 기간의 raw 가격 CSV를 찾아서 다시 요약하는 스크립트를 만들었다.

예를 들어 2026년 4월 관찰 후보를 저장한 파일이 있다면, 이후 기간인 2026년 5월~6월 데이터를 붙여서 다시 계산하는 방식이다.

입력:
observation_20260401_20260430_v02_common_top10.csv

이후 기간:
*_20260501_20260604.csv

복기 스크립트는 observation CSV에 있는 symbol을 기준으로 이후 기간 CSV를 찾는다. 그리고 기존 가격 요약 로직을 재사용해서 이후 수익률, 이후 거래량 비율, 이후 변동폭을 계산한다.

처음에는 단일 observation 파일 하나만 복기했다. 2026년 4월 공통 관찰 후보를 2026년 5월~6월 기간으로 다시 확인했다.

결과는 다음과 같았다.

관찰 후보 수: 4개
이후 기간 데이터 확인: 4개
이후 기간 데이터 없음: 0개
이후 수익률 평균: 3.74%
이후 수익률 양수 후보: 3개
이후 수익률 음수 후보: 1개

이 숫자를 보고 바로 “기준이 괜찮다”고 말할 수는 없다. 후보가 4개뿐이고, 특정 기간 하나만 본 결과이기 때문이다. 다만 중요한 건 복기 구조가 처음으로 연결됐다는 점이었다. 이제 후보를 뽑고 끝나는 것이 아니라, 시간이 지난 뒤 다시 확인할 수 있게 됐다.

여러 후보 파일을 한 번에 복기했다

단일 파일 복기가 가능해지니, 다음에는 여러 observation 파일을 한 번에 복기하고 싶어졌다. 같은 2026년 4월 관찰 후보라도 정렬 방식에 따라 파일이 나뉘어 있었다.

volume_first
stability_first
common

이 세 가지를 각각 따로 실행하는 건 불편했다. 그래서 batch review 스크립트를 추가했다. observation CSV 여러 개를 한 번에 읽고, 같은 이후 기간 데이터에 대해 각각 복기한 뒤 파일별 요약과 정렬 방식별 요약을 보여주는 방식이다.

2026년 4월 관찰 후보를 2026년 5월~6월 데이터로 batch review 해보니 전체 요약은 이렇게 나왔다.

observation 파일 수: 3개
전체 관찰 후보 수: 24개
이후 데이터 확인: 24개
이후 데이터 없음: 0개
이후 수익률 평균: 8.54%

여기서도 바로 결론을 내리면 안 된다. 이 결과는 특정 기간에 대한 복기일 뿐이다. 이후 시장 흐름이 좋았는지, 특정 후보군이 운 좋게 맞았는지, 정렬 방식이 영향을 줬는지는 더 많은 기간을 봐야 한다.

그래도 batch review를 만들고 나니 비교가 훨씬 쉬워졌다. 후보를 저장하고, 이후 기간을 붙이고, 정렬 방식별 결과를 한 번에 볼 수 있게 됐다.

다른 기간에서는 결과가 달랐다

4월 관찰 후보를 5월~6월에 복기했을 때는 평균 이후 수익률이 양수로 나왔다. 그렇다면 이 구조가 항상 잘 맞는 걸까? 그렇게 보기에는 이르다.

그래서 2026년 2월 관찰 후보를 2026년 3월 데이터로 다시 복기했다. 결과는 완전히 달랐다.

전체 관찰 후보 수: 25개
이후 데이터 확인: 25개
이후 수익률 평균: -12.01%
양수 후보: 1개
음수 후보: 24개

정렬 방식별로도 차이가 있었다.

volume_first: 평균 -14.77%
stability_first: 평균 -9.49%
common: 평균 -11.53%

이 결과만 보면 2월 관찰 후보는 다음 기간인 3월에 대부분 약한 흐름을 보였다. 다만 이 역시 기준이 틀렸다는 뜻은 아니다. 3월 기간의 시장 흐름 자체가 약했다면, 관찰 후보도 같이 영향을 받았을 수 있다.

반대로 4월 관찰 후보를 5월~6월에 복기했을 때는 결과가 달랐다.

common: 평균 3.74%
stability_first: 평균 2.83%
volume_first: 평균 16.17%

2월→3월에서는 stability_first가 상대적으로 덜 나빴고, 4월→5월~6월에서는 volume_first가 더 높게 나왔다. 그래서 지금 단계에서 “volume_first가 더 좋다”거나 “stability_first가 더 안정적이다”라고 단정하면 안 된다.

오히려 이번에 확인한 것은 이것에 가깝다.

관찰 후보의 이후 흐름은 정렬 방식뿐 아니라 이후 시장 구간의 방향성에도 크게 영향을 받는다.

summary CSV로 모았다

복기 결과가 여러 개 생기기 시작하니, 다시 문제가 생겼다. review CSV가 파일별로 쌓이는 것은 좋지만, 한눈에 비교하기는 어려웠다.

그래서 review CSV 여러 개를 읽어서 summary CSV로 모으는 스크립트를 추가했다. 이 스크립트는 관찰 기간, 이후 기간, rank_sort, observation_type별로 결과를 요약한다.

저장된 summary CSV는 다음과 같은 형태다.

data/reviews/review_summary_v02_top10.csv

summary에는 후보 수, 확인 수, 평균 이후 수익률, 양수 후보 수, 음수 후보 수, 이후 거래량 비율 평균, 이후 변동폭 평균 등이 들어간다.

실제 요약 결과를 보면 기간별 차이가 바로 보였다.

2026-02-02 ~ 2026-02-27 → 2026-03-03 ~ 2026-03-31
common: 평균 -11.53%
stability_first: 평균 -9.49%
volume_first: 평균 -14.77%

2026-04-01 ~ 2026-04-30 → 2026-05-04 ~ 2026-06-04
common: 평균 3.74%
stability_first: 평균 2.83%
volume_first: 평균 16.17%

이렇게 모아보니 단일 결과만 봤을 때보다 훨씬 조심스러워졌다. 어떤 정렬 방식이 항상 유리하다고 말하기 어렵고, 관찰 후보가 이후에 어떤 시장을 만나는지도 중요해 보였다.

HTML 리포트로 보기 쉽게 만들었다

CSV는 개발자가 확인하기에는 괜찮지만, 사람이 읽기에는 불편하다. 표가 길어지면 스크롤도 많고, 기간별로 흐름을 보기 어렵다. Markdown 리포트도 생각했지만, 표가 길어지면 결국 비슷하게 복잡해질 것 같았다.

그래서 마지막으로 정적 HTML 리포트를 만들었다. 웹 서버나 대시보드를 만든 것은 아니다. 단순히 summary CSV를 읽어서 브라우저에서 열어볼 수 있는 HTML 파일을 생성하는 방식이다.

data/reports/review_summary_v02_top10.html

HTML 리포트에는 제목 영역, 상단 요약 카드, 관찰 기간에서 이후 기간으로 이어지는 섹션, rank_sort별 요약 표, 간단한 해석 박스, 주의 문구를 넣었다. 외부 JS나 CSS는 쓰지 않고, HTML 안에 기본 스타일만 넣었다.

이렇게 하니 CSV만 볼 때보다 훨씬 편했다. 2월 관찰 후보가 3월에 약했고, 4월 관찰 후보가 5월~6월에 달랐다는 흐름이 한눈에 들어왔다.

이번 작업에서 얻은 것

이번 작업은 새로운 투자 기준을 만든 것이 아니다. criteria v0.3을 만든 것도 아니고, 기존 기준값을 바꾼 것도 아니다.

대신 관찰 후보를 다루는 흐름을 하나 만들었다.

관찰 후보 생성
→ observation CSV 저장
→ 이후 기간 복기
→ review CSV 저장
→ summary CSV 생성
→ HTML 리포트 생성

처음에는 후보를 어떻게 고를지가 중요하다고 생각했다. 그런데 실험을 하다 보니 후보를 고르는 것만큼이나, 그 후보를 기록하고 다시 확인하는 일이 중요하다는 생각이 들었다.

후보를 뽑는 기준은 계속 바뀔 수 있다. 하지만 어떤 기준으로 뽑은 후보가 이후에 어떻게 움직였는지 남겨두지 않으면, 기준을 개선하기도 어렵다.

이번에는 그 복기 구조의 첫 버전을 만든 셈이다.

아직 결론은 내리지 않았다

이번 결과만 보고 어떤 기준이 좋다거나, 어떤 정렬 방식이 더 낫다고 말할 수는 없다. 확인한 기간도 많지 않고, 이후 시장 흐름의 영향도 크다.

다만 이제는 다음 실험을 조금 더 체계적으로 할 수 있게 됐다. 관찰 후보를 저장하고, 이후 기간을 붙여보고, 여러 복기 결과를 리포트로 확인할 수 있기 때문이다.

다음에는 더 많은 기간을 추가하거나, 이후 기간의 KOSPI 흐름과 관찰 후보의 흐름을 같이 비교해볼 수 있을 것 같다. 하지만 그건 다음 단계로 남겨두려고 한다.

이번에는 여기까지다. 후보를 고르는 것에서 끝내지 않고, 저장하고 다시 확인하는 구조를 만들었다는 점에 의미를 두려고 한다.

투자 유의사항

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

Scroll to Top