주식 추천 시스템 개발

한국 주식 데이터는 어디서 어떻게 모으나 — KRX·OpenDART·증권사 API 비교 (개발 일지 2화)

Mr.Lee 하루 2026. 5. 31. 18:57

지난 1화에서 사이트를 만들기 시작한 이유까지 적었습니다. 오늘은 그다음 단계 — "한국 주식 데이터는 어디서 어떻게 모으는가"에 대한 시행착오를 정리합니다.

미국 주식이라면 야후 파이낸스나 Alpha Vantage 같은 무료 데이터 소스가 잘 정리되어 있지만, 한국 주식은 데이터가 여러 기관에 분산되어 있고 형식도 모두 다릅니다. 처음 3개월은 분석 로직보다 데이터 정리에 더 많은 시간을 들였습니다.


한국 주식 데이터의 3대 출처

출처 제공 데이터 접근 방식 비용
한국거래소 (KRX) 시세, 거래량, 외국인·기관 수급, 공시 일정 KRX 정보데이터시스템, Open API 무료 (일부 제한)
금융감독원 DART 재무제표, 사업보고서, 공시 원문 OpenDART API 무료
증권사 OpenAPI 실시간 시세, 호가, 잔고, 주문 키움·KIS API 무료 (계좌 필요)

세 가지 출처는 제공 데이터가 겹치는 부분도 있고 다른 부분도 있어서, 어떤 데이터를 어디서 받을지 매핑하는 게 첫 번째 과제였습니다.


KRX 데이터 — 가장 기본이지만 가장 까다로움

KRX는 한국 주식 데이터의 1차 출처입니다. 일일 종가, 거래량, 외국인·기관 순매수가 모두 여기서 시작됩니다.

장점

  • 가장 권위 있는 원천 데이터
  • 일별·종목별 모두 제공
  • 외국인·기관·개인 수급 분리 데이터 있음

시행착오

처음에는 KRX 정보데이터시스템(data.krx.co.kr)에서 직접 데이터를 받아 봤습니다. 그런데 다음 문제가 있었습니다.

  1. API가 공식 문서화되어 있지 않음 — 사이트 자체의 비공개 엔드포인트를 추적해야 함
  2. 요청 헤더가 까다로움 — Referer, User-Agent 같은 헤더가 정확해야 응답 옴
  3. CSV 다운로드는 가능하지만 자동화에 부적합 — 매일 수동 다운로드는 비현실적
  4. 종목 코드 형식이 통일 안 됨 — 어떤 페이지에서는 6자리 숫자, 어떤 페이지에서는 7자리 (앞에 'A' 붙음)

결국 KRX 데이터 수집 자동화에만 2주 정도 소요됐습니다.

해결

  • 비공식 API 엔드포인트를 분석해 정기 수집 스크립트 작성
  • 종목 코드는 항상 6자리 숫자로 통일하는 정규화 함수 도입
  • 요청 실패에 대비한 재시도 로직 (지수 백오프)

OpenDART — 재무 데이터의 보고

금융감독원 전자공시(DART)는 한국 상장사의 재무 데이터, 사업보고서, 공시 원문을 받을 수 있는 곳입니다. OpenDART API로 자동 수집이 가능합니다.

장점

  • 공식 API + 공식 문서 존재
  • API 키 발급이 간단 (이메일 인증)
  • XBRL 형식의 구조화된 재무 데이터 제공

시행착오

  1. API 호출 한도 — 일일 1만 회 제한. 종목 2,500개 × 분기 4 × 항목 30개 계산하면 한도 초과 위험
  2. 공시 시점 vs 실제 결산 시점의 차이 — 분기보고서는 결산일 후 45일 안에 제출되지만, 데이터 활용 시점은 시장과 시차 있음
  3. 재무 항목 명칭 불일치 — 같은 "영업이익"도 회사마다 표기 방식이 미묘하게 다름 (XBRL 태그는 통일되어 있으나 실제 활용에는 추가 정제 필요)
  4. 연결 vs 별도 — 어떤 기준을 쓸지 사전에 결정 필요

해결

  • 호출 한도 절약을 위해 종목별 분기마다 1회만 수집, 로컬 캐시 활용
  • 재무 데이터는 발표 후 5거래일 지난 시점부터만 활용 (시차 반영)
  • 연결 기준을 기본으로 하되, 별도 기준만 보고하는 종목은 예외 처리

증권사 OpenAPI — 실시간 영역

KRX·DART는 일별 데이터까지가 한계입니다. 실시간 호가, 분 단위 시세, 실거래 주문이 필요하면 증권사 API를 써야 합니다.

대표적으로 키움증권 OpenAPI+와 한국투자증권 KIS Developers API가 있습니다.

