전자공시 Dart API의 주요사항보고서 개발가이드 > 공시정보 > 공시검색 데이터에서 자기주식취득 공시정보를 가져와
주요사항보고서 주요정보 > 자기주식취득 데이터와 병합해서 취득예정 주식수를 확인하고 주가를 확인합니다.
본인의 인증키(API Key)가 필요하니 필요하신분은 아래를 참고 부탁드립니다.
1. 가입 및 인증키 확인(Skip 가능)
2. 자기주식취득 공시 데이터 가져오기
3. 자기주식취득 상세 데이터 가져오기
4. 취득예정 주식수 및 주가 확인
1. 가입 및 인증키 확인(Skip 가능)
[전자공시 Dart API] 가입 및 인증키(API Key) 확인하기
1. 사이트 가입 2. 인증키(API Key) 확인하기 1. 사이트 가입 사이트에 접속합니다. https://opendart.fss.or.kr/ 시스템 점검으로 모든 서비스 이용이 일시적으로 중단되어니 양해 부탁드립니다. 시스템 점
yenpa.tistory.com
2. 자기주식취득 공시 데이터 가져오기
본인의 crtfc_key가 필요합니다.
검색 기간은 한번에 최대 3개월 지원하는데 자기주식 취득 공시이후 주가를 보기위해
'2022-01-01 ~ 2022-03-31'의 데이터를 가져오겠습니다.
결과에서 '주요사항보고서(자기주식취득)' 부분만 따로 저장하겠습니다.
import requests
import pandas as pd
from IPython.display import display
crtfc_key='YOUR_APIKEY'
page_no=1
page_count=100
bgn_de='20220101'
end_de='20220331'
pblntf_detail_ty='B001'
results_all=pd.DataFrame()
while(True):
url = 'https://opendart.fss.or.kr/api/list.json'
params = {
'crtfc_key': crtfc_key,
'page_no' : str(page_no),
'page_count' : str(page_count),
'bgn_de' : bgn_de,
'end_de' : end_de,
'pblntf_detail_ty' : pblntf_detail_ty,
}
#결과를 json형태로 저장
results = requests.get(url, params=params).json()
#결과중 실제 공시정보가 있는부분만 DataFrame으로 저장
results_df = pd.DataFrame(results['list'])
#하나의 DataFrame으로 만듬
results_all = pd.concat([results_all,results_df])
total_page=results['total_page']
# total_page와 page_no이 같으면 while문 종료
if page_no==total_page:
break
page_no=page_no+1
#주요사항 보고서(자기주식취득결정), 법인 Y(코스피), K(코스닥)
keyword='주요사항보고서(자기주식취득결정)'
df = results_all.loc[(results_all['report_nm']==keyword) &
((results_all['corp_cls']=='K') | (results_all['corp_cls']=='Y'))]
#rcept_no를 index로
df=df.set_index('rcept_no')
print(df.shape)
display(df)
입력 요청인자 설정부분입니다.
bgn_de(시작날짜), end_de(종료날짜) 인데 corp_code를 입력안하면 3개월까지 검색이 됩니다.
pblntf_detail_ty(공시유형)에서 B001(주요사항보고서)만 설정했습니다.
page_no=1
page_count=100
bgn_de='20220101'
end_de='20220331'
pblntf_detail_ty='B001'
결과를 확인해보겠습니다. 해당기간 자기주식취득 공시가 43개가 검색이 됩니다.
3. 자기주식취득 상세 데이터 가져오기
2번에서 구한 자기주식취득의 공시리스트에 대한 상세 정보를 확인하겠습니다.
아래가 해당 코드가 되겠습니다.
# 회사별 자기주식 취득결정 상세확인
detail = pd.DataFrame()
exec_check = [] #회사별 중복실행 방지
for i, r in df.iterrows():
#주요사항보고서 자기주식 취득결정 상세 요청인자
#corp_code이외에는 위에서 사용한 parameter를 그대로 사용.
crtfc_key=crtfc_key
corp_code=r['corp_code']
bgn_de=bgn_de
end_de=end_de
if corp_code in exec_check:
continue
exec_check.append(corp_code)
url = 'https://opendart.fss.or.kr/api/tsstkAqDecsn.json'
params = {
'crtfc_key': crtfc_key,
'corp_code' : corp_code,
'bgn_de' : bgn_de,
'end_de' : end_de,
}
#결과를 json형태로 저장
results = requests.get(url, params=params).json()
#결과중 실제 공시정보가 있는부분만 DataFrame으로 저장
results_df_detail = pd.DataFrame(results['list'])
#하나의 DataFrame으로 만듬
detail = pd.concat([detail,results_df_detail])
# 필요한 column만 따로 저장
detail=detail[['rcept_no','aqpln_stk_ostk','aqpln_stk_estk',
'aqpln_prc_ostk','aqpln_prc_estk','aqexpd_bgd','aqexpd_edd',
'hdexpd_bgd','hdexpd_edd','aq_wtn_div_ostk','aq_wtn_div_estk',
'eaq_ostk','eaq_estk']]
#report no를 index로
detail=detail.set_index('rcept_no')
detail이라는 DataFrame에 자기주식취득 상세의 전체 결과를 저장합니다.
detail = pd.DataFrame()
자기주식취득 상세는 요청인자를 corp_code를 받게 되는데 회사별 1번만 실행하고 싶은데
3개월내 한개의 회사에서 여러건의 자기주식취득(정정포함) 공시가 있는 경우가 있어
중복 실행 방지를 위해 실행한 회사를 저장하기 위한 exec_check 리스트를 만들었습니다.
exec_check = [] #회사별 중복실행 방지
for i, r in df.iterrows():
if corp_code in exec_check:
continue
exec_check.append(corp_code)
자기주식취득 상세를 가져오는 부분이고 결과를 detail에 저장했습니다.
url = 'https://opendart.fss.or.kr/api/tsstkAqDecsn.json'
params = {
'crtfc_key': crtfc_key,
'corp_code' : corp_code,
'bgn_de' : bgn_de,
'end_de' : end_de,
}
#결과를 json형태로 저장
results = requests.get(url, params=params).json()
#결과중 실제 공시정보가 있는부분만 DataFrame으로 저장
results_df_detail = pd.DataFrame(results['list'])
#하나의 DataFrame으로 만듬
detail = pd.concat([detail,results_df_detail])
필요한 column만 따로 저장하고 공시 접수일자를 index로 만듭니다.
# 필요한 column만 따로 저장
detail=detail[['rcept_no','aqpln_stk_ostk','aqpln_stk_estk',
'aqpln_prc_ostk','aqpln_prc_estk','aqexpd_bgd','aqexpd_edd',
'hdexpd_bgd','hdexpd_edd','aq_wtn_div_ostk','aq_wtn_div_estk',
'eaq_ostk','eaq_estk']]
#report no를 index로
detail=detail.set_index('rcept_no')
4. 취득예정 주식수 및 주가 확인
두개의 데이터를 병합해서 df_all이라는 DataFrame에 저장합니다.
#inner join으로 두개 병합
df_all = pd.concat([df,detail], axis=1, join='inner')
cols=['aqpln_stk_ostk','aqpln_stk_estk',
'aqpln_prc_ostk','aqpln_prc_estk','aq_wtn_div_ostk','aq_wtn_div_estk','eaq_ostk','eaq_estk']
#object -> int로 변환하기 위한 전처리 및 변환
for col in cols:
df_all[col] = df_all[col].str.replace(',','').replace('-','0').replace('','0')
df_all[cols]=df_all[cols].astype('int64')
df_all['rcept_date'] = pd.to_datetime(df_all['rcept_dt'], format='%Y%m%d')
df_all['aqexpd_bgd'] = pd.to_datetime(df_all['aqexpd_bgd'], format='%Y년 %m월 %d일')
df_all['aqexpd_edd'] = pd.to_datetime(df_all['aqexpd_edd'], format='%Y년 %m월 %d일')
그럼 취득 예정주식수 및 취득시작일자의 정보를 가져오고
해당 회사의 주가 정보와 함께 그래프로 표시하겠습니다.
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
plt.rc('font', family='NanumGothic')
cols=['corp_name','stock_code','rcept_dt','rcept_date','aqpln_stk_ostk','aqpln_stk_estk',
'aqpln_prc_ostk','aqpln_prc_estk', 'aqexpd_bgd']
for i, r in df_all[cols].iterrows():
corp_name = r['corp_name']
stock_code = r['stock_code']
rcept_date = r['rcept_date'] #공시 접수일자
aqpln_stk_ostk = r['aqpln_stk_ostk'] #취득예정주식(주)보통주식
aqpln_stk_estk = r['aqpln_stk_estk'] #취득예정주식(주)(기타주식)
aqpln_prc_ostk = r['aqpln_prc_ostk'] #취득예정금액(원)(보통주식)
aqpln_prc_estk = r['aqpln_prc_estk'] #취득예정금액(원)(기타주식)
aqexpd_bgd = r['aqexpd_bgd'] #취득예상기간(시작일)
print('corp_name : ' + corp_name)
print('접수일자 : ' + rcept_date.strftime('%Y-%m-%d'))
print('취득예정주식(주)보통주식 : ' + str(aqpln_stk_ostk))
print('취득예정주식(주)(기타주식) : ' + str(aqpln_stk_estk))
print('취득예정금액(원)(보통주식) : ' + str(aqpln_prc_ostk))
print('취득예정금액(원)(기타주식) : ' + str(aqpln_prc_estk))
print('취득예상기간(시작일) : ' + aqexpd_bgd.strftime('%Y-%m-%d'))
#주가정보
code=stock_code
startdate='2022-01-01'
enddate='2022-09-30'
df_stock=fdr.DataReader(code,startdate,enddate)[['Close']]
plt.figure(figsize=(6,2))
plt.plot(df_stock.index, df_stock['Close'])
plt.title(corp_name)
plt.xticks(rotation=90)
plt.axvline(x = rcept_date, color = 'red') #공시 접수일자
if aqexpd_bgd in df_stock.index:
plt.axvline(x = aqexpd_bgd, color = 'green') #취득예상기간(시작일)
plt.show()
공시 상세 정보를 변수에 저장하고 출력했습니다.
corp_name = r['corp_name']
stock_code = r['stock_code']
rcept_date = r['rcept_date'] #공시 접수일자
aqpln_stk_ostk = r['aqpln_stk_ostk'] #취득예정주식(주)보통주식
aqpln_stk_estk = r['aqpln_stk_estk'] #취득예정주식(주)(기타주식)
aqpln_prc_ostk = r['aqpln_prc_ostk'] #취득예정금액(원)(보통주식)
aqpln_prc_estk = r['aqpln_prc_estk'] #취득예정금액(원)(기타주식)
aqexpd_bgd = r['aqexpd_bgd'] #취득예상기간(시작일)
print('corp_name : ' + corp_name)
print('접수일자 : ' + rcept_date.strftime('%Y-%m-%d'))
print('취득예정주식(주)보통주식 : ' + str(aqpln_stk_ostk))
print('취득예정주식(주)(기타주식) : ' + str(aqpln_stk_estk))
print('취득예정금액(원)(보통주식) : ' + str(aqpln_prc_ostk))
print('취득예정금액(원)(기타주식) : ' + str(aqpln_prc_estk))
print('취득예상기간(시작일) : ' + aqexpd_bgd.strftime('%Y-%m-%d'))
financedatareader를 이용해서 회사별 2022-01-01 ~ 2022-09-30의 주가를 가져왔습니다.
#주가정보
code=stock_code
startdate='2022-01-01'
enddate='2022-09-30'
df_stock=fdr.DataReader(code,startdate,enddate)[['Close']]
설치 및 사용법은 아래 정보를 참고하셔도 좋습니다.
[FinanceDataReader] 설치 및 주식 주가 정보 가져오기(코스피, 코스닥)
국내 주식 정보를 가져와 보겠습니다. 1. FinanceDataReader 설치 2. 종목 정보 가져오기 3. 주가 정보 가져오기 1. FinanceDataReader 설치 명령프롬프트에서 아래의 명령어로 설치 가능합니다. anaconda의 경
yenpa.tistory.com
마지막으로 결과를 확인해보겠습니다.
일부회사의 정보만 살펴보겠습니다.
위쪽에 자기주식취득 상세정보가 표시되고, 아래쪽에 그래프가 표시되는데
빨간선은 공시접수일자이고 녹색선은 취득예상기간(시작일)이 되겠습니다.
취득예정주식은 보통주식으로 650000이고 취득예상기간(시작일)은 2022-03-10인것이 확인됩니다.
키움증권의 결과입니다. 취득예정주식은 보통주식 500000만주 이고
공시접수일자는 2022-01-28일 취득예상기간(시작일)은 2022-02-03으로 5일정도 차이가 있는것을 알수 있습니다.
자기주식취득의 일부정보만 표시한것이고 다른 정보도 많으니 활용하시면 될것 같습니다.
이상으로 자기주식취득 공시 회사의 취득주식수 및 주가를 확인해봤습니다.
'API' 카테고리의 다른 글
[공공데이터포털 API] 데이터 가져오기 기초 (6) | 2022.10.26 |
---|---|
[공공데이터포털 API] 가입하기 및 인증키(APPKey) 발급, 확인 (4) | 2022.10.25 |
[전자공시 Dart API] 유상증자 신주 비율 확인 및 유상증자 목적별 분류 (4) | 2022.10.22 |
[전자공시 Dart API] 배당률 높은 회사 리스트 가져오기 (16) | 2022.10.21 |
[전자공시 Dart API] 무상증자 결정 공시 낸 회사의 주가 정보 확인 (4) | 2022.10.20 |