[오늘의 개발] DART 재무제표 공시를 통한 국내 증시 데이터 시각화

데이터 과학에 관심을 가지면서, 증권 데이터를 분석해 직접 퀀트 투자를 해보는 것이 꿈이었다. 특히 문병로 교수나 권용진 퀀트의 책을 보면서, 데이터에 기반해 논리정연한 투자를 하는 모습이 나와 대비되어보였다. 그렇게 계속 꿈에만 그리다가, 파이썬 데이터 분석 패키지에 적응하면서 국내 증권 데이터를 분석해 투자에 적용해보기로 마음을 먹었다.

이를 위해선 다음 세가지 과정을 거쳐야만 했다.
1. 증권 데이터 수집
2. 데이터 전처리 및 계산
3. 데이터 시각화를 통한 투자 참고자료 생성

미리 말해두자면, 나는 데이터 전처리 이후에 각종 투자지표를 계산하기 위해 ‘일자별 시가총액’이나 ‘기간별 발행주식수’ 데이터를 얻지 못해서 실패했다. 이 글은 내가 실패를 깨달기 전까지 진행했던 것들을 정리해둔 프로젝트 기록이다.

 

증권 데이터 수집 

문제점
일단, 국내에서 개인이 증권 데이터를 수집할 수 있는 곳은 한정되어 있다. 대표적으로 금융감독원 DART, 네이버 증권, FnGuide 정도가 데이터를 얻을 수 있는 장소의 전부이다. 그런만큼 문제점들도 많은데, 그중에 2가지 정도를 나열해보고자 한다.

첫째, 일반 투자자를 위한 증권 데이터 부족
투자를 하다보면 과거의 증권 데이터가 필요할 때가 있다. 특히 가격차트로 알 수 없는 재무 데이터의 경우엔 더욱 그렇다. 그럴때면 네이버 증권이나 HTS에서 기본으로 제공하는 FnGuide부터 되고, 실제로 많은 개발자들이 이 부분을 크롤링해서 쓴다.

FnGuide 재무분석 정보

근데, 잘 살펴보면 FnGuide 재무정보에 한계가 보인다. 대표적으로 데이터의 해상도, 분기/연도별 재무 데이터 기간이 각각 1년과 5년에 한정되어 있다. 정말 가볍게 알아보기엔 좋지만, 데이터 분석에 크롤링해 사용하기에는 정보량이 부족하다.

둘째, 금융감독원 DART 오픈 API의 기능 부족
그래서 정확한 장기간의 재무정보를 얻기 위해서는 DART에 분기/연도별 재무제표에서 정보를 얻어야한다. DART는 개발자들을 위해서 오픈 API를 제공하고 있지만, 여기에 또 다른 문제가 있다. API의 기능이 보고서 검색에 한정되어 있다. 즉, 특정 회사의 재무제표를 검색할 수는 있지만 그 재무제표의 수많은 계정항목 당 값들을 알 수가 없다. 사실, 알아낼 방법은 있다. 재무제표의 개별 URL을 따서, 재무상태표와 손익계산서의 표를 크롤링으로 긁어오는 방법이다. 여러 개발 블로그들에서 소개하고 있는 방식들이다. 하지만, 매 종목마다 크롤링하는 방식은 비효율적이기도 하고, 데이터에 오류가 발생할 가능성도 적지 않다.

셋째, 유료 기업정보 제공 서비스의 폭리와 부실함
다 포기하고, 유료 증권 데이터를 구매해서 쓸 생각도 해봤다. 그래서 국내에 KOSCOM, 세종 데이터, 아이투자, FnGuide…모두 찾아봤지만 가격은 한달에 10만원에 가까운데도 불구하고, 기본적인 RESTful API조차 지원하지 않는 모습에 어이가 없었다. 참고로 해외에 IED, SimFin, EODHistoricalData와 같은 회사들은 무료 또는 20달러 선에서 미국 내 상장사의 10년치 펀더멘탈 정보를 제공한다. 이정도 되면 국내 기업정보 제공 업체들의 폭리와 서비스 부실 밖에 탓할 수가 없다.결론적으로, 어떠한 방법을 써서라도 API이나 크롤링으로는 증권 데이터를 받아올 수 없게되었다. 진심으로 이때부터 집에 블룸버그 단말기 한대 두고선, 증권 데이터를 무제한으로 끌어다 쓰는 꿈을 가지게 됬다.해결방안
다행히도, 금융감독원에서 얼마 전부터 CSV형식으로 국내 상장사들의 재무제표를 분기별로 업로드 해두었다. 수많은 개발 블로그들이 DART API를 통해 크롤링하는 방식을 선택한걸 보아, 이 파일이 존재하는지 조차 잘 안알려진 것 같다. 2015년 4분기의 정보부터 제공되어있지만, 기업의 분기별 재무상태표/손익계산서/현금흐름표가 모두 담겨있다. 잘 가공하면 충분히 사용할만한 데이터이다.

 

데이터 전처리 및 계산

데이터 전처리
데이터 수집이 해결된 만큼, raw data를 분석에 사용할 수 있도록 전처리 과정을 거쳐야한다. 여기서 나는 raw data인 CSV 파일을 개별 상장사의 분기별 재무제표들로 구성된 sqlite 파일로 전환하는 것을 목표로 했다. 분명 이렇게 하면 이해가 안될것 같아 설명을 더해본다.

