본문 바로가기

개발 노트/Etc.

[API] 재무제표 및 ROE 조회 API

반응형

개요

네이버 Finance 주식 시세 가져오기 포스팅에 이어 종목의 재무제표 및 PER, PBR, ROE 같은 계산된 보조지표 값들을 조회할 수 있는 API 에 대하여 정리한다. 아래에서 설명하는 방법은 네이버 Finance 와 마찬가지로 정식 API 가 아닌 웹사이트에서 보여주는 정보를 Parsing 하여 정보를 추출하는 방식이기 때문에 서버에서 데이터를 제공하는 방식이 바뀌거나 하면 언제든지 동작하지 않을 수 있다.

 

공식적으로 지원하는 Dart Open API 가 있어서 처음에는 해당 API 를 사용했었는데.... 제공하는 정보의 문자열에 오타가 있거나 내가 원하는 정제되어 있는 정보를 얻기에는 너무 Raw 데이터여서 아래 방법으로 API 를 구현하였다.

 

사이트

https://comp.fnguide.com 사이트는 종목의 당일 시세와 재무제표, 주주현황 등 종목에 대한 다양한 정보들을 제공하는 사이트로 국내에서 본 주식정보 사이트 중 단일 페이지에서 가장 많은 정보를 제공하는 사이트인 것 같다. (현재까지 알아본 바로는)

해당 사이트는 종목의 모든 정보를 표의 형태로 보여준다. 아래의 Python 코드를 보기 이전에, 웹 사이트의 표를 데이터로 간단하게 변환하기 위한 라이브러리인 pandas 설치가 필요하다.

anaconda 를 사용 중이라면 pandas 가 기본 설치되어 있지만, 리눅스에서 python 을 설치해서 사용하는 경우 아래 명령어로 설치한다.

 

pandas 설치
pip install pandas

 

Python 함수

소스코드
from urllib import parse
import pandas as pd

 def get_fnguide(code) :
     get_param = {
         'pGB':1,
         'gicode':'A%s'%(code),
         'cID':'',
         'MenuYn':'Y',
         'ReportGB':'',
         'NewMenuID':101,
         'stkGb':701,
     }
     get_param = parse.urlencode(get_param)
     url="http://comp.fnguide.com/SVO2/ASP/SVD_Main.asp?%s"%(get_param)
     tables = pd.read_html(url, header=0)
     return(tables)

get_fnguide('005930') # 삼성전자

