AI 투자 실험실, 첫 번째 판단 기준을 코드로 옮겨봤다

지난번에는 한국투자증권 KIS API를 통해 일봉 데이터를 가져오고, 그 결과를 CSV 파일로 저장하는 데까지 해봤다. 처음에는 “실제 데이터를 가져왔다”는 것만으로도 꽤 큰 진전처럼 느껴졌는데, 막상 CSV 파일을 열어보니 바로 다음 문제가 보였다.

데이터는 쌓였지만, 이걸 그대로 보고 뭔가를 판단하기는 어렵다는 점이었다. 날짜별 시가, 고가, 저가, 종가, 거래량이 줄줄이 들어 있긴 하지만, 이 기간 동안 가격 흐름이 어땠는지, 거래량이 평소보다 늘었는지, 가격이 얼마나 흔들렸는지는 다시 분석해야 했다.

그래서 이번에는 저장된 CSV를 읽어서 가격과 거래량을 요약하고, 그 요약값을 바탕으로 첫 번째 관찰 기준 v0에 부합하는지를 코드로 옮겨봤다.

CSV를 보고 바로 판단하지 않고 요약부터

이번에 먼저 만든 것은 summary 모듈이다. 저장된 일봉 CSV를 읽은 뒤, 그 데이터를 바로 판단 기준에 넣지 않고 몇 가지 숫자로 압축했다.

계산한 값은 기간 수익률, 평균 거래량, 최근 거래량 비율, 기간 고가와 저가, 고저 변동폭 정도다. 예를 들면 “이 기간 동안 종가 기준으로 몇 % 움직였는지”, “최근 거래량이 평균 거래량의 몇 배인지”, “기간 중 저가 대비 고가가 얼마나 벌어졌는지”를 계산하는 식이다.

아직 여기에는 판단이 들어가지 않는다. 단순히 데이터를 사람이 보기 쉬운 형태로 바꾸는 단계다. 원본 CSV가 재료라면, summary는 그 재료를 한 번 손질한 중간 결과에 가깝다.

uv run python scripts/summarize_price_csv.py data/raw/005930_20260520_20260530.csv

종목 코드는 테스트용 예시일 뿐이다. 이 프로젝트에서는 특정 종목을 분석하거나 추천하려는 목적이 아니라, 데이터를 읽고 기준을 코드로 옮겨보는 흐름 자체를 기록하고 있다.

첫 기준 v0는 일부러 단순하게 잡았다

처음 정했던 방향은 이랬다.

최근 가격 흐름이 나쁘지 않고, 거래량이 평소보다 늘었으며, 변동성이 과하게 크지 않은 종목을 관심 후보로 분류해보자는 기준이었다.

문장으로 쓰면 간단한데, 코드로 옮기려면 결국 숫자가 필요했다. 그래서 criteria v0에서는 다음처럼 임시 기준을 잡았다.

구분기준
가격 흐름기간 수익률이 -1.0% 이하로 하락하지 않을 것
거래량 변화최근 거래량이 기간 평균 거래량의 1.5배 이상일 것
변동성고저 변동폭이 5.0% 미만일 것

이 숫자들은 정답이 아니다. 처음 실험을 시작하기 위한 임시값에 가깝다. 가격 흐름은 작은 조정까지 모두 제외하지 않기 위해 -1.0%를 기준으로 두었고, 거래량은 단순한 오차보다 눈에 띄는 증가만 보기 위해 평균 대비 1.5배를 기준으로 잡았다.

변동성은 조금 수비적으로 봤다. 기간 중 저가 대비 고가가 5.0% 이상 벌어졌다면, 처음 기준에서는 변동성이 큰 편으로 분류했다. 크게 흔들리는 구간까지 처음부터 포함하면 기준을 해석하기 어려울 수 있어서, v0에서는 과한 변동을 일단 걸러내는 쪽으로 잡았다.

