AI 투자 실험실, 샘플 데이터에서 실제 데이터 수집까지 구현해봤다

지난번에는 데이터를 모으기 전에 기준부터 정했다. 최근 가격 흐름과 거래량을 보고 관심 종목 후보를 분류해보자는 정도의 아주 단순한 기준이었다.

그 기준을 정하고 나니 다음에 해야 할 일도 자연스럽게 정해졌다. 일단 데이터를 읽을 수 있어야 했다.

처음부터 실제 API를 바로 붙이면 인증, 응답 포맷, 요청 오류 같은 것들이 한꺼번에 튀어나올 것 같았다. 그래서 먼저 샘플 CSV부터 만들었다.

컬럼은 단순하게 잡았다.

date, open, high, low, close, volume

주식 일봉 데이터에서 가장 기본이 되는 값들이다. 날짜, 시가, 고가, 저가, 종가, 거래량. 이 정도만 있어도 일단 가격 흐름과 거래량 변화를 보는 첫 실험은 시작할 수 있을 것 같았다.

샘플 CSV를 만들고, 그 파일을 읽는 price_loader를 구현했다. 단순히 파일을 읽는 것에서 끝내지 않고, 필수 컬럼이 빠져 있으면 에러가 나도록 했다. date는 날짜 타입으로 바꾸고, 가격과 거래량은 숫자로 다룰 수 있게 정리했다.

아직 별거 아닌 기능처럼 보이지만, 이런 부분을 대충 넘기면 나중에 데이터가 조금만 달라져도 이상한 결과가 나올 수 있다.

샘플 데이터로 구조를 확인한 뒤에는 실제 데이터를 수집하는 쪽으로 넘어갔다. 이번에는 한국투자증권 KIS Open API를 사용했다. 다만 범위는 아주 작게 잡았다. 이번에 한 건 시세 조회를 위한 준비와 특정 종목 1개의 과거 일봉 데이터를 가져오는 것까지였다.

먼저 access token 발급 기능을 만들었다. .env에 있는 KIS 설정값을 읽고, token 발급 요청을 보내는 구조다. 여기서 신경 쓴 부분은 token 값을 출력하지 않는 것이었다.

API Key, Secret, access token 같은 값은 로그나 문서에 남기면 안 된다. 그래서 실제 token 값은 숨기고, 성공 여부만 확인할 수 있게 했다. 단위 테스트의 경우에는 실제 API를 호출하지 않도록 fake HTTP client를 사용했다.

그다음은 일봉 시세 조회였다. KIS 국내주식 기간별 시세 API를 호출해서 특정 종목의 데이터를 가져오고, 응답을 프로젝트에서 쓰는 표준 컬럼으로 맞췄다.

프로젝트 안에서는 계속 이 형태를 기준으로 쓰기로 했다.

date, open, high, low, close, volume

API 응답이 어떤 이름으로 오든, 내부에서는 같은 컬럼명으로 맞춰두는 게 편할 것 같았다. 그래야 샘플 데이터든, 실제 API 데이터든, 나중에 다른 출처의 데이터든 같은 방식으로 읽을 수 있다.

수동 실행은 이런 식으로 했다.

uv run python scripts/fetch_kis_daily_prices.py --symbol 005930 --start-date 2026-06-01 --end-date 2026-06-03

이번에는 예시로 종목 코드 하나만 사용했다. 이번 목적은 특정 종목을 분석하려는 게 아니라, 실제 API 응답을 받아서 우리가 정한 데이터 형식으로 저장할 수 있는지 확인하는 것이었다.

실행 후에는 data/raw 아래에 CSV 파일이 생성됐다.

data/raw/005930_20260601_20260603.csv

data/raw는 git 추적에서 제외해뒀다. 실제 API로 받은 원본성 데이터라서, 코드 저장소에 계속 쌓이게 두는 건 별로 좋아 보이지 않았다.

그리고 저장된 CSV는 기존에 만든 load_price_data로 다시 읽을 수 있게 했다. 이 부분이 이번 작업에서 제일 중요했다. 샘플 CSV를 읽는 코드와 실제 API로 저장한 CSV를 읽는 코드가 따로 놀면 나중에 관리가 귀찮아진다.

작업하면서 하나 알게 된 것도 있다. 현재 구조에서는 스크립트를 실행할 때마다 token 발급을 먼저 한다. 그래서 KIS의 token 발급 제한에 걸리면 잠시 기다렸다가 다시 실행해야 한다.

지금은 첫 연결을 확인하는 단계라 괜찮지만, 나중에는 token을 캐시하거나 만료 시간을 보고 재사용하는 구조가 필요할 것 같다.

이번 작업에서 만든 파일은 대략 이렇다.

src/ai_trading_lab/kis/token.py
src/ai_trading_lab/kis/price.py
scripts/issue_kis_token.py
scripts/fetch_kis_daily_prices.py
tests/test_kis_token.py
tests/test_kis_price.py
docs/devlog/2026-06-03-kis-access-token.md
docs/devlog/2026-06-03-kis-daily-price-fetch.md

아직 데이터를 분석한 건 아니다. 관심 종목을 분류한 것도 아니고, 어떤 기준을 계산한 것도 아니다. 이번 단계는 말 그대로 데이터 입구를 만든 작업에 가깝다.

샘플 데이터로 먼저 구조를 확인했고, 실제 API 데이터도 같은 형태로 저장하고 읽을 수 있게 만들었다. 이제 다음에는 저장된 raw CSV를 기준으로 가격 흐름과 거래량을 간단히 요약해볼 차례다.

최근 며칠 동안 가격이 어떻게 움직였는지, 거래량이 평소보다 늘었는지, 변동성이 어느 정도였는지 같은 것부터 작게 계산해보려고 한다.

일단 샘플 데이터에서 실제 데이터로 넘어오는 데까지는 성공했다. 다음은 이 데이터를 가지고 진짜 뭔가를 계산해볼 차례다.

투자 유의사항

이 글은 개인적인 개발 및 투자 실험 기록입니다.

특정 종목이나 금융상품에 대한 매수·매도 추천이 아니며, 투자 판단은 각자의 책임하에 이루어져야 합니다.

Scroll to Top