튜토리얼약 8분 읽기

FinanceDataReader·pykrx로 주식 데이터 가져오기 — 증권사 API 붙이기 전에 무료 라이브러리부터

증권사 API부터 뚫으려다 막히는 이유

자동매매를 만들어보겠다고 마음먹으면 제일 먼저 증권사 API 앱키 발급부터 알아보게 된다. 그런데 인증서 등록, 앱키·시크릿 발급, 모의투자 서버 신청 같은 절차를 거치는 사이 정작 "데이터가 어떻게 생겼는지" 한 번도 못 본 채 시간이 흘러가는 경우가 많다. 이 순서를 뒤집어서, 증권사 계정 없이도 쓸 수 있는 무료 데이터 라이브러리로 먼저 시세 데이터의 생김새와 다루는 법을 익히는 편이 낫다고 생각한다.

이번 글은 국내에서 많이 쓰이는 FinanceDataReader와 pykrx 두 라이브러리를 개념 수준에서 다룬다. 미리 선을 그어두면, 두 라이브러리는 계속 업데이트되기 때문에 이 글에 적힌 함수명이나 파라미터를 그대로 코드에 복사해 쓰면 안 된다. 정확한 함수명·파라미터·반환 컬럼명은 반드시 각 라이브러리의 PyPI 페이지나 GitHub 문서에서 그때그때 확인해야 한다. 여기서는 "이런 목적으로 이런 종류의 함수를 쓴다"는 개념만 잡는다.

FinanceDataReader로 국내·해외 시세 가져오기 (개념)

FinanceDataReader는 종목 코드(또는 지수·환율 같은 식별자)와 조회 기간을 넣으면, 그 기간의 일별 시세를 표 형태로 돌려주는 함수를 제공하는 것으로 알려져 있다. 국내 종목뿐 아니라 해외 지수·환율 같은 데이터도 같은 방식으로 조회할 수 있다는 점이 특징이다.

python 코드 보기
# 개념 의사코드 — 실제 import 경로·함수명·파라미터는 공식 문서 확인 필수
import financedatareader_concept as fdr

symbol = "종목코드또는식별자"  # 예: 국내 종목, 해외 지수 등
raw = fdr.get_price_history(symbol, start="시작일", end="종료일")
# 반환값은 날짜를 축으로 하고, 시가·고가·저가·종가·거래량 계열의 컬럼을 담은
# 표 형태 구조인 것으로 알려져 있다. 정확한 컬럼명은 문서에서 확인한다.

여기서 중요한 건 함수 하나로 "코드 + 기간"만 넘기면 시계열 표를 받아온다는 흐름 자체다. 파이썬 시세데이터 수집·정제·저장 기초에서 다룬 OHLCV 구조와 그대로 이어지는 형태라고 보면 된다.

pykrx로 지수·종목 데이터 가져오기 (개념)

pykrx는 한국거래소(KRX) 쪽 데이터에 조금 더 특화된 라이브러리로, 개별 종목의 기간별 시세뿐 아니라 코스피·코스닥 같은 지수 데이터, 특정 날짜 기준의 전체 종목 시세 같은 것도 함수 단위로 나눠서 제공하는 것으로 알려져 있다. 즉 "종목 하나의 기간별 흐름"과 "특정 날짜의 시장 전체 스냅샷"을 서로 다른 함수로 가져오는 구조에 가깝다.

python 코드 보기
# 개념 의사코드 — 실제 함수명·인자 순서·날짜 형식은 공식 문서 확인 필수
import pykrx_concept as krx

ticker_ohlcv = krx.get_ticker_price_history(ticker="종목코드", start="시작일", end="종료일")
index_ohlcv = krx.get_index_price_history(index_name="지수명", start="시작일", end="종료일")
market_snapshot = krx.get_market_snapshot(date="특정일")

두 라이브러리 모두 내부적으로 거래소나 포털 등 공개된 소스에서 데이터를 긁어오는 방식으로 동작하는 것으로 알려져 있다. 그래서 소스 쪽 페이지 구조가 바뀌면 라이브러리도 따라서 업데이트가 필요해지는 경우가 생긴다. 이 특성은 뒤에서 다룰 실수와도 연결된다.

받아온 원본, 011의 정제·저장 파이프라인으로 넘기기

