파이썬을 이용하여 10년치 재무제표 가져오기 - 4. 코드 개선하기
본문 바로가기
파이썬으로 만든 것들/10년치 재무제표 가져오기

파이썬을 이용하여 10년치 재무제표 가져오기 - 4. 코드 개선하기

by Squat Lee 2021. 5. 16.

지난번 포스트까지 DART(전자공시)에서 10년치 제무재표 데이터를 가져오는 파이썬 코드를 작성했습니다.

2021.05.15 - [파이썬/Python Project] - 파이썬을 이용하여 10년치 재무제표 가져오기 - 3. 손익계산서, 현금흐름표 가져오기

 

파이썬을 이용하여 10년치 재무제표 가져오기 - 3. 손익계산서, 현금흐름표 가져오기

지난 포스트에 이어서 손익계산서와 현금흐름까지 10년치 데이터를 가져와 보도록 하겠습니다. 2021.05.14 - [파이썬/Python Project] - 파이썬을 이용하여 10년치 재무제표 가져오기 - 2. 재무상태표 가

dotsnlines.tistory.com

 
그런데, 문제가 생겼습니다. 
DART에서 받은 데이터가 회사별로 양식이 다 다르네요...
삼성전자로 코드를 작성했는데, 다른 회사를 가져오니 에러가 발생했습니다.
그래서 코드를 좀 개선 했습니다.
연도별 데이터를 가져올 함수를 만들었고

재무상태표, 손익계산서, 현금흐름표를 가져올 수 있는 함수도 만들었습니다.

 

함수를 만드니 반복잡업이 줄어서 코드가 훤씬 간결해졌습니다.
재무비율인 ROA와 ROE도 추가해 보았습니다.
항목이 코드로 구분이 되어 있어서 보기가 어렵네요.
이 부분을 보기 쉽게 한글로 된 항목 칼럼을 추가해 보도록 하겠습니다.

각 항목 코드(Cocept Code)를 가져올때 옆의 칼럼에 있는 한글 항목도 함께 가져와서 item_list에 저장했습니다.

이걸 그대로 total_df에 추가하니 새로 추가된 ROE와 ROA 때문에 행개수가 맞지않아 에러가 발생하네요.

그래서 total_df의 행 개수와 item_list의 항목개수 차이많큼 item_list에 '0'을 임의로 넣었습니다.

결과가 제대로 나왔네요.

몇몇 데이터를 가지고 test 해 봤는데, 잘 나옵니다. (그래도 혹시나 데이터가 안나오는 기업이 있을수도 있겠다는 생각이 드네요)

 

전체 코드는 아래와 같습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from openpyxl import load_workbook
import pandas as pd
 
# Company that you find
file = 'fs_samsung.xlsx'
 
wb = load_workbook(file)
item_list = []
 
# Data를 가져올 함수 설정
def get_data(r, ws, list):
    c = 2
    while ws.cell(2, c).value != None:
        y = ws.cell(1, c).value
        if y != None and y[:1== '2':
            for i in range(10):
                list.append(ws.cell(r, c + i).value)
            break
        c += 1
 
# 제무상태표, 손익계산서, 현금흐름을 가져올 수 있는 함수설정
def get_fs_data(ws, fs_items, df_list):
    for fs_item in fs_items:
        temp_list = []
        r = 4
        while ws.cell(r,2).value != None:
            if ws.cell(r,2).value == fs_item:
                key = ws.cell(r, 2).value
                item = ws.cell(r, 3).value
                item_list.append(item)
                get_data(r, ws, temp_list)
            r += 1
        df = pd.DataFrame(temp_list,columns=[key], index=y_list)
        df_list.append(df)
 
 
# 재무상태표를 통해 년도를 List로 만들기
y_list = []
get_data(1, wb['Data_bs'], y_list)
 
# 각 데이터가 담긴 Dataframe 리스트를 담을 변수 지정
df_list = []
 
# 재무상태표 Data 가져오기
bs_items = ['ifrs-full_Assets''ifrs-full_CurrentAssets''ifrs-full_CashAndCashEquivalents',
            'dart_ShortTermTradeReceivable''ifrs-full_Inventories','ifrs-full_PropertyPlantAndEquipment',
            'ifrs-full_Equity''ifrs-full_Liabilities''ifrs-full_CurrentAssets']
get_fs_data(wb['Data_bs'], bs_items, df_list)
 
# 손익계산서 Data 가져오기
is_items = ['ifrs-full_Revenue''ifrs-full_ProfitLoss']
get_fs_data(wb['Data_is'], is_items, df_list)
 
# 현금흐름 Data 가져오기
cf_items = ['ifrs-full_CashFlowsFromUsedInOperatingActivities']
get_fs_data(wb['Data_cf'], cf_items, df_list)
 
 
# 각 데이터프레임 합치기
total_df = pd.concat(df_list, axis=1)
 
 
# 합쳐진 데이터 프레임 행/열 바꾸기
total_df = total_df.transpose()
 
total_df.loc['ROA'= total_df.loc['ifrs-full_ProfitLoss']/total_df.loc['ifrs-full_Assets']
total_df.loc['ROE'= total_df.loc['ifrs-full_ProfitLoss']/total_df.loc['ifrs-full_Equity']
 
#컬럼과 항목 List의 길이차이
dif_len = len(total_df.iloc[:,[1]]) - len(item_list)
 
for dif in range(dif_len):
    item_list.append(0)
 
total_df['항목'= item_list
col1 = total_df.columns[0:len(total_df.columns)-1].to_list()
col2 = total_df.columns[-1:].to_list()
total_df = total_df[col2 + col1]
 
print(total_df)
total_df.to_excel('재무상태표.xlsx')
cs

코드파일을 아래와 같이 공유하오니 필요하신 분들은 다운로드 받으시기 바랍니다.

f_data.py
0.01MB

※ 저는 프로그램을 전공하거나 따로 배우지 않았습니다. 또한 IT분야에서 근무하고 있지도 않습니다. 개인적인 취미로 파이썬을 배우고 있으며, 지극히 개인적인 기록을 위한 수단으로 포스트를 하였습니다. 혹시나 제가 기록한 포스트대로 코딩을 하시다가 실행이 제대로 되지 않더라도 제가 답변할 능력이나 시간이 되지 않으니 참고하시기 바랍니다.

 

 

CAGR(연복리 수익률) 30%를 목표로 하는 파이썬 퀀트투자법이 궁금하시다면 아래 포스트를 클릭해 보시기 바랍니다.

2021.11.21 - [집구석 강의/파이썬 퀀트투자 쉽게하기] - 파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글

 

파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글

퀀트투자는 참으로 매력적인 투자방법입니다. 일정한 기준으로 종목을 선별해서 일정한 기간 후에 기계적으로 매도하고, 다시 같은 방법으로 매수합니다. 이런 작업을 계속해서 반복하다 보면

dotsnlines.tistory.com

 

728x90
반응형

댓글