전체적으로 보면 criteria v0는 공격적인 기준이라기보다, 조금 보수적인 관찰 기준에 가깝다. 많이 통과시키는 것보다, 가격 흐름이 크게 무너지지 않았고 거래량 변화가 분명하며 변동성이 과하지 않은 경우만 먼저 남겨보려는 기준이다.

분류와 평가는 나눠서 만들었다

이번에 구현하면서 조금 신경 쓴 부분은 “분류”와 “평가”를 나눈 것이다.

먼저 classify_summary_v0에서는 summary 결과를 보고 가격 흐름, 거래량 변화, 변동성 수준을 분류했다.

가격 흐름: 상승 / 하락 / 보합
거래량 변화: 평균 대비 증가 / 평균 수준 / 평균 대비 감소
변동성: 높음 / 보통 / 낮음

그다음 evaluate_criteria_v0에서는 이 분류 결과가 criteria v0 기준에 부합하는지 확인했다. 가격 흐름이 하락으로 분류되지 않았는지, 거래량이 평균 대비 증가했는지, 변동성이 높은 수준으로 분류되지 않았는지를 각각 확인한 뒤 최종적으로 기준 부합 여부를 반환하도록 했다.

이렇게 나눠두니 흐름이 조금 더 선명해졌다. 숫자를 계산하는 summary, 숫자를 상태로 바꾸는 criteria, 그리고 그 criteria가 기준에 맞는지 확인하는 evaluation으로 역할이 나뉘었다.

아직 투자 판단은 아니다

이번 작업에서 중요한 점은, 이 결과를 매수나 매도 판단으로 보지 않는다는 것이다.

criteria v0는 어디까지나 데이터를 관찰하기 위한 초기 기준이다. 기준에 부합한다고 해서 좋은 종목이라는 뜻도 아니고, 기준에 맞지 않는다고 해서 나쁜 종목이라는 뜻도 아니다. 단지 “내가 정한 첫 번째 기준으로 봤을 때 어떤 상태로 분류되는가”를 확인하는 정도다.

일단은 데이터를 가져오고, 요약하고, 기준을 적용해보는 흐름을 만드는 게 먼저다.

이번 작업에서 한 것

이번 단계에서는 다음 작업을 했다.

  • 저장된 raw CSV를 읽어 가격·거래량 요약값 생성
  • 기간 수익률, 평균 거래량, 최근 거래량 비율, 고저 변동폭 계산
  • criteria v0 분류 기준 구현
  • 가격 흐름, 거래량 변화, 변동성 수준 분류
  • criteria v0 기준 부합 여부 평가
  • 테스트 추가 및 ruff 확인

테스트는 uv run pytest 기준 49개가 통과했고, uv run ruff check .도 통과했다. 아직 작은 프로젝트지만, 기능을 하나 추가할 때마다 테스트를 같이 붙이는 식으로 가고 있다.

다음에는 뭘 해볼까

이제 하나의 CSV 파일을 기준으로 요약하고, criteria v0를 적용하는 흐름은 만들어졌다. 다음에는 같은 기준을 여러 기간에 적용해보거나, 여러 CSV 파일에 반복 적용해보는 쪽으로 넘어갈 수 있을 것 같다.

아직 DB에 넣는 건 조금 이른 단계라고 보고 있다. 지금은 CSV 기반으로 기준이 어떻게 동작하는지 보는 게 먼저다. 어느 정도 반복해서 돌려보고, 결과를 계속 비교해야 할 필요가 생기면 그때 SQLite 같은 로컬 DB를 붙여도 늦지 않을 것 같다.

이번 작업을 해보니, 투자 데이터 실험에서 중요한 건 복잡한 모델을 바로 붙이는 게 아니라 기준을 작게 쪼개는 일이라는 생각이 들었다. 데이터를 가져오고, 요약하고, 분류하고, 그 기준이 맞는지 확인하는 과정부터 차근차근 쌓아가 보려고 한다.


Scroll to Top