-
국내 상장 시중 은행 18년 ~ 20년 배당 내역 분석 With Python, Open Dart APIData Analysis/Investment 2021. 5. 18. 10:37
오늘 포스팅에서는 국내 시중 은행 종목들의 지난 3년 간 배당 내역을 전자공시 사이트 Dart API를 통해서 가져오고, Plotly를 활용해 시각화하도록 하겠다.
배당 데이터 추출 코드 프로세스는 다음과 같다.
1. 네이버 기준 은행 업종 종목들의 증시 코드를 가져온다
2. 해당 코드를 Dart 기준 코드로 변환한다.
3. Dart 코드를 가지고 은행별 배당 내역을 가져온다.
데이터 추출 코드
import pandas as pd import requests import datetime banks=['하나금융지주','제주은행','기업은행','KB금융','우리금융지주','JB금융지주','신한지주','BNK금융지주','DGB금융지주'] def get_code(corp_name): stock_code = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download', header=0)[0] stock_code=stock_code[['회사명','종목코드']] stock_code=stock_code.rename(columns={'회사명':'company','종목코드':'code'}) stock_code['code']=stock_code.code.map('{:06d}'.format) code = stock_code[stock_code['company']==corp_name].code.values[0].strip() return code def get_basic(code,api): date='20140101' report='A' url=f'https://opendart.fss.or.kr/api/list.json?crtfc_key={api}&corp_code={code}&bgn_de={date}&pblntf_ty={report}&sort=date&page_count=100' res=requests.get(url) data=res.json() df=pd.DataFrame(data['list']) return df def get_dividend(code,api): i=2018 div_data=[] while i < datetime.datetime.today().year+1: url=f'https://opendart.fss.or.kr/api/alotMatter.json?crtfc_key={api}&corp_code={code}&bsns_year={i}&reprt_code=11011' res=requests.get(url) if 'list' in res.json(): data=res.json()['list'] div=pd.DataFrame(data) div=div[div['thstrm'] != '-'] else: break payout=float(div[div['se']=='(연결)현금배당성향(%)']['thstrm'].values[0]) div_y=float(div[div['se']=='현금배당수익률(%)']['thstrm'].values[0]) div_p=int(div[div['se']=='주당 현금배당금(원)']['thstrm'].values[0].replace(',','')) div_={'year':i,'배당성향(%)':payout,'배당수익률(%)':div_y,'주당배당금':div_p} div_data.append(div_) i+=1 div_df=pd.DataFrame(div_data) return div_df api="~~~~" final=pd.DataFrame() for u in banks: print(u) code=get_code(u) code_v2=get_basic(code,api)['corp_code'][0] div_df=get_dividend(code_v2,api) div_df['bank']=f'{u}' final=final.append(div_df)
API 키 값을 받고 위와 같은 쿼리를 돌리면 아래와 같은 은행의 연도별 배당 데이터 결과물을 문제없이 확인할 수 있을 것이다.
데이터 시각화
import plotly.graph_objects as go banks_dict={'하나금융지주':'Hana', '제주은행':'Jeju','기업은행':'IBK', 'KB금융':'KB','우리금융지주':'Woori', 'JB금융지주':'JB','신한지주':'Shinhan', 'BNK금융지주':'BNK','DGB금융지주':'DGB'} fig = go.Figure( ) for u in banks_dict: fig.add_trace(go.Bar( x=final['year'].unique(), y=final.loc[final['bank']==u]['주당배당금'].values, name=banks_dict[u] ),) # Change the bar mode fig.update_layout(barmode='group',title_text='Dividend Per Share') fig.show()
fig = go.Figure() for u in banks_dict: fig.add_trace(go.Bar( x=final['year'].unique(), y=final.loc[final['bank']==u]['배당성향(%)'].values, name=banks_dict[u] )) # Change the bar mode fig.update_layout(barmode='group',title='Payout Ratio') fig.show()
fig = go.Figure( ) for u in banks_dict: fig.add_trace(go.Bar( x=final['year'].unique(), y=final.loc[final['bank']==u]['배당수익률(%)'].values, name=banks_dict[u] )) # Change the bar mode fig.update_layout(barmode='group',title='Dividend Yield') fig.show() cc=fig.to_json()
'Data Analysis > Investment' 카테고리의 다른 글
지난 5년간 국내 주요 시중은행 오프라인 지점 수 현황 분석 with Python, Plotly (0) 2021.06.02 구글트렌드 & 네이버 데이터랩으로 지난 1년간 국내 메이저 카드사 검색량 트렌드 분석 (0) 2021.06.02 치폴레(Chipotle/CMG) 미국 주가 분석 With FinancialModelingPrep & Python (0) 2021.04.15 MAGA(Microsoft, APPLE, GOOGLE, AMAZON) 기업 주식 비교 분석 With Python (0) 2021.04.10 네이버 쇼핑 내 등록된 홍삼/종합비타민/유산균 제품 브랜드 알아보자 (0) 2021.04.08