FinanceDataReader나 pykrx에서 받은 표는 어디까지나 원본이다. 결측치·이상치가 섞여 있을 수 있고, 라이브러리마다 컬럼명이나 날짜 형식이 다를 수 있다. 이 원본을 그대로 전략 로직에 넣지 말고, 파이썬 시세데이터 수집·정제·저장 기초에서 다룬 흐름대로 한 단계 거쳐야 한다.

python 코드 보기
# 개념 의사코드
raw = fdr.get_price_history(symbol, start="시작일", end="종료일")
candles = normalize_to_ohlcv(raw)          # 컬럼명·날짜 형식을 내부 표준으로 통일
candles = fill_missing_candles(candles, expected_interval_sec)  # 011 참고
save_candles(symbol, candles, store)       # 원본과 정제본을 구분해서 저장

라이브러리가 돌려준 표를 내부 표준 OHLCV 구조로 바꾸는 정규화 단계를 한 번 거치면, 이후에 데이터 소스를 바꾸거나 두 라이브러리를 섞어 써도 뒷단 로직은 그대로 재사용할 수 있다.

자주 하는 실수

  1. 수정주가를 반영했다고 착각한다. 무상증자·액면분할 같은 이벤트가 있었던 종목은 조회 시점에 따라 과거 가격이 조정된 값(수정주가)인지 아닌지가 갈릴 수 있다. 이걸 확인하지 않고 그대로 백테스팅에 넣으면, 이벤트가 있었던 구간에서 수익률이 실제와 다르게 계산될 수 있다. 어떤 방식으로 값이 계산되어 있는지는 라이브러리 문서에서 반드시 확인해야 한다.
  2. 상장폐지·거래정지 종목의 결측을 그냥 넘긴다. 조회 기간 중간에 상장폐지되거나 오래 거래정지된 종목은 특정 구간의 데이터가 아예 없거나 비정상적으로 비어 있을 수 있다. 이런 종목이 백테스팅 대상에 섞여 있으면, 결측 구간을 처리하지 않은 채 계산이 진행돼 결과가 조용히 왜곡된다. 백테스팅 개념과 함정에서 다룬 생존편향 문제와도 맞닿아 있는 지점이다.
  3. 라이브러리 버전에 따라 API가 바뀐 걸 모르고 넘어간다. 오픈소스 데이터 라이브러리는 소스 쪽 구조 변경에 대응하느라 함수명이나 파라미터가 버전 사이에 바뀌는 경우가 있다. 예전에 참고한 코드나 블로그 글이 최신 버전에서는 그대로 동작하지 않을 수 있으므로, 에러가 나면 라이브러리 버전부터 확인하는 습관이 필요하다.
  4. 과도하게 반복 호출해서 차단당한다. 반복문으로 여러 종목을 한 번에 조회하다 보면 짧은 시간에 호출이 몰릴 수 있다. 소스 쪽에서 이런 패턴을 차단하는 경우가 있으므로, 여러 종목을 조회할 때는 호출 사이에 지연을 두거나 이미 받은 데이터는 재사용하는 편이 안전하다.

오늘의 정리

  1. 증권사 API 앱키를 발급받기 전에, FinanceDataReader·pykrx 같은 무료 라이브러리로 먼저 시세 데이터의 형태를 익혀두는 편이 낫다.
  2. 두 라이브러리 모두 종목 코드나 지수명, 조회 기간을 넣으면 시계열 표를 돌려주는 구조를 가진 것으로 알려져 있지만, 정확한 함수명·파라미터는 항상 공식 문서에서 확인해야 한다.
  3. 라이브러리가 돌려준 원본은 그대로 쓰지 말고, 정규화·결측 처리·원본 분리 저장 같은 정제 단계를 거쳐야 한다.
  4. 수정주가 반영 여부, 상장폐지·거래정지 종목의 결측 처리는 특히 조용히 결과를 왜곡시키는 지점이라 별도로 확인해야 한다.
  5. 오픈소스 데이터 라이브러리는 버전에 따라 API가 바뀔 수 있으므로, 예전 코드가 안 되면 버전부터 의심해본다.

이 글은 공개된 데이터 라이브러리의 일반적인 사용 개념을 정리한 것이며, 정확한 함수명·파라미터는 각 라이브러리의 공식 문서에서 확인해야 합니다. 투자 조언이 아니고 특정 종목을 추천하지 않습니다. 수익 보장은 없으며, 투자 손실의 책임은 투자자 본인에게 있습니다.

← 전체 글 목록