학습 일기 - OpenDartReader 이용해서 재무정보 받기

DART 데이터 받아오기

DART는 금융감독원 전자공시 시스템이다.

2020년 1월부터 “Open DART”라는 서비스 API를 제공하고 있다.

이 서비스를 좀 더 쉽게 사용하기 위해서 OpenDartReader라는 오픈소스 라이브러리를 FinanceData라는 곳에서 만들었다.

여기에서는 FinanceDataReader라는 주가 데이터를 받는 오픈소스 라이브러리도 제공한다.

주소는 https://github.com/FinanceData (혹은 http://financedata.kr )이다.

여기서 제공하는 라이브러리를 사용해서 상장사의 간략한 재무정보를 받은 것은 내용을 기록한다.

전체 코드는 아래와 같다.

import pandas as pd
import OpenDartReader as odr
import time

api_key = '' # API KEY는 DART 사이트에 가서 등록하고 받아야 한다. 

dart = odr(api_key)

analysis_company_list = pd.read_csv('kospi_kosdaq_list_20210116.csv')

def save_fin_data(code, year):
    print(code, year)
    fin_data = dart.finstate(code, year)
    if fin_data is None :
       print('NoneType') 
    else:
       fin_data.to_csv(code+'_'+str(year)+'.csv')

for i in analysis_company_list['단축코드']:
    code = str(i).zfill(6)  
    save_fin_data(code, 2019)

재무데이터를 받을 종목 리스트 만들기

먼저 FinanceDataReader를 통해서 KOSPI와 KOSDAQ의 전체 종목 데이터를 받았다.

몇 가지 자료 정리를 좀 했어야 했다.

KOSPI와 KOSDAQ 각각을 받으려고 했는데, 에러가 자꾸 발생을 해서, KRX 종목리스트 전체를 받았다.

KRX에는 KOSPI와 KOSDAQ, KONEX가 포함되어 있는데, KONEX는 관심이 없어 제외를 해야 했다.

전체 리스트에는 우선주도 포함이 되어 있어서 우선주의 코드를 OpenDartReader에 입력하면 에러가 발생했다.

그래서, 우선주 데이터 제거했다.

FinanceDataReader는 pandas의 DataFrame을 반환한다.

여기서 columns로 확인을 하면 “시장구분” 항목에서 KOSPI, KOSDAQ, KONEX가 있다.

그리고, “주식종류” 항목에서 우선주와 보통주가 있다.

이는 아래의 코드를 이용해서 삭제를 했다.

구글 검색을 하니 아래의 방법으로 삭제하는 것을 찾아서 정리를 했다.

isnotKONEX = df['시장구분'] != 'KONEX'

df_company_list = df[isnotKONEX]

재무데이터 받기

dart = odr(api_key)

OpenDartReader에서 api_key를 넣고 객체를 생성한다.

analysis_company_list = pd.read_csv('kospi_kosdaq_list_20210116.csv')

이전에 상장사의 코드 목록을 csv 파일로 저장한 것을 pandas의 DataFrame으로 읽어 온다.

def save_fin_data(code, year):
    print(code, year)
    fin_data = dart.finstate(code, year)
    if fin_data is None :
       print('NoneType') 
    else:
       fin_data.to_csv(code+'_'+str(year)+'.csv')

dart 객체에서 재무정보를 불러오는 메서드인 finstate를 이용해서 재무정보를 읽어오고, 이는 pandas의 DataFrame이므로 to_csv 메서드를 이용해서 파일로 저정한다.

finstate 메서드에 대한 내용은 OpenDartReader 관련 웹사이트를 방문하여 확인하면 된다.

이 OpenDartReader의 finstate 메서드를 사용하는 중에 에러가 발생하는 업체들이 있다.

에러가 발생하면 Nonetype을 반환하는데, 이를 확인해서 Nonetype이면 저장을 하지 않도록 한다.

try ~ except 구문을 이용하려고 했는데, 아는 대로 해 봤는데, 안 되어서, if 문으로 처리를 했다.

for i in analysis_company_list['단축코드']:
    code = str(i).zfill(6)  
    save_fin_data(code, 2019)

정리한 데이터의 상장사를 for 구문을 통해서 처리한다.

상장사 데이터 처리한 후에 저장한 후에 보니, 6자리의 문자열이 정수형으로 변환되어 저장되었다.

그러면서, 앞에 있는 0들이 날아가서 코드를 string으로 변환하고, 앞에 누락된 0을 채우도록 zfill 메서드를 사용했다.

Written on January 17, 2021