1. Dart OpenAPI 키 발급받기
OpenAPI란 데이터를 가져다 쓸 수 있게 서버의 '창구'를 열어둔 것이다.
Dart Open API를 활용하면 공시 정보를 데이터 분석에 활용할 수 있다.
쉽게 활용할 수 있게 만든 라이브러리를 사용하면 일일이 공시 자료를 보러가지 않아도 분석을 할 수 있다.
API란 서버에 접근하는 창구와 같은 것이기 때문에, 창구를 활용해서 정해진 약속으로 정해진 데이터만 접근할 수 있다.
누구에게나 열어둔 창구이기 때문에 너무 많은 요청이 오는 것을 방지하기 위해 인 당 할당량을 정해서 'key'를 발급하는 것이다.
아래 페이지로 접속한 다음, 인증키 신청을 누르고 정보를 입력하면 키를 발급받을 수 있다.
https://opendart.fss.or.kr/uat/uia/egovLoginUsr.do
인증키 신청/관리 → OpenAPI 이용현황 으로 가면 발급받은 키를 볼 수 있다.
2. Dart 라이브러리 활용하기
- Dart-fss 라이브러리 설치하기
!pip install dart-fss
- 키를 넣고 구동해보기
import dart_fss as dart_fss
import pandas as pd
api_key = '여기에 API 키를 입력'
dart_fss.set_api_key(api_key=api_key)
corp_list = dart_fss.get_corp_list()
corp_list.corps
3. 종목 정리하기
Dart 공식 Document: https://dart-fss.readthedocs.io/en/latest/
- 상장, 비상장 종목 정리하기
all = dart_fss.api.filings.get_corp_code()
all[0]
df = pd.DataFrame(all)
df_listed = df[df['stock_code'].notnull()]
df_non_listed = df[df['stock_code'].isnull()]
- 엑셀로 저장하기
df_listed.to_excel('비상장사.xlsx')
df_non_listed.to_excel('상장사.xlsx')
※ Pandas에서 .to_excel('파일명.xlsx') 만 붙이면 엑셀 파일이 생성된다.
4. Dart API 사용해보기
- 한 개 종목을 정해서 코드를 찾기
corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
corp_code
- Dart API를 사용해보기(사업보고서)
// 기업 정보
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
dart_fss.api.filings.get_corp_info(corp_code)
// 배당 현황
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011')
pd.DataFrame(data['list'])
// 최대주주 현황
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011')
pd.DataFrame(data['list'])
// 직원 현황
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.emp_sttus(corp_code, '2021', '11011')
pd.DataFrame(data['list'])
- Dart API를 사용해보기(상장기업 재무정보)
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')
pd.DataFrame(data['list'])
- Dart API를 사용해보기(주주정보)
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.shareholder.elestock(corp_code)
pd.DataFrame(data['list'])
5. 상장 종목 분석하기
- 시총 Top 50 회사 연봉왕 뽑아보기
// 카카오의 corp_code 구하기
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')
df_temp = pd.DataFrame(data['list'])
df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']]
df_temp.columns = ['기업명','이름','역할','보수']
df_temp
// 함수로 만들기
def get_salary_top(name):
corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]
data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')
df_temp = pd.DataFrame(data['list'])
df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']]
df_temp.columns = ['기업명','이름','역할','보수']
df_temp['보수'] = pd.to_numeric(df_temp['보수'].str.replace(',',''))
df_temp = df_temp.sort_values(by='보수',ascending=False)
return df_temp
// 여러개 종목에 대해 뽑아보기
names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']
dfs = []
for name in names:
try:
df = get_salary_top(name)
dfs.append(df)
except:
print(f'없음 - {name}')
df_result = pd.concat(dfs)
df_result.sort_values(by='보수',ascending=False)
df_result.sort_values(by='보수',ascending=False).head(30)
- 최대 주주의 주식 변동 모아보기
// 종목 코드 가져오기
corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
corp_code
// 주요 주주 지분율 보기
data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011')
df = pd.DataFrame(data['list'])
df
// 원하는 데이터만 보기 좋게 만들기
data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011')
df = pd.DataFrame(data['list'])
df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']]
df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고']
df = df[df['관계'].notnull()]
df['기초지분율'] = pd.to_numeric(df['기초지분율'])
df['기말지분율'] = pd.to_numeric(df['기말지분율'])
df.sort_values(by='기초지분율',ascending=False).head(3)
// 함수로 만들기
def get_shareholders(corp_code):
data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])
df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']]
df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고']
df = df[df['관계'].notnull()]
df['기초지분율'] = pd.to_numeric(df['기초지분율'])
df['기말지분율'] = pd.to_numeric(df['기말지분율'])
return df.sort_values(by='기초지분율',ascending=False).head(3)
// 상장 종목 중 10개만 추려내기
df_listed.sample(10)
// 10개 종목 코드 출력하기
corp_codes = list(df_listed.sample(10)['corp_code'])
for corp_code in corp_codes:
print(corp_code)
// 10개 기업을 붙여서 보기
corp_codes = list(df_listed.sample(10)['corp_code'])
dfs = []
for corp_code in corp_codes:
try:
df = get_shareholders(corp_code)
dfs.append(df)
except:
print(f'error - {corp_code}')
df_result = pd.concat(dfs)
df_result
// 증감이 큰 순서대로 정렬하기
corp_codes = list(df_listed.sample(10)['corp_code'])
dfs = []
for corp_code in corp_codes:
try:
df = get_shareholders(corp_code)
dfs.append(df)
except:
print(f'error - {corp_code}')
df_result = pd.concat(dfs)
df_result['증감'] = df_result['기말지분율'] - df_result['기초지분율']
df_result.sort_values(by='증감',ascending=False)
'Phython' 카테고리의 다른 글
[내일배움카드 코딩] 주식 데이터를 활용한 파이썬 데이터분석 강의 후기 (0) | 2023.03.29 |
---|---|
[5주차] 파이썬 백테스팅 2 (0) | 2023.03.29 |
[4주차] 파이썬 백테스팅 1 (0) | 2023.03.23 |
[2주차] 손쉽게 다루는 해외주식 – 데이터분석기초, 해외주식 다루기 (0) | 2023.03.07 |
[1주차] 주식 데이터를 활용한 파이썬 데이터 분석 (0) | 2023.03.03 |