파이썬 주식 데이터 가져오기 5분 실습 — 52주 신고가 대비 위치 계산

“신고가 근처 종목을 본다”는 이야기를 여러 번 했는데, 정작 그 ‘근처’를 직접 계산해 본 적은 없으실 겁니다.

증권사 화면에서 눈으로 보는 것과, 내 손으로 숫자를 뽑아보는 것은 이해의 깊이가 다릅니다. 오늘은 파이썬으로 종목 하나의 52주 신고가 대비 현재 위치를 계산해 보겠습니다. 설치 포함 5분이면 됩니다.

[30초 요약] `FinanceDataReader` 한 번 설치하면 국내 주식 가격을 몇 줄로 받아올 수 있습니다. 1년치 종가를 받아 최고가를 구하고, 현재가와 비교하면 끝입니다. 다만 종목코드를 숫자로 다루면 조회가 통째로 실패하는 유명한 함정이 있습니다.

준비: 설치 한 줄

터미널에서 아래 한 줄이면 준비가 끝납니다.

pip install finance-datareader

이 라이브러리는 한국거래소 데이터를 파이썬에서 쉽게 받도록 감싸 놓은 오픈소스입니다. 별도 API 키나 가입이 필요 없습니다.

코드: 다섯 줄

삼성전자(005930)를 예로 들겠습니다. 파일 하나 만들어 그대로 붙여 넣고 실행해 보세요.

import FinanceDataReader as fdr

df = fdr.DataReader('005930', '2025-07-01')   # 최근 1년치
high_52w = df['Close'].max()                   # 기간 내 최고 종가
now = df['Close'].iloc[-1]                     # 가장 최근 종가
print(f"현재가 {now:,.0f} / 52주 고가 {high_52w:,.0f} "
      f"→ 고점 대비 {(now / high_52w - 1) * 100:+.1f}%")

출력은 이런 형태로 나옵니다(숫자는 실행 시점에 따라 달라집니다).

현재가 249,500 / 52주 고가 362,500 → 고점 대비 -31.2%

이 마지막 숫자가 스크리너에서 말하는 신고가 근접도입니다. 0%에 가까울수록 신고가를 새로 쓰는 중이고, 마이너스가 클수록 고점에서 멀어진 상태입니다. 많은 모멘텀 스크리너가 이 값에 문턱을 두어 후보를 좁힙니다.

숫자 하나 뽑았을 뿐이지만, 이제 “고점 대비 몇 퍼센트”라는 말이 추상적인 표현이 아니라 직접 계산 가능한 값이 되었습니다.

함정 하나: 종목코드는 문자열입니다

여기서 거의 모든 초보자가 한 번은 걸립니다. 종목코드 `005930`을 따옴표 없이 숫자로 쓰면 어떻게 될까요.

df = fdr.DataReader(5930, '2025-07-01')   # ✗ 앞자리 0이 사라짐

`005930`이 `5930`이 되면서 조회가 실패합니다. 사람 눈에는 같아 보여도 기계에게는 완전히 다른 값입니다. 특히 종목 목록을 엑셀이나 CSV로 저장했다가 다시 읽을 때 이 사고가 자주 납니다. 엑셀이 친절하게 앞자리 0을 지워주기 때문입니다.

그래서 실무 코드는 종목코드를 항상 문자열로 다루고, 여섯 자리로 채워 넣는 방어를 습관처럼 넣습니다.

code = str(code).zfill(6)   # 5930 → '005930'

함정 둘: 최근 데이터가 항상 있는 건 아닙니다

두 번째는 더 조용해서 위험합니다. 휴장일이거나 데이터 반영이 늦으면, 방금 받은 데이터의 마지막 날짜가 오늘이 아닐 수 있습니다. 그걸 모르고 계산하면 며칠 전 가격으로 오늘을 판단하게 됩니다.

그래서 데이터를 받은 직후 마지막 날짜를 확인하는 습관이 필요합니다.

print("마지막 데이터:", df.index[-1].date())

자동으로 매일 돌리는 코드라면, 이 날짜가 너무 오래됐을 때 경고를 띄우게 만들어야 합니다. 자동화에서 가장 무서운 건 에러가 나는 게 아니라, 멈춘 데이터로 아무 일 없다는 듯 계속 도는 것입니다.

여기서 스크리너까지 가려면

방금 한 것은 종목 하나입니다. 스크리너는 여기서 두 가지가 더 필요합니다.

첫째, 종목 목록입니다. 코스피·코스닥 전 종목을 받아오고, 관리종목처럼 애초에 손대면 안 되는 것들을 걸러내야 합니다. 둘째, 속도입니다. 2,700개 종목을 하나씩 순서대로 받으면 십 분이 넘게 걸려서, 매일 아침 자동으로 돌리기엔 부담이 됩니다.

즉 실전 파이프라인은 목록 수집·정제·병렬 다운로드·실패 대응이라는 별개의 문제를 풉니다. 화려하지 않지만 여기가 부실하면 뒤의 필터가 아무리 정교해도 소용없습니다. 쓰레기가 들어가면 쓰레기가 나오니까요.

자주 묻는 질문

FinanceDataReader는 무료인가요? 네, 오픈소스이고 가입이나 API 키가 필요 없습니다. 다만 공개 데이터를 긁어오는 구조라 원본 사이트 사정에 따라 실패하는 날이 있습니다. 자동화한다면 실패를 감지하고 대체 경로로 넘어가는 설계가 필요합니다.

미국 주식도 되나요? 됩니다. `fdr.DataReader(‘AAPL’, ‘2025-07-01’)`처럼 티커를 쓰면 됩니다. 국내 종목은 여섯 자리 코드, 해외는 티커라는 점만 다릅니다.

52주를 정확히 세려면 어떻게 하나요? 위 예제는 시작일을 1년 전으로 줘서 근사했습니다. 더 엄밀하게는 거래일 기준 252봉을 쓰거나, `df[‘Close’].rolling(252).max()`로 각 시점의 52주 최고가를 계산합니다. 목적에 따라 고르면 됩니다.

함께 읽으면 좋은 글

스크리너가 무엇을 보고 종목을 거르는지는 모멘텀 스크리너 기초에 정리했습니다. 통과 종목을 그대로 사면 안 되는 이유는 스크리너는 매수 신호가 아니다에서 다뤘습니다.

오늘 한 종목으로 해본 계산을 전 종목으로 확장하고, 목록 수집·정제·병렬 다운로드까지 묶는 과정은 전자책 파이썬 주식 스크리너 만들기와 검증 방법에 단계별로 정리했습니다.

숫자를 직접 뽑아보면 남의 말에 덜 흔들립니다. 오늘 다섯 줄이 그 시작입니다.

※ 본 글은 특정 종목·매매 시점 권유가 아니며, 투자 판단과 결과의 책임은 본인에게 있습니다.

Leave a Comment