본문 바로가기
Software/HTS만들기

DART API를 이용한 재무제표 접근법

by lovey25 2018. 12. 3.
반응형

2021-03-10 update log: DART API에 많은 변경사항이 있어서 포스팅 내용과 다른 부분이 있습니다. 내용 수정 예정이니 참고해주세요.


DART API로 제무재표를

DART에서는 국내 상장기업의 재무정보에 접근할 수 있는 통로로 API를 제공을 하고 있습니다. API를 이용하면 간단하게 내가 원하는 기업의 특정 재무정보를 불러오는 프로그램을 만들 수 있다는 얘기죠.

저는 기업코드를 입력하면 해당 기업의 제무재표에서 내가 원하는 지표, 예를 들어, 매출, 부채, 자본 등 이런 값들을 불러오는 그런 프로그램을 만들고자 합니다. 필요한 지표를 불러올 수 있다면 활용은 다양하게 할 수 있겠죠. 그런데 문제가 있었습니다. DART에서는 극히 제한적인 정보들만 API로 제공하고 있었습니다. 제가 원하는 재무지표를 직접적으로 반환해주는 API가 없기 때문에, raw data를 파싱해서 필요한 정보를 뽑아내는 수고가 필요합니다.

이번 글에서는 어떤 방법으로 접근해야 할지를 고민해본 결과를 남기고자 합니다.

DART에서 제무재표 Data에 접근하기

1. DART OPEN API 개발가이드

DART 사이트에 API 개발가이드 페이지가 있습니다. 원하는 정보를 불러오기 위해서 요청값으로 지정해 주어야 할 변수들이 나와 있습니다. 하나씩 보면,

요청주소

먼저 요청값을 보낼 주소가 맨처음 나와 있습니다. xml과 json방식 두가지를 지원한다고 하는데 저는 그냥 xml방식을 사용하렵니다.

auth: 인증키

그리고 바로 auth라는 변수로 인증변수가 있습니다. 40자리의 인증키인데, DART OPEN API를 사용하기위해서는 사용신청을 하고 이 키를 미리 받아야 합니다. 이 부분은 이전 글에서 참고해주세요. (전자공시시스템(DART) API 신청하기)

crp_cd: 종목코드

다음으로는 종목코드 입니다. 내가 알고자 하는 대상기업이 있을테니 당연히 필요한 변수죠. 

상장기업은 6자리 종목코드를 넣으면 된다고 하는데, 이 코드는 한국거래소의 표준코드인데 6자리이니까 우리가 일반적으로 알고 있는 주식의 종목코드 되겠습니다. 

그리고 8자리 고유코드가 있네요. 저는 처음이 이 고유코드도 공개된 코드로 비상장 기업도 포함해서 API로 조회가 가능할걸로 기대를 했었는데요. 이건 공개코드가 아닙니다. 기업에서 자체적으로 홈페이지에 재무정보를 개제하는 등의 용도로 사용하는 코드라서 일반인이 알수는 없다고 하네요. 따라서 API에 비상장기업은 대상이 아니라고 보시면 되겠습니다.

end_dt, start_dt: 검색기간

특정기간에 공개된 문서를 찾기위해서 기간범위를 지정하는 변수입니다. 8자리로 YYYYMMDD 형식으로 지정하도록 되어 있네요.

dsp_tp: 보고서종류

저는 연말결산 후 등록되는 정기 사업보고서에서 재무제표를 뒤져보고자 합니다. 그래서 코드 A001을 사용하면 될것 같습니다. 이 부분은 홈페이지의 변수 상세유형을 참고하시면 되겠습니다.

2. API 요청주소

개발가이드를 통해서 서버로 보낼 API요청주소를 조합해 보면 다음과 같습니다.

http://dart.fss.or.kr/api/search.xml?auth=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&crp_cd=016380&start_dt=20170101&end_dt=20170601&bsn_tp=A001

각각의 요청변수들은 "&"기호로 연결해서 필요한 만큼 조합해서 사용하실수 있네요.

3. API 응답 XML분석: 사업보고서 url 알아내기

위에서 조합한 url을 인터넷 브라우져에 집어넣어보면 아래와 같은 응답이 돌아옵니다. 동부제철의 2016년도 사업보고서가 조회되었네요.

<?xml version="1.0" encoding="utf-8"?>
<result>
  <err_code>000</err_code>
  <err_msg>정상</err_msg>
  <page_no>1</page_no>
  <page_set>10</page_set>
  <total_count>1</total_count>
  <total_page>1</total_page>
  <list>
    <crp_cls>Y</crp_cls>
    <crp_nm>동부제철</crp_nm>
    <crp_cd>016380</crp_cd>
    <rpt_nm>사업보고서 (2016.12)</rpt_nm>
    <rcp_no>20170331005079</rcp_no>
    <flr_nm>동부제철</flr_nm>
    <rcp_dt>20170331</rcp_dt>
    <rmk>연</rmk>
  </list>
