안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
오늘은 지난 글에 이어서 DART-FSS 패키지로 원하는 회사 혹은 모든 회사의 재무제표를 엑셀 파일로 저장하는 것을 해보겠습니다.
향후 저장받은 데이터를 Pandas 모듈로 가공해서 유의미한 투자 정보를 얻고, 실제 투자에도 적용해 볼 계획입니다.
<DART-FSS 관련 지난 글>
1. 공시된 기업 정보 불러오기
아래의 코드를 이용하면 DART에 공시된 모든 회사의 [회사 코드] + 회사 이름을 리스트 형태로 받을 수 있습니다.
# DART에 공시된 모든 회사 리스트 불러오기
corp_list = dart.get_corp_list()
참고로 corp_list를 DART API로부터 받아오는데에 시간이 걸리는데 측정해보니 11.72초 정도로 나오네요.
주로 사용하는 IDE인 VS Code를 사용하니깐 매번 코드를 실행할 때마다 리스트를 불러와서 시간이 아까우므로, 다음부터 Jupyter Notebook을 이용한다면 매번 12초씩 아낄 수 있겠습니다.
corp_list의 요소가 어떤 데이터 형태를 가지고 있는지, 요소는 몇 개나 있는지 확인해보았습니다. 리스트의 길이를 측정하는 len( ) 함수를 이용해 확인해보니 상장된 기업수가 8만 7천개가 넘네요!
# 리스트의 첫번째 종목정보 출력
print(corp_list[0])
>>> [00434003]다코
# 리스트 종목 갯수 출력
print(len(corp_list))
>>> 87098
# corp_list 자료형 확인
print(type(corp_list))
>>> <class 'dart_fss.corp.corp_list.CorpList'>
혹시 종목 87098개가 궁금하신분들은 for문을 이용해서 터미널창에 모두 출력해보세요. 저는 처음으로 터미널 창 스크롤 범위가 오버돼서 이전 정보가 안보이는 것을 경험할 수 있었답니다!
# 모든 회사 [코드]회사명 출력
for i in corp_list:
print(i,end="")
2. corp_list 활용 메소드
사실 우리가 위에서 얻게된 corp_list는 클래스이며, 따로 메소드를 가지고 있습니다. 즉, corp_list.함수의 형태로 몇 가지 함수를 사용할 수 있습니다.
역시 말보다는 코드죠. 가장 자주 사용할 함수 2가지를 예시로 가져와봤습니다.
# 삼성전자 회사명으로 검색
samsung = corp_list.find_by_corp_name('삼성전자', exactly=True)[0]
# 삼성전자 회사 코드로 검색
samsung = corp_list.find_by_corp_code('00126380')[0]
참고로 exactly 옵션을 설정하지 않으면 기본적으로 False로 설정되어 있습니다. 여기서 특별히 True로 설정해주었는데, 그 이유는 False일 때는 '삼성전자'가 들어간 '삼성전자서비스씨에스'를 출력해주기 때문입니다.
또한 corp_list.find_by_corp_name( ) 함수의 결과 데이터는 [[종목 코드]종목 이름]의 형태로 리스트 [ ]로 한겹 쌓여져있습니다. 이를 벗겨내기 위해서 corp_list.find_by_corp_name( )[0]으로 코딩한 점 유의해 주세요.
<관련 메소드>
메소드 | 기능 |
find_by_corp_code(self, corp_code) | DART에서 사용하는 회사 코드를 이용한 찾기 |
find_by_corp_name(self, corp_name[, …]) | 회사 명칭을 이용한 검색 |
find_by_product(self, product[, market]) | 취급 상품으로 검색(코스피, 코스닥, 코넥스만 지원) |
find_by_sector(self, sector[, market]) | 산업 섹터로 검색(코스피, 코스닥, 코넥스만 지원) |
find_by_stock_code(self, stock_code[, …]) | 주식 종목 코드를 이용한 찾기 |
load(self[, profile]) | 회사 정보가 없을시 회사 정보 로딩 |
<여기서 잠깐! corp_code와 stock_code의 차이점>
corp_code는 dart에서 사용하는 코드를 말하며 stock_code는 아래와 같이 검색포털에서 주식정보를 검색하면 나오는 코드입니다.
위에서 다루었던 삼성전자의 corp_code (00126380)와 다른 것을 확인 할 수 있습니다.
3. 회사 정보로 재무제표 다운받기
위에서 samsung이란 변수에 회사 정보([종목 코드]종목 이름)을 저장했습니다. 이 samsung이란 변수도 사실 클래스의 인스턴스(객체)로서 메소드를 사용할 수 있습니다.
주로 사용할 만한 메소드는 아래의 5개 중 extract_fs와 search_fillings이며, 이번 시간에는 목표로 했던 재무제표를 정보를 가져오는 extract_fs( ) 메소드를 사용해 보겠습니다.
메소드 | 기능 |
extract_fs(bgn_de[, end_de, fs_tp, …]) | 재무제표 검색 |
load(self) | 종목 정보 로딩 |
search_filings([bgn_de, end_de, …]) | 공시보고서 검색 |
to_dict() | 종목에 관한 모든 정보를 Dictionary 형태로 반환 |
update(info) | Update information |
코드는 아래와 같이 간단합니다. 다만 실행하시면 자료를 가져오는데에 시간이 꽤 걸릴거예요.
# 2020년부터 연간 연결재무제표 불러오기
fs = samsung.extract_fs(bgn_de='20200101')
# 재무제표 검색 결과를 엑셀파일로 저장 (기본저장위치: 실행폴더/fsdata)
fs.save()
<여기서 잠깐! extract_fs 메소드의 인자(옵션)>
꼭 입력이 필요한 검색시작 일자(bgn_de)를 제외하고는 모두 기본값이 들어가 있습니다.
옵션 | 기능 | 기본 값 | 자료형 |
bgn_de | 검색시작 접수일자('YYYYMMDD') | 필수 입력 | str |
end_de | 검색종료 접수일자('YYYYMMDD') | 오늘 날짜 | str |
fs_tp | 재무제표 종류 선택 (‘bs’: 재무상태표, ‘is’ : 손익계산서, ‘cis’ : 포괄손익계산서, ‘cf’ : 현금흐름표) |
('bs', 'is', 'cis', 'cf) | tuple, str |
separate | 개별재무제표 여부 (True : 개별 재무제표 / False : 연결 재무제표) | False | str |
report_tp | 연간, 반기, 분기 보고서 선택 (‘annual’ : 연간, ‘half’ : 반기, ‘quarter’ : 분기) |
None | str |
lang | 언어 선택 ('ko' : 한글, 'en' : 영어) | 'ko' | str |
separator | 숫자 1000 단위 구분자 표시 여부 (True / False) | True | str |
dataset | 'xbrl' : xbrl 파일 우선 데이터 추출 'web' : web page 우선 데이터 추출 |
'xbrl' | str |
코드 실행 결과 아래와 같은 이름의 엑셀 파일이 저장됩니다. 참고로 excel 파일이 있는 fsdata 폴더는 현재 작업 디렉토리에 존재합니다.
엑셀 파일을 열어보면 아래와 같이 데이터들이 있습니다. 데이터들이 의미하는 바는 추후 정리하는 시간을 갖겠습니다.
참고로 위에서 설정했던 (bgn_de='20200101')은 아래의 그림에서 시작 기간을 의미합니다.
아래는 dart에서 검색한 연결 재무상태표입니다.
<참고자료>
DART-FSS 공식문서
https://dart-fss.readthedocs.io/en/latest/dart_corp.html