개요
네이버 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 공격처럼 보여 사용제한이 걸릴 수 있으니 주의해야 한다.
'개발 노트 > Etc.' 카테고리의 다른 글
[CI/CD] Github Actions 로 SSH 사용하여 CD 하기 (0) | 2022.07.26 |
---|---|
[Node] Express, helmet 라이브러리 ALLOW-FROM ALL (0) | 2022.02.07 |
[Python] Django 실행 시 sqlite3 버전 이슈 (2) | 2021.06.22 |
[API] 네이버 Finance 주식 시세 가져오기 (2) | 2021.06.05 |
[Macbook] lrzsz 설치 (0) | 2021.06.05 |