본문 바로가기

데이터분석/금융

Python를 활용한 코스피 재무 데이터 확인 방법 3 + 1가지

"데이터를 만지려면 크롤링은 기본이지"

이렇게 말한 친구가 있었다.

크롤링이란, 인터넷에 있는 데이터를 코드를 통해

자동으로 긁어오도록 만드는 작업을 뜻하는데

예를 들면 네이버 금융을 통해 조회한 네이버 주가 정보 중에서

실시간으로 업데이트되는 내용을 자동으로 받아올 수 있다.

 

물론 맞는 말이다. 하지만 실시간으로 업데이트 되는 내용이 굳이 필요하지 않다면,

다시 말해 분기별로 발표되는 재무제표 데이터를 확인하고 싶다면

굳이 크롤링의 영역까지는 넘어가지 않아도 된다.

이미 관련 정보들을 잘 정리해 놓은 API가 많이 존재하기 때문이다.

 

API는 코딩계의 프로그램이자 공식이라고 생각하면 된다.

원의 둘레를 구할 때, 열심히 미분과 적분을 때려가며 구하는 것이 크롤링이라면

2*$\pi$ * R 에서 R 값만 입력하면 둘레가 나오는 것과 같다.

 

하지만 역시 공짜로 사용할 수 있는 프로그램의 수는 적을 뿐더러

퀄리티도 난감한 경우가 많아 시행착오가 필수적이다.

이번 글에서는 내가 겪은 시행착오를 정리해두려고 한다.

 

1. PyKRX

처음 이 API를 접하고는 크롤링 같은 것들은 다 망하겠거니 싶었다.

일별 주가의 고점, 저점, 시가, 종가 등과 함께

종목별 PBR, EPS, PER까지 모두 볼 수 있기 때문이다.

 

또한 주가 데이터를 다룰 때 골치아프기 마련인 액면분할도

자동으로 보정해준다. 보정 해제마저 가능하다.

액면 분할은 5000원 하는 한 개의 주식을 1000원 짜리 다섯 개로 나누는 행위를 말하는데

순식간에 주가가 변하므로(시가총액에는 변함이 없다)

데이터를 손볼 때 필수적으로 확인해야 한다.

네이버 액면분할 보정 전
네이버 액면분할 보정 후

 

그래서 신나게 pykrx를 사용하려고 하던 중에 중요한 이슈를 발견했다.

주가 데이터만 액면분할이 조정되어 있고

PER, EPS 등의 데이터에는 반영되어 있지 않은 것이다.

 

네이버 투자지표

위 표에서 2018년과 2019년의 EPS 값에 큰 차이가 발생한 것을 볼 수 있는데

2018년에 액면가를 500원에서 100원으로 나눴기 때문이다.

EPS는 연간 순이익을 발행 주식 수로 나눈 값을 사용하는데, 

발행주식 수가 다섯 배로 껑충 뛰게 되니까 EPS는 1/5로 줄어든 것이다.

 

이것 저것 머리를 굴리다가, 아 pykrx는 못쓰겠다 결론을 내렸다(하지만....).

2. DART-fss

그래서 인터넷을 뒤적이다가 간신히 찾은 것이 DART-fss라는 API이다.

와! 다트!

어째 경영학과를 전공하던 시절보다 최근 몇 달간 DART에 더 많이 들어간 느낌이지만

그만큼 정보를 손으로 검색하기에는 제격인 사이트이다.

그런 수작업들을 python으로 자동화해준다니, 이거야말로 해답이다 싶었다.

 

오랜 시간을 걸려 API를 설치하고 인증키까지 받아왔건만

위의 에러에서 벗어나질 못했다.

 

'JAVA 설치에 문제가 있다는 건가? 파이썬 API인데 Java랑 무슨 상관이지?'

이런 의문을 결국 해결하지 못하고 dart-fss 역시 놓아주게 되었다.

또 애매하게 20%는 성공했다는 것이 더 열받았다.

 

3. Open DART Reader

API는 위 DART-fss에서도 사용하는 Open DART를 직접적으로 다룰 수 있다.

와! 다트!

보다 '직접적'이라는 느낌에 정말 이거야말로 해답이구나 싶었다.

하지만 알고보니 정말 직접적으로 다루는 수준이라서

DART에서 클릭해서 들어가는 보고서 제목들을 코드로 확인하는 셈이었다.

 

뭐 DART 데이터를 근본적으로 다룰 수 있다는 점은 반갑지만

내가 원하는 데이터를 찾아내려면 앞으로 사흘동안은

꼼짝없이 시행착오만 하고 있겠구나 싶어서 냉큼 포기했다.

 

4. 다시 pykrx

'아, 여기까진가?'

이런 생각을 하면서 침투부를 뒤적이던 중에

pykrx의 EPS와 PER을 다시 살펴봐야겠다는 생각이 들었다.

 

아이투자에서 설명해 놓은 EPS, PER 등 지표를 구하는 방법은 아래와 같다.

 

뭔가 너저분하지만, 핵심 내용은

EPS에 발행주식수를 곱하면 당기 순이익을 구할 수 있고

시가총액에서 당기 수이익을 나누면 PER을 구할 수 있다는 것이다.

 

pykrx의 문제는 발행주식수의 변화를 반영하지 못하면서

단순히 주가에서 EPS를 나눠주는 방법으로 PER를 계산했기에

발행주식수 -> EPS-> PER 순으로 문제가 발생한 것이다.

하지만 당기순이익은 제대로 구할 수 있으므로,

EPS와 PER을 각각 새로 구할 수 있다.

 

새로 구한 PER과 EPS

액면분할이 이뤄진 해(2018)에는

주식 발행량 반영(5배 증가)은 안되면서 주가는 반영이 되어버렸기 때문에

income을 구하는 단계에서 에러가 발생했지만

나머지 부분은 훌륭하게 계산할 수 있었다.

이걸 바탕으로 간략한 데이터 분석 정도는 가능할테다.