파이썬으로 DART OpenAPI 사용하기

2020-10-09 • quantdart, openapi • 3 min read

이번 포스트에서는 금융감독원에서 운영하는 전자공시시스템(DART)의 OpenAPI를 사용하는 방법을 다룹니다. DART OpenAPI를 통해 기업의 재무제표 등 주식 투자에 도움이 되는 다양한 정보를 얻을 수 있습니다.

우선 DART 사이트 http://dart.fss.or.kr/에 접속합니다. 그리고 상단의 작은 메뉴에서 오픈API 메뉴를 찾아서 클릭합니다.

DART 메뉴

인증키 신청/관리 메뉴로 가서 인증키 신청을 진행하고 로그인 하면 됩니다. 인증키를 신청할 때 사용자를 개인과 기관으로 구분하는데 기관으로 신청 시 입력할 사항들이 늘어나는 반면 공시목록 및 기업개황 조회를 한도제한 없이 사용할 수 있다고 합니다.

인증키 신청/관리

개발가이드를 보면 DART OpenAPI로 조회할 수 있는 데이터 종류들을 살펴볼 수 있습니다. 다음은 DART에서 제공하는 API들의 개발가이드 링크입니다.

여기서는 간단히 예로 DART OpenAPI 사용법을 알아보겠습니다.

DART API는 HTTP GET Method로 데이터 요청을 보냅니다. API마다 지원하는 출력 포멧(Zip 파일, JSON, XML)이 다릅니다. 대부분 JSON과 XML을 지원하고 요청 URL 마지막이 .json, .xml으로 출력포멧에 따라 다릅니다. 여기서는 JSON 포멧 요청 우선적으로 사용하겠습니다.

고유번호 API 사용 방법

먼저 고유번호 API로 공시대상회사의 8자리 고유번호를 획득해 보겠습니다.

고유번호 API는 출력포멧이 Zip 파일입니다. 파이썬으로 다음과 같이 데이터를 확인할 수 있습니다.

여기서는 requests로 HTTP 요청을 수행합니다. API 파라미터로 입력해야 하는 crtfc_key는 위에서 발급했던 인증키를 입력하면 됩니다. 데이터가 binary 형태이기 때문에 ByteIO로 읽어주고 Zip 파일로 생성합니다.

import requests
from io import BytesIO
import zipfile
import xmltodict

api = 'https://opendart.fss.or.kr/api/corpCode.xml'
res = requests.get(api, params={'crtfc_key': crtfc_key})
data_xml = zipfile.ZipFile(BytesIO(res.content))

이렇게 하면 공시대상 기업의 고유번호 데이터를 Zip 압축 포멧으로 받을 수 있습니다. Zip 파일에 담겨있는 파일은 리스트는 다음과 같이 확인할 수 있습니다.

z.namelist()
output: ['CORPCODE.xml']

여기서는 편의상 다음과 같이 XML 파일을 dict로 변환했습니다.

import xmltodict
import json

data_xml = z.read('CORPCODE.xml').decode('utf-8')
data_odict = xmltodict.parse(data_xml)
data_dict = json.loads(json.dumps(data_odict))
data = data_dict.get('result', {}).get('list')

이를 위해 xmltodict 라이브러리를 사용했습니다. xmltodict로 XML을 파싱하고 나면 OrderedDict 형식의 결과를 얻을 수 있습니다. 이를 편의상 dict 형식으로 변환하기 위해 JSON dumps/loads 과정을 거쳤습니다.

data를 확인해 보면 공시대상 기업들의 고유번호와 주식 종목코드를 확인할 수 있습니다.

for item in data:
    if item['corp_name'] in ["삼성전자", "SK하이닉스", "NAVER"]:
        print(item)
output:
{'corp_code': '00126380', 'corp_name': '삼성전자', 'stock_code': '005930', 'modify_date': '20191209'}
{'corp_code': '00266961', 'corp_name': 'NAVER', 'stock_code': '035420', 'modify_date': '20200512'}
{'corp_code': '00164779', 'corp_name': 'SK하이닉스', 'stock_code': '000660', 'modify_date': '20200512'}

DART API는 대부분 공시대학회사의 고유번호를 요청 파라미터로 입력해줘야 하므로 이 데이터를 잘 관리하고 있는 것이 좋습니다.

기업개황 API 사용 방법

기업개황 API는 대표자명, 사업자등록번호 등의 기업의 기본 정보를 제공합니다. JSON 포멧 요청 URL은 https://opendart.fss.or.kr/api/company.json이고 다음 두 파라미터를 입력해야 합니다.

  • crtfc_key: 발급받은 인증키
  • corp_code: 공시대상회사 고유번호

crtfc_key에 발급받은 인증키를 입력하고 corp_code에 삼성전자의 기업번호인 00126380를 입력하면 다음과 같은 결과를 얻을 수 있습니다.

res = requests.get('https://opendart.fss.or.kr/api/company.json?crtfc_key=2ff3dd09bbe0e8140dc1941c86ed08b77597b5e5&corp_code=00126380')
item = json.loads(res.text)
print(item)
output:
{'status': '000',
 'message': '정상',
 'corp_code': '00126380',
 'corp_name': '삼성전자(주)',
 'corp_name_eng': 'SAMSUNG ELECTRONICS CO,.LTD',
 'stock_name': '삼성전자',
 'stock_code': '005930',
 'ceo_nm': '김기남, 김현석, 고동진',
 'corp_cls': 'Y',
 'jurir_no': '1301110006246',
 'bizr_no': '1248100998',
 'adres': '경기도 수원시 영통구  삼성로 129 (매탄동)',
 'hm_url': 'www.sec.co.kr',
 'ir_url': '',
 'phn_no': '031-200-1114',
 'fax_no': '031-200-7538',
 'induty_code': '264',
 'est_dt': '19690113',
 'acc_mt': '12'}

그 외의 API들도 이와 비슷한 방법으로 사용할 수 있으므로 이렇게 마무리하겠습니다. 질문이 있으시면 메일 등으로 문의주시면 됩니다.

추천 라이브러리 및 도구

  • dart-fss 라이브러리를 사용하면 DART에서 쉽게 재무제표를 추출할 수 있습니다.
  • Insomnia는 간편하게 HTTP API를 사용해 볼 수 있는 클라이언트 입니다.