함수를 간단하게 설명하면 comp.fnguide.com 에서 찾고자 하는 종목을 찾은 경우 URL 의 형태가 (http://comp.fnguide.com/SVO2/ASP/SVD_Main.asp?pGB=1&gicode=A005930&cID=&MenuYn=Y&ReportGB=&NewMenuID=11&stkGb=701) 이런 형태이며 물음표 뒤의 GET 방식 parameter 에서 code 값만 함수의 인자로 입력 받아 웹 페이지 데이터를 불러오는 함수이다.

 

위 코드를 수행하는 경우 해당 URL 이 보여주는 많은 정보들을 pandas 가 테이블 형태로 알아서 변환하여 저장한다.

예시를 위해 12번째 테이블 (index = 11) 만 출력해서 보면 다음과 같다.

>>> get_fnguide('005930')[11]
      IFRS(연결)    Annual  Annual.1  Annual.2  Annual.3  Annual.4    Annual.5    Annual.6    Annual.7
0     IFRS(연결)   2016/12   2017/12   2018/12   2019/12   2020/12  2021/12(E)  2022/12(E)  2023/12(E)
1          매출액   2018667   2395754   2437714   2304009   2368070     2677586     2917687     3128172
2         영업이익    292407    536450    588867    277685    359939      499088      602923      662874
3   영업이익(발표기준)    292407    536450    588867    277685    359939         NaN         NaN         NaN
4        당기순이익    227261    421867    443449    217389    264078      376685      456744      509363
5      지배주주순이익    224157    413446    438909    215051    260908      374378      452838      505479
6     비지배주주순이익      3104      8422      4540      2338      3170         NaN         NaN         NaN
7         자산총계   2621743   3017521   3393572   3525645   3782357     4055047     4445015     4906242
8         부채총계    692113    872607    916041    896841   1022877     1107396     1169197     1231589
9         자본총계   1929630   2144914   2477532   2628804   2759480     2938692     3251231     3674652
10      지배주주지분   1864243   2072134   2400690   2549155   2676703     2860011     3177789     3563288
11     비지배주주지분     65387     72780     76842     79649     82777       78681       73442      111364
12         자본금      8975      8975      8975      8975      8975        8978        8978        8978
13        부채비율     35.87     40.68     36.97     34.12     37.07       37.68       35.96       33.52
14         유보율  21757.56  23681.42  26648.22  28302.40  29723.53         NaN         NaN         NaN
15       영업이익률     14.49     22.39     24.16     12.05     15.20       18.64       20.66       21.19
16    지배주주순이익률     11.10     17.26     18.00      9.33     11.02       13.98       15.52       16.16
17         ROA      9.01     14.96     13.83      6.28      7.23        9.61       10.75       10.89
18         ROE     12.48     21.01     19.63      8.69      9.99       13.52       15.00       15.00
19      EPS(원)      2735      5421      6024      3166      3841        5512        6667        7442
20      BPS(원)     24340     28971     35342     37528     39406       42104       46783       52458
21      DPS(원)       570       850      1416      1416      2994        1692        1804        1837
22         PER     13.18      9.40      6.42     17.63     21.09       14.73       12.18       10.91
23         PBR      1.48      1.76      1.10      1.49      2.06        1.93        1.74        1.55
24       발행주식수   7033967   6454925   5969783   5969783   5969783         NaN         NaN         NaN
25       배당수익률      1.58      1.67      3.66      2.54      3.70         NaN         NaN         NaN

pandas 에서 parsing 하여 저장한 12번째 테이블은 연간 Financial Highlight 정보이며 이 테이블에 ROE, PER, 발행 주식 수, 지배주주 지분 등 왠만한 정보들은 모두 포함되어 있다. 

 

위 get_fnguide 함수가 반환하는 list 의 element 데이터 타입은 pandas.DataFrame 으로 테이블 정보를 다루기 편하게 되어 있는 object 이다. 아래 몇가지 샘플 코드로 데이터를 추출할 수 있다.

>>> a = get_fnguide('005930')[11]
>>> a.columns
Index(['IFRS(연결)', 'Annual', 'Annual.1', 'Annual.2', 'Annual.3', 'Annual.4',
       'Annual.5', 'Annual.6', 'Annual.7'],
      dtype='object')
>>> a['Annual.1']
0      2017/12
1      2395754
2       536450
3       536450
4       421867
.....
>>> a.iloc[18]
IFRS(연결)      ROE
Annual      12.48
Annual.1    21.01
Annual.2    19.63
Annual.3     8.69
Annual.4     9.99
Annual.5    13.52
Annual.6    15.00
Annual.7    15.00
Name: 18, dtype: object

 

위에서 설명한 내용들을 토대로 종목 코드를 입력 시 ROE 를 출력해주는 함수를 구현해 본다.

def get_roe(code) :
    annual = get_fnguide(code)[11] # annual financial highlight table
    return annual.iloc[18][1:6].tolist() # 최근 5개년 확정 ROE

>>> get_roe('005930') # 삼성전자
['12.48', '21.01', '19.63', '8.69', '9.99']

함수를 간략하게 설명하면 Dataframe 의 iloc 함수는 입력받은 index 번째 row 를 얻게 해주며 [1:6] 은 최근 5개년의 확정된 ROE 들을 얻기 위함이다. 여기에 tolist() 함수를 써서 Dataframe 의 object 가 아닌 str list 형태로 함수의 값을 반환해 준다.

 

앞서 설명한 방법들을 활용하면 예시를 든 연간 데이터 뿐만 아닌 분기 데이터나 운용사별 보유 현황 등의 다른 정보들도 추출해 낼 수 있다.

 

마치며

이 포스팅에서는 pandas 라이브러리를 사용하여 웹사이트에서 제공하는 표 정보를 추출하는 방식을 설명하였다. 이 방법으로 꼭 fnguide 뿐만 아니라 네이버 Finance 나 krx 등 다른 주식 정보 제공 사이트에서도 필요한 정보를 추출할 수 있다.

하지만 이 방식 또한 서비스사에서 정식으로 제공하는 API 형태가 아니기 때문에 프로그램을 통한 빈번한 호출 등은 DoS 공격처럼 보여 사용제한이 걸릴 수 있으니 주의해야 한다.

 

 

 

반응형