#04. DART API

꾸꾸·2022년 10월 18일
2

1. DART API 인증키 발급받기

DART API를 사용하기 위해서는 OPEN DART 홈페이지에 들어가 인증키 신청을 해야 한다.

홈페이지에 들어가 상단 바의 인증키 신청/관리를 클릭한다.

인증키 신청 화면에서 신청 등록을 완료하면 인증키 신청 결과가 곧바로 메일로 발송된다. 개인회원의 경우 계정신청 완료 후 즉시 오픈API 이용현황 탭에서 API KEY를 확인하여 API 호출에 사용할 수 있다.

2. Google Colab 사용하기

API 호출은 Google Colaboratory(Colab)에서 진행할 것이다. Colab을 사용하면 브라우저 내에서 Python Script를 작성하고 실행할 수 있다. 따로 환경 구성이 필요하지 않고, 스크립트를 간편하게 공유할 수 있다는 장점이 있다. Colab을 사용하려면 Google 계정이 있어야한다. 우선 Colab 홈페이지에 접속한다.

  • Google Colaboratory : https://colab.research.google.com/

    Google 로그인이 되어야 편집 및 공유가 가능하다. 상단의 로그인 버튼을 누르면 Google 로그인 창이 뜨고(이것도 API이다), 로그인 인증을 완료하면 새 노트를 만들 수 있다. 상단 바의 파일 - 새노트를 클릭 해 신규 스크립트를 생성한다.

    아래와 같이 Untitled라는 스크립트가 만들어졌다. 앞으로의 API 호출은 Colab에서 진행할 것이다. 유용하게 쓰이는 아래 8가지 단축키를 외워두면 좋다.

  • Ctrl + Enter : 초점이 맞춰진 셀 실행

  • Shift + Enter : 셀을 실행하고 다음 셀 선택

  • Ctrl + B : 코드 셀 추가

  • Ctrl + M,D : 셀/선택항목 삭제

  • Ctrl + M,K : 선택된 셀을 위로 이동

  • Ctrl + M,J : 선택된 셀을 아래로 이동

  • Ctrl + M,M : 텍스트 셀로 변환

  • Ctrl + M,Y : 코드 셀로 변환

API KEY 발급 및 실행 환경 구성이 완료되었으니 본격적으로 API 호출 코드를 작성해보자.

3. 필요 패키지 설치 및 모듈 임포트

dart-fss라는 라이브러리를 이용하여 보다 편리하게 API 호출을 해볼 것이다.

dart-fss는 대한민국 금융감독원에서 운영하는 다트(DART) 사이트 크롤링 및 재무제표 추출을 위한 라이브러리이다. 해당 라이브러리에 대한 자세한 내용은 아래 링크에서 확인할 수 있다.

우선 아래 코드를 실행해 dart-fss 라이브러리를 설치해주자.

!pip install dart-fss

설치가 완료되면 dart_fss 와 pandas 라이브러리를 임포트 해준다. pandas는 데이터 조작 및 분석을 위한 라이브러리로, 이미 Colab에 설치되어 있어 별도로 설치해주지 않아도 사용할 수 있다.

import dart_fss
import pandas as pd

다음으로 OPEN DART 홈페이지에서 발급받은 인증키를 dart_fss의 set_api_key 모듈을 사용하여 세팅해준다.

api_key = "※여기에 OPENDART에서 발급받은 인증키를 입력하세요※"
dart_fss.set_api_key(api_key=api_key)

이제 dart_fss 라이브러리를 사용할 준비가 완료되었다.

4. dart_fss 사용해보기(기업 기본정보)

DART에 등록된 기업 목록을 불러오는 모듈은 get_corp_list이다. 해당 모듈을 이용하여 기업 목록을 출력해보자.

corp_list = dart_fss.get_corp_list()
corp_list.corps

코드를 실행해보면 아래와 같이 DART에 등록된 기업 목록들이 [기업코드]기업명 형태로 출력되는 것을 확인할 수 있다.

다만 위 모듈로는 전체 기업의 종목코드가 노출되지 않는다.(사실 종목코드 정보도 담겨있는데, 이 부분은 아래에서 서술하겠다.) 따라서 get_corp_code를 사용하여 종목코드도 구해볼 것이다. 아래 코드를 실행하여 전체 기업의 종목코드를 가져와보자.

