📋 목차
파이썬으로 금융 데이터 수집을 자동화하면 매일 아침 엑셀 노가다 없이 주가, 재무제표, 환율 데이터가 알아서 쌓이는데, 3개월 운영해보니 라이브러리 선택부터 법적 리스크까지 예상 못 한 변수가 꽤 많았거든요.
처음엔 단순했어요. 네이버 증권에서 종목별 시세를 복사해서 엑셀에 붙여넣고, 전일 대비 등락률 계산하고. 종목이 5개일 땐 괜찮았는데, 20개 넘어가면서 하루에 30분씩 날리더라고요. 그때 “이거 코드로 돌리면 되지 않나?” 싶었죠.
근데 막상 시작하니까 라이브러리가 너무 많은 거예요. FinanceDataReader, pykrx, yfinance, pandas_datareader… 뭘 써야 하는지부터 막혔고, API 키 발급이 필요한 것도 있고, 어떤 건 한국 주식 데이터가 부정확하기도 했어요. 그래서 직접 다 써보고 비교한 내용을 정리해봤습니다.
수작업으로 금융 데이터 모으다 한계 느낀 순간
솔직히 말하면, 저는 꽤 오래 수작업파였어요. 네이버 증권에서 관심 종목 시세 보고, 스프레드시트에 날짜별로 정리하고, 이동평균선은 직접 수식 걸어서 계산했거든요. 이게 종목 10개 이하일 때는 나름 뿌듯하기도 했어요. 내 손으로 데이터를 만든다는 느낌이랄까.
문제는 주말에 밀렸을 때 터졌어요. 금요일 데이터를 월요일에 몰아서 입력하다 보니 날짜를 잘못 넣는 실수가 생기고, 한 번은 삼성전자 종가를 72,000원으로 넣어야 하는데 7,200원으로 입력해서 수익률 계산이 완전히 틀어진 적도 있었어요. 그걸 발견한 게 2주 뒤라서, 그 사이 분석한 내용을 전부 다시 해야 했죠.
수작업의 진짜 한계는 속도가 아니라 정확성이에요. 사람은 반복 작업에서 반드시 실수하거든요. 그리고 과거 데이터를 소급해서 모으려면? 네이버 증권에서 1년치 시세를 페이지 넘겨가면서 복사하는 건 현실적으로 불가능합니다.
결정적으로 마음먹게 된 건, 코스닥 종목 하나가 상장폐지되면서였어요. 그 종목의 과거 데이터를 뒤늦게 찾으려니까 네이버 증권에서 이미 사라진 뒤더라고요. 자동으로 매일 수집해서 쌓아뒀으면 이런 문제가 없었을 텐데.
파이썬 금융 라이브러리 4종 직접 비교한 결과
파이썬으로 한국 주식 데이터를 가져올 수 있는 주요 라이브러리는 크게 네 가지예요. FinanceDataReader, pykrx, yfinance, pandas_datareader. 이 중에서 어떤 걸 메인으로 쓸지 결정하려면 데이터 범위, 안정성, 그리고 수정주가 처리 방식을 꼭 따져봐야 합니다.
| 항목 | FinanceDataReader | pykrx |
|---|---|---|
| 데이터 소스 | 네이버 금융 | KRX (한국거래소) |
| 조회 시작 시점 | 약 1998년~ | 1990년~ |
| 상장폐지 종목 | 조회 가능 | 조회 가능 |
| 거래량 보정 | 미보정 | 미보정 |
| 해외 주식 | 미국·환율·암호화폐 | 국내 전용 |
직접 써본 기준으로 말하면, 국내 주식만 다룬다면 pykrx가 가장 안정적이었어요. 한국거래소 데이터를 직접 가져오기 때문에 네이버 금융의 트래픽 제한에 걸리는 일이 거의 없거든요. 특정 날짜 기준 상장 종목 리스트를 뽑을 수 있다는 것도 백테스팅할 때 큰 장점이에요.
반면 해외 주식이나 환율, 암호화폐까지 한 번에 다루고 싶다면 FinanceDataReader가 범용성에서 앞서요. fdr.DataReader(‘005930’, ‘2020’)처럼 한 줄이면 삼성전자 주가가 DataFrame으로 떨어지니까, 초보자 입장에서 진입장벽이 가장 낮기도 하고요.
yfinance는 해외 종목에는 강력한데 국내 데이터에서 가끔 빈 값이 나오는 경우가 있었어요. 종목코드 뒤에 .KS(코스피)나 .KQ(코스닥)를 붙여야 하는 것도 처음엔 헷갈렸고요. pandas_datareader는 요즘은 솔직히 단독으로 쓸 이유가 별로 없어요. 다른 라이브러리들이 훨씬 편해졌거든요.
📊 실제 데이터
위키독스의 ‘퀀트 투자 쿡북’ 비교 분석에 따르면, 액면분할(예: 삼성전자 2018년 50:1 분할) 반영 시 FinanceDataReader의 수정주가가 가장 정확한 것으로 나타났어요. 다만 네 라이브러리 모두 KRX·네이버 소스 기준으로는 거래량 보정이 안 되는 공통 한계가 있습니다.
공식 API로 재무제표까지 끌어오는 구조
주가 데이터만으로는 반쪽짜리예요. 진짜 투자 판단에 필요한 건 재무제표, 공시 정보, 그리고 거시 경제 지표까지 묶어서 보는 거잖아요. 여기서 OpenDART API가 등장합니다.
금융감독원이 운영하는 전자공시시스템 DART에서는 공식 API를 무료로 제공하고 있어요. API 키를 발급받으면 파이썬에서 기업별 재무상태표, 손익계산서, 현금흐름표를 코드 몇 줄로 가져올 수 있거든요. OpenDartReader라는 파이썬 패키지를 쓰면 더 간단해져요.
처음에 API 키 발급받을 때 좀 당황했던 게, 신청하고 바로 나오는 게 아니라 승인까지 시간이 좀 걸리거든요. 그리고 하루 요청 횟수 제한이 있어서 한 번에 수백 종목 재무제표를 긁으려면 sleep()으로 딜레이를 넣어야 했어요. 안 그러면 429 에러(Too Many Requests)가 뜨면서 차단당합니다.
한 가지 흔한 오해가 있는데, DART 데이터가 실시간이라고 생각하는 분들이 있어요. 실제로는 기업이 공시를 등록한 이후에 반영되는 거라서, 분기 실적 발표 직후에도 며칠 정도 시차가 생길 수 있어요. 이걸 모르고 “왜 아직 최신 재무제표가 안 나오지?” 하면서 코드를 의심하는 경우가 꽤 있더라고요.
해외 재무 데이터까지 필요하다면 yfinance의 ticker.financials 기능이나 Finnhub API도 괜찮은 선택이에요. Finnhub은 무료 플랜에서 분당 60회 요청까지 지원하는데, 글로벌 종목 커버리지가 넓어서 미국주식 분석할 때 유용했습니다.
자동 스케줄링으로 매일 데이터 쌓는 방법
데이터 수집 코드를 짰으면 이걸 매일 자동으로 실행시켜야 진짜 자동화죠. 여기서 리눅스·맥은 crontab, 윈도우는 작업 스케줄러를 씁니다.
crontab 설정은 생각보다 간단해요. 터미널에서 crontab -e를 입력하고, 예를 들어 매일 오후 4시 30분(장 마감 후)에 스크립트를 실행하고 싶으면 30 16 * * 1-5 뒤에 파이썬 경로와 스크립트 경로를 적으면 돼요. 1-5는 월요일부터 금요일까지만 실행하라는 뜻이니까, 주말에 불필요하게 돌아가는 걸 막을 수 있죠.
윈도우에서는 검색창에 “작업 스케줄러”를 치면 나오는데, GUI로 시간·반복 주기를 설정할 수 있어서 오히려 더 직관적이에요. 근데 문제가 하나 있었어요. 노트북이 절전 모드로 들어가면 작업이 실행 안 되더라고요. 이거 때문에 한 달치 데이터가 빠져서 나중에 수동으로 채워 넣느라 고생한 적이 있습니다.
💡 꿀팁
안정적인 자동 수집을 원한다면 클라우드 서버를 추천해요. AWS EC2 프리티어나 Google Cloud의 무료 VM 인스턴스를 쓰면 24시간 꺼지지 않는 환경에서 cron을 돌릴 수 있거든요. 월 비용이 거의 0원에 가깝고, 절전 모드 문제도 없어요.
수집한 데이터는 CSV로 날짜별 파일을 쌓는 방식과, SQLite 같은 경량 DB에 적재하는 방식이 있어요. 초기에는 CSV가 편한데, 데이터가 6개월 이상 쌓이면 파일이 수백 개가 되면서 관리가 힘들어져요. 결국 저도 SQLite로 갈아탔는데, pandas의 to_sql() 메서드를 쓰면 전환이 어렵지 않았습니다.
크롤링 법적 리스크, 모르면 진짜 큰일 난다
이 부분을 간과하는 분들이 정말 많아요. 금융 데이터 수집이라고 하면 크롤링부터 떠올리는데, 한국에서 웹 크롤링은 법적으로 상당히 민감한 영역이에요.
robots.txt는 웹사이트가 자동 수집 프로그램의 접근을 제한하는 표준인데, 법적 강제력은 없는 권고안이에요. 그렇다고 무시해도 된다는 뜻은 아닙니다. 실제로 국내에서 웹 스크래핑 관련 민사소송이 발생한 사례가 있고, 특히 영리 목적으로 타사 데이터를 대량 수집하면 부정경쟁방지법이나 저작권법에 저촉될 수 있어요.
그래서 제가 내린 결론은 이래요. 크롤링 대신 공식 API를 최우선으로 쓰라는 거예요. OpenDART, 한국은행 경제통계시스템(ECOS), KRX 정보데이터시스템 같은 공공 데이터는 API를 통한 접근이 명시적으로 허용되어 있거든요. 라이브러리를 쓰더라도 pykrx처럼 KRX 공개 데이터를 정식으로 가져오는 건 문제가 되지 않아요.
⚠️ 주의
네이버 금융, 증권사 HTS 화면 등을 직접 크롤링하는 건 이용약관 위반 가능성이 높아요. 특히 수집한 데이터를 재가공해서 서비스로 제공하면 법적 분쟁으로 이어질 수 있습니다. 개인 학습·분석 목적이라 하더라도, 과도한 요청으로 서버에 부하를 주면 업무방해로 문제가 될 수 있으니 반드시 요청 간격을 두세요.
2025년 들어서 AI 크롤링 봇에 대한 웹사이트들의 차단 조치가 눈에 띄게 강해졌어요. robots.txt에 GPTBot, CCBot 같은 AI 크롤러를 명시적으로 차단하는 사이트가 급증했고, 금융 관련 사이트들도 예외가 아니에요. 합법적이고 안정적인 데이터 수집을 위해서는 공식 API 중심의 파이프라인을 짜는 게 장기적으로 훨씬 유리합니다.
실전 파이프라인 설계와 알림 자동화
여기까지 읽었으면 아마 “그래서 실제로 어떻게 구성하라는 거야?”가 궁금하실 거예요. 제가 3개월 동안 운영하면서 정착한 파이프라인 구조를 공유할게요.
1단계는 pykrx + FinanceDataReader로 매일 장 마감 후 국내 주가 OHLCV를 수집하는 거예요. pykrx를 메인으로 쓰되, 환율이나 해외 지수는 FinanceDataReader로 보완하는 구조죠. 2단계로 OpenDART API를 통해 주 1회 신규 공시와 재무제표 업데이트를 체크합니다. 매일 돌릴 필요 없이, 분기 실적 시즌에만 빈도를 높이면 돼요.
3단계가 핵심인데, 수집 완료 후 텔레그램 봇으로 알림을 보내는 거예요. python-telegram-bot 라이브러리 대신 그냥 requests로 텔레그램 Bot API를 직접 호출하는 게 훨씬 간단하더라고요. “오늘 수집 완료: 코스피 920종목, 코스닥 1,600종목, 에러 0건” 같은 메시지가 매일 저녁 폰으로 오면 안심이 됩니다.
💬 직접 써본 경험
한 달쯤 지나서 예상 못 한 문제가 생겼어요. pykrx가 간헐적으로 빈 DataFrame을 반환하는 거예요. KRX 서버 점검이나 일시적 장애 때문이었는데, 에러 처리를 안 해뒀더니 빈 데이터가 DB에 그대로 들어갔어요. 그 뒤로 수집 건수가 0이면 재시도하고, 그래도 실패하면 텔레그램으로 경고 알림을 보내도록 바꿨습니다. 이런 예외 처리가 자동화의 진짜 핵심이에요.
추가로, 수집한 데이터를 기반으로 간단한 조건 알림을 걸어두면 실용성이 확 올라가요. 예를 들어 “52주 신고가 갱신 종목” 또는 “거래량 급등 상위 10” 같은 필터를 걸어서 텔레그램으로 매일 아침 받아보는 거죠. 데이터를 모으는 것 자체보다, 모은 데이터를 어떻게 활용하느냐가 결국 자동화의 가치를 결정해요.
비용 면에서도 이 구조는 꽤 합리적이에요. pykrx, FinanceDataReader, OpenDartReader 모두 무료 라이브러리이고, 텔레그램 봇도 무료예요. 클라우드 서버만 프리티어 쓰면 실질적으로 운영 비용이 0원인 데이터 수집 시스템이 완성됩니다.
Q. FinanceDataReader와 pykrx 중 어떤 걸 먼저 배워야 하나요?
A. 국내 주식 분석이 목적이라면 pykrx를 먼저 추천해요. KRX 데이터를 직접 가져오기 때문에 안정성이 높고, 특정 날짜 기준 상장 종목 리스트까지 확인할 수 있거든요. 해외까지 확장할 계획이면 FinanceDataReader부터 시작해도 괜찮습니다.
Q. 파이썬 초보자도 금융 데이터 자동 수집이 가능한가요?
A. 가능해요. pip install로 라이브러리 설치하고, DataFrame 기본 조작만 알면 시작할 수 있습니다. 다만 스케줄링이나 에러 처리 부분은 약간의 학습이 필요하니, 먼저 주피터 노트북에서 수동 실행부터 시작하는 걸 추천합니다.
Q. 수집한 데이터를 DB 대신 구글 스프레드시트에 저장해도 되나요?
A. 종목 수가 적고 기간이 짧으면 괜찮아요. gspread 라이브러리를 쓰면 파이썬에서 구글 시트에 직접 쓸 수 있거든요. 다만 종목 50개 이상, 1년 이상 데이터를 다루면 속도가 급격히 느려지니 SQLite 이상의 DB를 권장합니다.
Q. OpenDART API 키 발급은 얼마나 걸리나요?
A. 회원가입 후 API 인증키 신청을 하면 보통 당일~1영업일 내에 발급돼요. 하루 요청 횟수 제한이 있으니 대량 수집 시에는 time.sleep()으로 요청 간격을 1~2초 두는 게 안전합니다.
Q. 자동 수집 시스템을 만들면 투자 수익이 올라가나요?
A. 데이터 수집 자체가 수익을 보장하지는 않아요. 하지만 의사결정에 필요한 정보를 빠르고 정확하게 확보할 수 있다는 건 확실한 장점이에요. 남들이 뉴스 보고 종목 검색할 때 이미 데이터가 정리되어 있으면, 분석과 판단에 쓸 시간이 훨씬 많아지거든요.
본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.
파이썬 금융 데이터 자동화는 거창한 기술이 아니라, pykrx + OpenDART + cron 세 가지 조합이면 충분히 시작할 수 있어요. 중요한 건 완벽한 시스템을 한 번에 만들려 하지 말고, 종목 1개부터 돌려보면서 점진적으로 확장하는 거예요.
코딩을 잘 몰라도 괜찮아요. 복사 붙여넣기로 시작해서 조금씩 고쳐가면 됩니다. 다만 크롤링 법적 리스크만큼은 처음부터 확실히 인지하고, 공식 API 중심으로 설계하는 게 오래 갈 수 있는 방법이에요.
혹시 자동화 구성 중에 막히는 부분이 있으면 댓글로 남겨주세요. 경험한 범위 안에서 답변드릴게요. 이 글이 유용했다면 공유도 부탁드립니다.