Lala's tower

파이썬으로 재무제표 분석하기 2

파이썬으로 재무제표 분석하기 2

2024-05-25 00:18:07

금융감독원 API로 데이터를 수집할 수 있지만 각 회사마다 계정과목명이 통일되지 않아, 재무제표 분석하기 위해서는 가공을 해줘야 합니다. opendartreader로 대차대조표, 손익계산서, 현금흐름표를 보기 좋게 정리하는 코드를 작성하겠습니다.

OpenDartReader를 이용하여 재무제표 분석하기, 계정의 금액 구하는 파이썬 클래스

종목명, 년도를 입력하면 OpenDartReader를 이용하여 데이터를 수집하고 입력받은 계정의 금액 합계를 구하는 코드입니다. 이 기능을 쉽게 사용할 수 있도록 class형태로 만들었습니다. 완성된 코드는 아닙니다. 글을 올리면서 완성해 나가도록 하겠습니다. (네이버 금융에서도 제무재표 조회 가능합니다.)

! pip install OpenDartReader
import OpenDartReader
import pandas as pd

# 재무제표 분석을 위해 opendartreader 데이터를 가공하는 클래스
class OpenDartReaderEx:
    def __init__(self, api_key):
        self.api_key = api_key
        self.dart = OpenDartReader(api_key)

    def get_financial_statements(self, company_name, year, report_types=['11013', '11012', '11014', '11011']):
        dfList = []
        for report_type in report_types:
            dfList.append(self.dart.finstate_all(company_name, year, reprt_code=report_type, fs_div='CFS'))

        df = pd.concat(dfList, ignore_index=True)
        return df

    def get_filter(self, df, account_name):
        sj_nm_conditions = {
            '유동자산': ['재무상태표'],
            '부채총계': ['재무상태표'],
            '자본총계': ['재무상태표'],
            '매출액': ['손익계산서', '포괄손익계산서'],
            '매출총이익': ['손익계산서', '포괄손익계산서'],
            '영업이익': ['손익계산서', '포괄손익계산서'],
            '당기순이익': ['손익계산서', '포괄손익계산서', '현금흐름표'],
            '영업활동현금흐름': ['현금흐름표'],
            '투자활동현금흐름': ['현금흐름표'],
            '자산총계': ['재무상태표'],
            '매출원가': ['손익계산서', '포괄손익계산서'],
            '순이익': ['손익계산서', '포괄손익계산서'],
            '지출비용': ['손익계산서', '포괄손익계산서'],
            '재료비': ['손익계산서', '포괄손익계산서'],
            '유형자산증가': ['현금흐름표']
        }

        account_nm_conditions = {
            '유동자산': ['유동자산', 'II. 유동자산', 'Ⅰ.유동자산', '유동자산 합계', 'I.유동자산', 'I. 유동자산', 'l. 유동자산'],
            '부채총계': ['부채총계', '부  채  총  계', '부채 총계'],
            '자본총계': ['자본총계', '반기말자본', '3분기말자본', '분기말자본', '1분기말자본', '자  본  총  계', '기말',
                     '자본 총계', '기말자본 잔액', '분기말', '반기말', '자 본 총 계', '분기말 잔액', '반기말 잔액'],
            '매출액': ['매출액', '수익(매출액)', '매출', '영업수익', '수익', '영업수익(매출액)', 'Ⅰ.매출', 'I.매출액',
                    'Ⅰ.매출액', 'I. 매출액', '매출액(영업수익)'],
            '매출총이익': ['매출총이익', '매출 총이익', '매출총이익(손실)', 'Ⅲ.매출총이익', 'III.매출총이익',
                      'Ⅲ.매출총이익', 'III. 매출총이익(손실)', 'III. 매출총이익', '매출총이익(영업수익)', 'II.재료비'],
            '영업이익': ['영업이익(손실)', '영업이익', '영업손실(이익)', '영업손익', '계속영업이익(손실)', 'Ⅳ.영업이익',
                     'VI.영업이익(손실)', 'V.영업이익', 'V. 영업이익(손실)', 'IV. 영업이익', '영업이익 (손실)', '영업손실'],
            '당기순이익': ['당기순이익(손실)', '당기순이익', '분기순이익', '분기순이익(손실)', '반기순이익', '반기순이익(손실)',
                      '연결분기순이익', '연결반기순이익', '연결당기순이익', '연결분기(당기)순이익', '연결반기(당기)순이익',
                      '연결분기순이익(손실)', '당기순손익', 'Ⅶ.당기순이익', 'VIII.당기순이익(손실)', 'XIII. 당기순이익(손실)',
                      '반기연결순이익(손실)', '연결당기순이익(손실)', '당기의 순이익', '분기기순이익(손실)', '분기순손익',
                      '분기순손실', '반기순손익', '분기연결순손실', '분기연결순이익(손실)'],
            '영업활동현금흐름': ['영업활동으로 인한 현금흐름', '영업활동 현금흐름', '영업활동현금흐름', '영업활동으로인한 현금흐름',
                         '영업활동으로인한순현금흐름', 'Ⅰ. 영업활동으로 인한 현금흐름', 'I.영업활동현금흐름', '영업활동으로인한현금흐름',
                         '영업활동으로 인한 순현금흐름', '영업활동으로인한 순현금흐름', '1.영업활동현금흐름', 'Ⅰ.영업활동현금흐름',
                         '영업활동으로 인한 현금 흐름', 'I. 영업활동현금흐름', 'I. 영업활동으로 인한 현금흐름', 'I.영업활동으로 인한 현금흐름',
                         '영업활동순현금흐름 합계', 'Ⅰ. 영업활동현금흐름', '영업으로부터 창출된 현금흐름', 'Ⅰ. 영업활동으로 인한 순현금흐름'],
            '투자활동현금흐름': ['투자활동으로 인한 현금흐름', '투자활동 현금흐름', '투자활동현금흐름', '투자활동으로인한 현금흐름',
                         '투자활동으로인한순현금흐름', 'Ⅱ. 투자활동으로 인한 현금흐름', 'II.투자활동현금흐름', '투자활동으로인한현금흐름',
                         '투자활동으로 인한 순현금흐름', '투자활동으로인한 순현금흐름', '2.투자활동현금흐름', 'Ⅱ.투자활동현금흐름',
                         'Ⅱ. 투자활동현금흐름', 'II. 투자활동으로 인한 현금흐름', 'II.투자활동으로 인한 현금흐름', 'II. 투자활동현금흐름',
                         '투자활동순현금흐름 합계', '투자활동으로부터의 순현금유입(유출)', 'Ⅱ. 투자활동으로 인한 순현금흐름'],
            '자산총계': ['자산총계', '자  산  총  계', '자산 총계', '자본과부채총계'],
            '매출원가': ['매출원가'],
            '순이익': ['법인세비용차감전순이익(손실)'],
            '지출비용': ['법인세비용(혜택)'],
            '재료비': ['II.재료비'],
            '유형자산증가': ['유형자산의 증가', '유형자산의증가', ' 유형자산의 취득', ' 유형자산의취득', '유형자산의취득', '유형자산의 취득']
        }

        if account_name not in sj_nm_conditions or account_name not in account_nm_conditions:
            raise ValueError(f"Unsupported account name: {account_name}")

        return (df.sj_nm.isin(sj_nm_conditions[account_name])) & (
            df.account_nm.isin(account_nm_conditions[account_name]))

    def get_sum(self, df, account_name):
        filter = self.get_filter(df, account_name)
        dffiltered = df[filter]
        dffiltered.loc[dffiltered.index, 'thstrm_amount'] = pd.to_numeric(dffiltered['thstrm_amount'],
                                                                          errors='coerce').astype(
            'Int64')

        return dffiltered['thstrm_amount'].sum()

OpenDartReaderEx 클래스를 이용하여 재무제표 분석. 유동자산 합계금액을 구하는 예제

위 클래스를 이용하면 아래와 같이 간편하게 원하는 값을 얻어낼 수 있습니다.

api_key = '금융감독원 홈페이지에서 발급받은 api key를 붙여넣으세요.'
odr = OpenDartReaderEx(api_key)
df = odr.get_financial_statements("삼성전자", 2023)
sum = odr.get_sum(df, "유동자산")
print(f"삼성전자 2023년도 유동자산 합계 : {sum:,}")

재무제표 분석하기 실행결과 화면

파이썬으로 재무제표 분석하기 1
금융감독원 단일회사 재무제표 조회
파이썬으로 팩터투자 (퀀트 투자)
오늘자 골든크로스/데드크로스 종목 추출 파이썬 코드
퀀트를 위한 파이썬 이동 평균선
퀀트를 위한 파이썬FinanceDataReader