all_corps = dart_fss.api.filings.get_corp_code()
all_corps[:2]

코드를 실행해보면 아래와 같이 리스트 안에 딕셔너리 형태로 기업코드, 기업명, 종목코드, 수정일자 데이터를 받아온 것을 확인할 수 있다.

받아온 데이터를 보기 좋게 시각화하고, 편리하게 가공할 수 있도록 pandas 라이브러리의 데이터프레임으로 바꾸어준다.

df = pd.DataFrame(all_corps)
print("전체기업의 수 :",len(df))
df.head(3)

코드를 실행해보면 아래와 같이 기업 정보가 기업코드(corp_code), 기업명(corp_name), 종목코드(stock_code), 수정일자(modify_date) 행이 존재하는 테이블로 변환된 것을 확인해볼 수 있다. 종목코드(stock_code)가 None 값인 경우, 비상장 기업이다.

비상장 기업을 제외하고 상장 기업들로만 데이터 테이블을 만들기 위해서 pandas 라이브러리의 notnull 모듈을 이용하자.

df_listed = df[df['stock_code'].notnull()].reset_index(drop=True)
print("상장기업의 수 :",len(df_listed))
df_listed.head(3)

코드를 실행해보면, 전체 기업 중 상장 기업의 수는 3486개이며, 해당 기업들만 남긴 테이블을 생성하였기에 종목코드(stock_code)가 전부 채워져있음을 확인할 수 있다.

get_corp_list로 받아온 corp_list(기업목록)에는 종목코드를 비롯해 섹터와 주요 상품 정보도 담겨있다. find_by_corp_name 모듈을 사용하여 기업코드 혹은 기업명으로 검색해서 특정 기업의 상세 기업정보(섹터, 상품)를 가져올 수 있다

samsung = corp_list.find_by_corp_name('삼성전자', exactly=True)[0]
samsung

코드를 실행해보면 아래와 같이 특정 기업의 섹터와 주요 상품이 테이블 형태로 출력된다.

5. dart_fss 사용하기(기업 재무보고서)

이제부터는 기업의 재무보고서를 가져와볼 것이다.
재무보고서를 불러오는 모듈은 fnltt_singl_acnt_all으로, 해당 모듈은 기업코드(corp_code), 사업연도(bsns_year), 보고서분기(reprt_code), 연결재무제표여부(fs_div), API인증키(api_key)를 인자값으로 받는다.

재무보고서를 불러오는 데에는 종목코드(stock_code)가 아닌 기업코드(corp_code)를 사용하는 점에 유의하자. 따라서 저장해놓았던 상장 기업정보 데이터프레임(df_listed)에서 내가 원하는 기업의 기업코드를 찾을 것이다.

삼성전자 재무보고서를 불러오기 위해, 삼성전자의 기업코드를 확인해보면 '00126380'이다.

corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
corp_code

삼성전자 2022년 1분기 연결재무제표를 불러오기 위한 나머지 인자값을 정의해준다. API인증키(api_key)는 이미 정의되었기에 None 값을 넣어도 된다.

bsns_year = '2022' # (1) 사업연도(4자리) ※ 2015년 이후 부터 정보제공
reprt_code ='11013' # (2) 1분기보고서 : 11013 반기보고서 : 110123 분기보고서 : 11014 사업보고서 : 11011
fs_div = 'CFS' # (3) CFS:연결재무제표, OFS:재무제표
corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0] # (4) 기업코드

인자값 정의가 완료되면 모듈을 사용해 재무보고서를 받아와 data에 저장하고, 데이터프레임으로 변환해준다. 데이터프레임은 pandas 라이브러리의 to_excel 모듈을 사용하여 excel 파일로도 저장해줄 수 있다.

data = dart_fss.api.finance.fnltt_singl_acnt_all(corp_code, bsns_year, reprt_code, fs_div, api_key=None)['list']
df = pd.DataFrame(data)
df.to_excel('삼성전자 2022년 1분기 연결재무제표.xlsx')
df.head()

6. get_report 함수 만들기 (재무보고서 데이터프레임 DF)

