2 minute read

코스피, 코스닥에 상장된 기업들의 기업개황 테이블 만들기

OpenDartReader 라이브러리를 활용한 재무제표 분석

OpenDartReader/github

project_finance

전체코드 finstate.py/github

  • stock_infos: 코스피, 코스닥에 상장된 기업들의
    기업개황 테이블

    columns = [stock_code, stock_name, corp_code]
    (리스트의 각 원소 자료형: string)

    key = stock_code

code


import requests
import zipfile
import io
import os
import json
import pandas as pd
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta

try:
    from pandas import json_normalize
except ImportError:
    from pandas.io.json import json_normalize
import OpenDartReader
api_key = "ef3149d745caee09f48df5004b905ec4ef3f5d7e"
dart = OpenDartReader(api_key)
def corp_codes(api_key):
        url = 'https://opendart.fss.or.kr/api/corpCode.xml'
        params = { 'crtfc_key': api_key, }

        r = requests.get(url, params=params)
        try:
            tree = ET.XML(r.content)
            status = tree.find('status').text
            message = tree.find('message').text
            if status != '000':
                raise ValueError({'status': status, 'message': message})
        except ET.ParseError as e:
            pass

        zf = zipfile.ZipFile(io.BytesIO(r.content))
        xml_data = zf.read('CORPCODE.xml')

        # XML to DataFrame
        tree = ET.XML(xml_data)
        all_records = []

        element = tree.findall('list')
        for i, child in enumerate(element):
            record = {}
            for i, subchild in enumerate(child):
                record[subchild.tag] = subchild.text
            all_records.append(record)
        return pd.DataFrame(all_records)
corps = corp_codes(api_key)
# dart에서 제공하는 회사들의 기업개황 table
corps
corp_code corp_name stock_code modify_date
0 00434003 다코 20170630
1 00434456 일산약품 20170630
2 00430964 굿앤엘에스 20170630
3 00432403 한라판지 20170630
4 00388953 크레디피아제이십오차유동화전문회사 20170630
... ... ... ... ...
87912 01560457 삼원개발 20210506
87913 01556533 에이더블유파트너스 20210506
87914 01546299 동영와이케이 20210506
87915 00694605 미디어윌 20210506
87916 01368761 엔브이에이치원방테크 20210506

87917 rows × 4 columns

# corps에서 stock_code가 존재하는 회사만 stock_codes table에 할당
stock_codes = pd.DataFrame()
i = 0
for s in corps["stock_code"]:
    if len(s) == 6:
        stock_codes = stock_codes.append(corps.loc[i], ignore_index=True)
    i += 1
# 종목코드가 존재하는 회사들의 기업개황 table
stock_codes
corp_code corp_name modify_date stock_code
0 00260985 한빛네트 20170630 036720
1 00264529 엔플렉스 20170630 040130
2 00358545 동서정보기술 20170630 055000
3 00231567 애드모바일 20170630 032600
4 00247939 씨모스 20170630 037600
... ... ... ... ...
3349 00925295 에프엔씨엔터 20210901 173940
3350 00521390 뉴파워프라즈마 20210602 144960
3351 00838500 엘브이엠씨 20210611 900140
3352 00160232 KSS해운 20210628 044450
3353 01412822 솔루스첨단소재 20210824 336370

3354 rows × 4 columns

# stock_codes에서 코스피, 코스닥 시장에 상장된 회사들만 stock_infos table에 할당
columns_infos = ["stock_code", "stock_name", "corp_code"]
stock_infos = pd.DataFrame(columns=columns_infos)
i = 0
for s in stock_codes["corp_name"]:
    market = dart.company(s)["corp_cls"]
    if market == "Y":
        stock_code = stock_codes.loc[i, "stock_code"] + ".KS"
        stock_name = stock_codes.loc[i, "corp_name"]
        corp_code = stock_codes.loc[i, "corp_code"] + ".KS"
        infos = pd.DataFrame([(stock_code, stock_name, corp_code)], columns=columns_infos)
        stock_infos = stock_infos.append(infos, ignore_index=True)
    elif market == "K":
        stock_code = stock_codes.loc[i, "stock_code"] + ".KQ"
        stock_name = stock_codes.loc[i, "corp_name"]
        corp_code = stock_codes.loc[i, "corp_code"] + ".KQ"
        infos = pd.DataFrame([(stock_code, stock_name, corp_code)], columns=columns_infos)
        stock_infos = stock_infos.append(infos, ignore_index=True)  
    i += 1
# 코스피, 코스닥 시장에 상장된 회사들의 기업개황 table
stock_infos
stock_code stock_name corp_code
0 950130.KQ 엑세스바이오 00956028.KQ
1 152550.KS 한국ANKOR유전 00907013.KS
2 900070.KQ 글로벌에스엠 00783246.KQ
3 900120.KQ 씨케이에이치 00800084.KQ
4 096300.KS 베트남개발1 00626710.KS
... ... ... ...
2015 173940.KQ 에프엔씨엔터 00925295.KQ
2016 144960.KQ 뉴파워프라즈마 00521390.KQ
2017 900140.KS 엘브이엠씨 00838500.KS
2018 044450.KS KSS해운 00160232.KS
2019 336370.KS 솔루스첨단소재 01412822.KS

2020 rows × 3 columns

stock_infos 테이블은 앞으로 많은 테이블의 부모 테이블이 될 예정이다.