금융감독원에서 업로드한 CSV 파일에는 국내 모든 상장사의 해당 분기의 개별 보고서의 데이터가 모두 들어있다. 다시 말해, ‘2015년_4분기_재무상태표.csv’ 파일에는 국내 모든 상장사들의 2015년 4분기 재무상태표의 데이터가 모조리 담겨있다는 뜻이다. 직접 샘플 데이터를 다운받으면 이해하기 쉬울 것이다.

금융감독원이 제공한 CSV 형식의 재무제표 파일

내가 원하는 것은 하나의 기업 sqlite 파일 아래에 수많은 분기별 개별 보고서 테이블이 있는 것이다. 일례로 ‘AK홀딩스.sqlite’ 아래 ‘AK홀딩스_2015_4Q_BS’, ‘AK홀딩스_2015_4Q_BS_Con’, ‘AK홀딩스_2015_4Q_IS’…으로 이어지는 수많은 테이블들을 만드는 것이다.

데이터 전처리 과정 이후에 개별 기업 Sqlite 파일의 모습

여기서부터 Python을 통해 CSV 파일을 import 해서 개별 기업의 리포트들을 sqlite의 테이블에 저장하는 과정을 진행했다. 사실 소스코드를 공개해 단계별로 소개하고 싶지만, 전혀 주석 정리가 되어있지 않은 스파게티 코드라 소개할 가치조차 없다.

그래도 대략 알고리즘을 설명하자면, CSV 파일을 읽어들여 파일명에 따라 회사명, 분기, 보고서 종류, 연결재무제표 여부를 판독한다. 그리고 읽어들인 CSV 파일을 데이터프레임 형태로 변환한다. 이후에 한 회사명의 sqlite 파일을 생성하고, 그 아래에 분기별 개별 재무제표 데이터프레임을 테이블 형태로 모두 저장한다.

이렇게 말하니 무슨 말인지 잘 이해가 안될 것이다. 나도 지금 코드를 살펴보니 이해가 안된다. 그런데 어째 작동을 한다(…)

그렇게 약 50시간을 갈아넣은 끝에, 모든 상장사들의 2015년 4분기 ~ 2018년 3분기의 재무제표를 데이터베이스화 시키는데 성공했다. 그 파일은 여기서 다운받을 수 있다.

데이터 계산

이제 데이터 전처리가 마무리된 만큼, 기존의 재무정보를 기반으로 새로운 투자지표들의 값을 구하려 했다. 이를 위해서 Alpha Vantage에서 주식 가격을 가져와 데이터프레임으로 리턴하는 함수도 개발하였다. 투자지표를 계산한 후에, 기존 주식 가격 데이터프레임에 합쳐서 PER이나 PBR의 일자별 변동 추이를 살펴보고자 했다.

여기서 내 전체 프로젝트를 무너지게 한 큰 문제점을 깨달게 되었다. 바로 당시 일자의 상장 주식수나 시가총액을 둘다 모른다는 점이었다. PER이나 PBR과 같은 지표들은 주당 000을 따지기 때문에, 상장주식수를 아는 것이 무척이나 중요하다. 그래야 Earning이 됬든 Book이 됬든 간에 상장주식수로 쪼개서 값을 구할 수 있다.

하지만, 우리나라 증권 API나 사이트 어디에도 상장주식수의 변동을 시계열 데이터로 일목요연하게 다룬 곳은 없었다. 하다못해 일자별 시가총액 데이터만 있었어도 계산(일별 시가총액 / 일별 종가 = 일별 상장주식수)이 가능했겠지만, 그런 곳은 없었다.

결국 여기서 내 전체 프로젝트가 멈추게 되었다. 약 70시간 동안 잠을 줄여가며 개발을 했지만, 허무한 문제에서 포기할 수 밖에 없었다. 그래도 무슨 감정이었는지, 프로젝트를 날렸는데도 화가 나기보다는 담담했다.

 

배운점

먼저, Pandas 데이터프레임 사용법이 엄청 늘었다. 하루에도 수십번 StackOverflow에서 데이터프레임 관련 자료들을 찾아본 것 같다. 그래서인지 이제는 데이터프레임 자료 검색이나 인덱스 리스팅과 같은 사소한 부분에서 막히지는 않는 듯 하다. 그리고 알고리즘, 특히 조건문 처리를 더 효율적으로 짤 수 있게된 것 같다. 예상치 못한 결과인데, 워낙 조건문이나 예외처리를 많이 하다보니 자연스래 늘었다. 마지막으로 Sqlite를 접하다보니, SQL 쿼리문에 대해서도 배우게 되었다. 나중에 Django ORM 쿼리에 꽤 잘 써먹을 수 있을 듯하다.

그리고 개인적으로 배운 것이라면, 노력만 한다고 일이 잘 될리가 없다. 아무리 철저하게 계획해도 설계 미스로 훅가는건 한순간이다. 그저 과정에서 많은 것들을 배워간다는 자세로 마음을 비우면서, 현재 하고 있는 일들이 잘되기를 바라는게 정신건강에 이로운 것 같다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다