위 모듈 fnltt_singl_acnt_all을 활용하여 특정 기업의 원하는 연도 및 분기의 재무 보고서를 불러오는 함수 get_report 함수를 만들어 사용해보자.

def get_report(corp_df, corp_name, bsns_year, num, fs_div):
    # (1) corp_code : 기업코드
    corp_code = corp_df[corp_df['corp_name'] == corp_name].iloc[0,0]

    # (2) bsns_year : 사업연도(4자리)
    bsns_year = str(bsns_year) 
    
    # (3) reprt_code : 1분기보고서 : 11013 반기보고서 : 110123 분기보고서 : 11014 사업보고서 : 11011
    if num == '4':
        reprt_code ='11011'
    elif num == '3':
        reprt_code ='11014'
    elif num == '2': 
        reprt_code ='11012'
    else: # num == 1 or else
        reprt_code ='11013'

    data = dart_fss.api.finance.fnltt_singl_acnt_all(corp_code, bsns_year, reprt_code, fs_div, api_key=None)['list']
    df = pd.DataFrame(data)
    df.to_excel('{} {}년 {}분기 재무보고서.xlsx'.format(corp_name,bsns_year, num))
    
    return df

get_report 함수를 사용하여 삼성전자 2022년 1분기 연결재무제표를 불러와보았다.

DF = get_report(df_listed, '삼성전자','2022','1','CFS')
DF.head(3)


정상적으로 데이터프레임이 저장되었으며, Colab 파일 탭에서도 엑셀파일로 다운로드된 것을 확인할 수 있다. 엑셀파일명을 더블클릭하면 로컬에 파일을 저장할 수도 있다.

15개의 열을 가진 데이터프레임의 출력값을 4번째까지 확인해볼 수 있다. 그런데, 칼럼명이 영문 약자로 되어 있어 직관적으로 파악하기 어렵기에, 칼럼명을 한글로 바꿔줄 것이다. 아래 코드는 DART 홈페이지 오픈API 설명 가이드를 참고하여 칼럼명을 한글로 변경해주는 코드이다.

dic = {'rcept_no':'접수번호','reprt_code':'보고서 코드','bsns_year':'사업 연도','corp_code':'고유번호','sj_div':'재무제표구분','sj_nm':'재무제표명','account_id':'계정ID','account_nm':'계정명','account_detail':'계정상세','thstrm_nm':'당기명','thstrm_amount':'당기금액','thstrm_add_amount':'당기누적금액','frmtrm_nm':'전기명','frmtrm_amount':'전기금액','frmtrm_q_nm':'전기명(분/반기)','frmtrm_q_amount':'전기금액(분/반기)','frmtrm_add_amount':'전기누적금액','bfefrmtrm_nm':'전전기명','bfefrmtrm_amount':'전전기금액','ord':'계정과목 정렬순서','currency':'통화 단위'}
DF.columns = pd.Series(DF.columns).replace(dic)
DF.head(4).T

7. split_report 함수 만들기 (각 재무보고서 데이터프레임 BS, IS, CF, CIS, SCE)

다만 위 해당 재무보고서 파일에는 5가지 종류의 재무보고서가 합쳐져 있다. 이것들은 재무상태표, 손익계산서, 현금흐름표, 포괄손익계산서, 자본변동표으로 sj_div, sj_nm으로 구분되어 있다. sj_div를 구분자로 DF를 나눠서 각각의 데이터 테이블 BS, IS, CF, CIS, SCE로 저장해준다.

BS = DF[DF['재무제표구분']=='BS'] # 재무상태표
IS = DF[DF['재무제표구분']=='IS'] # 손익계산서
CF = DF[DF['재무제표구분']=='CF'] # 현금흐름표
CIS = DF[DF['재무제표구분']=='CIS'] # 포괄손익계산서
SCE = DF[DF['재무제표구분']=='SCE'] # 자본변동표

데이터 테이블이 나뉘면서 값이 존재하지 않는 열들이 생성된다. dropna 모듈로 열을 기준(axis=1)으로 빈 열을 제거해준다.
더불어 index 값도 초기화가 필요하다. reset_index 모듈로 인덱스를 초기화해준다. 이 때, 초기화된 인덱스가 새로운 행으로 생성되지 않게 drop=True 조건을 추가해준다.