항목 키움 OpenAPI+ KIS Developers
접근 방식 Windows OCX REST API
운영체제 제약 Windows 전용 모든 OS
인증 HTS 로그인 기반 OAuth 토큰
자동화 친화성 낮음 (GUI 의존) 높음
모의투자 지원 있음 있음

저는 처음에 키움 OpenAPI+로 시작했지만, Windows 전용에다 OCX 의존성 때문에 자동화가 까다로워 KIS Developers로 갈아탔습니다.

시행착오

  1. 토큰 갱신 — KIS API는 24시간마다 토큰 갱신 필요. 자동 갱신 로직 구현 필수
  2. 호출 빈도 제한 — TPS 제한이 있어 한 번에 종목 200개를 동시 조회할 수 없음
  3. 시세 vs 잔고 API의 권한 분리 — 시세 조회만 쓸 거면 별도 권한 신청 불필요하나, 잔고·주문 API는 추가 동의 필요

가장 큰 함정 — 데이터 정합성

세 출처에서 같은 종목의 같은 시점 데이터를 받아도 미묘하게 다른 경우가 있습니다.

함정 사례
종목 코드 표기 KRX는 6자리, 일부 API는 7자리(A 접두), DART는 회사 고유번호(corp_code)
종목명 변경 이력 같은 종목이 사명 변경하면 과거 데이터 매칭이 끊김
액면분할·합병 가격이 갑자기 1/10이 되거나 합쳐짐
휴장일 처리 같은 거래일이 출처마다 다르게 표기되는 경우

특히 종목 코드 매핑이 가장 큰 문제였습니다. 결국 별도 "코드 매핑 테이블"을 만들어 (KRX 6자리 ↔ DART corp_code ↔ 증권사 API 코드)를 모두 연결하는 마스터 테이블을 운영하게 됐습니다.


결측치와 이상치 처리

데이터를 모은 후 절반의 시간은 정제에 들어갔습니다.

자주 발생하는 결측치

  • 거래정지 종목의 일별 시세 (가격 없음)
  • 신규 상장 종목의 과거 데이터 (날짜 없음)
  • 외국인 보유율 미공시 종목

자주 발생하는 이상치

  • 액면분할 직후 가격 급변 (분할 비율 적용 필요)
  • 무상증자 권리락 (가격 단절)
  • 비정상 거래 (장중 일시 가격 폭등 후 회복)

이런 케이스마다 처리 규칙을 만들어 두지 않으면 분석 결과가 왜곡됩니다. 예를 들어 액면분할 종목의 60일 수익률을 그대로 계산하면 -90%가 나오는데, 실제로는 가격이 같은 경우가 많습니다.


정리 — 데이터 인프라가 분석의 절반

지금 돌이켜 보면, 분석 모델을 만드는 시간보다 데이터 인프라를 안정화하는 시간이 훨씬 많이 들었습니다. 그리고 이 부분이 데이터 기반 도구의 신뢰성을 결정합니다.

분석 로직은 언제든 바꿀 수 있지만, 데이터가 잘못되면 분석 결과를 검증할 수도 없습니다. "쓰레기를 넣으면 쓰레기가 나온다"는 말이 가장 자주 떠올랐던 시기입니다.

단계 비중 (체감 시간)
데이터 수집 자동화 30%
데이터 정합성 맞추기 25%
결측치·이상치 처리 15%
분석 모델 설계 20%
시각화·UI 10%

이 비율이 한국 주식 데이터 분석 도구를 직접 만들어 본 사람의 일반적인 시간 배분이라고 봅니다.


다음 화 예고

다음 3화에서는 "왜 점수와 신호를 분리하기로 했나"를 다뤄 보려 합니다. 데이터를 모으고 점수를 매기는 데까지 왔지만, 그 점수를 그대로 매수·매도 신호로 쓰지 않기로 결정한 배경 이야기입니다.

사이트 → https://www.leetrader.kr
블로그 → https://www.leetrader.kr/blog
이전 화 → 개발 일지 1화 (왜 만들기 시작했는가)

정리된 데이터가 어떻게 보이는지 확인
본 글에서 다룬 KRX·DART·증권사 API 데이터가 실제로 어떻게 정리되어 한 화면에 표시되는지 운영 화면에서 직접 보실 수 있습니다.
https://www.leetrader.kr/app

본 글은 Lee Trader Lab 운영자가 직접 작성한 개발 일지입니다.
본 시리즈는 시스템 개발 과정에 대한 기록이며, 특정 종목의 매수·매도 권유나 투자 자문이 아닙니다.
투자 판단과 손익 책임은 투자자 본인에게 있습니다.