</result>

여기서 다음단계로 넘어가는데 유의미한 정보는 14행에 "rcp_no"입니다. 이 번호는 해당 보고서에 부여되는 고유번호 인것 같습니다. 이 rcp_no를 가지고 DART서버에서 해당 사업보고서를 볼수있는 url을 만들수 있는데요. 앞의 주소는 똑같고 뒤에 숫자부분만 고쳐주면 됩니다.

http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20170331005079

4. 사업보고서 페이지 HTML분석: 연결재무제표 url 알아내기

위에서 만든 주소로 접속해 보겠습니다. 짜잔~

보고서가 나왔습니다. 자 여기서 끝난게 아닙니다. 제가 필요한 부분은 연결 재무제표니까, 연결재무제표의 url을 찾아내야 최종 목적지가 되겠습니다. 

그래서 왼쪽 목차부분의 "2. 연결재무제표"의 링크주소가 제가 필요한 부분인데.... 아~ 진짜 제가 이런건 처음이라 그런지 모르겠지만 JavaScript로 되어 있어서 그냥 한방에 주소가 나오는 구조가 아니네요. 일단 이 사업보고서의 전체 HTML코드를 뒤져보겠습니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>
동부제철/사업보고서/2017.03.31
</title>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
<style type="text/css">
    .x-window-dlg .ext-mb-download {
        background:transparent url(images/download.gif) no-repeat top left;
        height:46px;
    }
</style>
... 중략 ...
<!-- x-xeries js libraries  -->
<script type="text/javascript" src="/js/xjs.js"></script>
<script type="text/javascript" src="/js/dart/build/ds-all-min.js"></script>
<script type="text/javascript" src="/js/viewer/popup.js"></script>
<script type="text/javascript">
... 중략 ...
			
		treeNode1.appendChild(treeNode2);
		
		treeNode2 = new Tree.TreeNode({
			text: "2. 연결재무제표",
			id: "13",
			cls: "text",
			listeners: {
				click: function() {viewDoc('20170331005079', '5543242', '13', '390551', '115839', 'dart3.xsd');}
			}
		});
		cnt++;
... 후략

HTML 태크가 시작되고, 죽죽 나가다가 제가 캡쳐한 소스코드 기준으로 20행에서부터 시작되는 javascript에서 필요한 정보드를 얻을 수 있습니다.

"treeNode2"라고 명명된 부분에 연결재무제표라는 말이 보이시죠? 바로 이부분입니다.

그리고 그아래 클릭이 일어났을 때 전달되는 파라미터들이 나열되어 있습니다. 이 아이들을 조합해서 재무제표의 url이 만들어 질 수 있습니다.

http://dart.fss.or.kr/report/viewer.do?rcpNo=20170331005079&dcmNo=5543242&eleId=13&offset=390551&length=115839&dtd=dart3.xsd

그렇게 만들어진 주소입니다.

이 주소로 접속해보면 이렇게 그토록 원하던 재무제표가 나타납니다.

결론

관련 자료도 많지 않았고, HTML이니 javascript니 기본지식도 없는 상태에서 하나씩 찾아가기가 쉽지 않았습니다. 물런 지금까지 알아낸 경로를 통해 프로그램을 만드는건 갈길이 더 먼 얘기죠. 

우선 XML 파싱을 해주는 라이브러리도 사용해야 하고, HTML 파서도 당연히 필요하겠네요. 파싱을 하고나면 그 데이터들을 인식해서 어떤게 아이템 명이고 어떤게 금액이고 등등 자료를 구조화하는 알고리즘도 필요하고 ... 음... 쉽지 않네요.

제가 접근하고 있는 방향이 과연 맞는 방향인지는 저도 잘 모릅니다. API는 제공을 해 주었는데 활용은 이렇게 어렵게 하는게 OPEN API의 원래 취지가 맞는지도 모르겠습니다. 어떤 기업의 보고서 고유번호를 찾는것 까지는 상당히 직관적이지만 그 이후 필요한 데이터를 검색하는 방법은 상당히 억지스러운 절차인것 같거든요. 게다가 지금까지 이런저런 기업들의 자료를 보다보니 모든 기업들의 사업보고서가 동일한 양식을 가지고 있지도 않았습니다. 이부분은 나중에 어느정도 프로그램이 완성되면 언급할 기회가 있을 것 같습니다.

아무튼 조만간 마무리를 해서 제가 시도한 결과물을 공유할수 있으면 좋겠습니다. 그리고 가능하다면 전문가분들의 조언도 들을 수 있는 기회가 있기를 기대해 보며 DART OPEN API 활용법 계속 파보려합니다. 

 

끝!
반응형

댓글