BS = BS.dropna(axis=1).reset_index(drop=True)
IS = IS.dropna(axis=1).reset_index(drop=True)
CF = CF.dropna(axis=1).reset_index(drop=True)
CIS = CIS.dropna(axis=1).reset_index(drop=True)
SCE = SCE.dropna(axis=1).reset_index(drop=True)

마지막으로 정제된 보고서의 행, 열 길이를 확인해주면, 정제 과정에서 각각 달라진 것을 확인할 수 있다.

BS.shape, IS.shape, CF.shape, CIS.shape, SCE.shape

위 내용을 바탕으로 재무보고서를 각 보고서별로 분리해주는 함수 split_report를 작성할 수 있다.

def split_report(corp_name, bsns_year, num, df):
    BS =  df[df['재무제표구분']=='BS'].dropna(axis=1).reset_index(drop=True) # 재무상태표
    IS = df[df['재무제표구분']=='IS'].dropna(axis=1).reset_index(drop=True) # 손익계산서
    CF = df[df['재무제표구분']=='CF'].dropna(axis=1).reset_index(drop=True) # 현금흐름표
    CIS = df[df['재무제표구분']=='CIS'].dropna(axis=1).reset_index(drop=True) # 포괄손익계산서
    SCE = df[df['재무제표구분']=='SCE'].dropna(axis=1).reset_index(drop=True) # 자본변동표
    print(BS.shape, IS.shape, CF.shape, CIS.shape, SCE.shape)
    
    BS.to_excel('{} {}년 {}분기 재무상태표.xlsx'.format(corp_name,bsns_year, num))
    IS.to_excel('{} {}년 {}분기 손익계산서.xlsx'.format(corp_name,bsns_year, num))
    CF.to_excel('{} {}년 {}분기 현금흐름표.xlsx'.format(corp_name,bsns_year, num))
    CIS.to_excel('{} {}년 {}분기 포괄손익계산서.xlsx'.format(corp_name,bsns_year, num))
    SCE.to_excel('{} {}년 {}분기 자본변동표.xlsx'.format(corp_name,bsns_year, num))
    
    return BS, IS, CF, CIS, SCE

위 함수를 사용해서 삼성전자 2022년 1분기 재무보고서를 종류별로 데이터프레임 및 엑셀 파일 생성해보자.

BS, IS, CF, CIS, SCE = split_report('삼성전자', '2022', '1', DF)

해당 코드 실행 시, 각 데이터프레임의 shape이 아래와 같이 출력된다.

이제 차례대로 BS(재무상태표), IS(손익계산서), CF(현금흐름표), CIS(포괄손익계산서), SCE(자동변동표) 데이터프레임이 정상적으로 생성되었는지 확인해보자.

아래 그림은 BS(재무상태표) 데이터프레임을 행열 전환하여 출력해본 결과와 DART 홈페이지의 재무보고서를 비교해본 결과이다.

1. Balance Sheet(재무상태표)

BS.head(3).T

2. Income Statement(손익계산서)

IS.head(3).T

3. Cash flow Statement(현금흐름표)

CF.head(3).T

4. Comprehensive Income Statement(포괄손익계산서)

CIS.head(3).T

5. Statement of Changes in Equity(자본변동표)

SCE.head(3).T

(여기부터 쓰기)

BS.head(4).T


그림22: BS(재무상태표) 확인


그림23: Colab 목록에서 다운로드된 재무보고서 종류별로 엑셀 파일 확인 가능

DART OPEN API로 다운로드한 엑셀 파일들과 DART 홈페이지의 보고서들 비교




그림24,25,26 : 재무상태표



그림27,28,29 : 손익계산서


그림30,31,32 : 포괄손익계산서



그림33,34,35 : 자본변동표


그림36,37,38 : 현금흐름표

6. 삼성전자 재무상태표 분석하기

(위 코드로 불러온 최근 삼전 재무상태표 불러와서 분석)
(지표들로 PER 등을 만들어서 확인해보기)

7. 특정 지표를 가져오는 함수 만들기

(함수 구현)

profile
안녕하세요. 꾸꾸입니다.

0개의 댓글

관련 채용 정보