전자공시 Dart API의 주요사항보고서 개발가이드 > 공시정보 > 공시검색 데이터에서 유상증자 결정 공시정보를 가져와
주요사항보고서 주요정보 > 유상증자 결정 데이터와 병합해서 유상증자의 규모를 확인하고
자금조달 목적별 분류를 해보겠습니다.
본인의 인증키(API Key)가 필요하니 필요하신분은 아래를 참고 부탁드립니다.
1. 가입 및 인증키 확인(Skip 가능)
2. 유상증자 결정 공시 데이터 가져오기
3. 유상증자 결정 상세 데이터 가져오기
4. 유상증자 규모 및 목적별 분류
1. 가입 및 인증키 확인(Skip 가능)
2. 유상증자 결정 공시 데이터 가져오기
본인의 crtfc_key가 필요합니다.
검색 기간은 한번에 최대 3개월 지원하니 2022-07-01 ~ 2022-09-30 까지로 하고,
결과에서 '주요사항보고서(유상증자결정)' 부분만 따로 저장하겠습니다.
import requests
import pandas as pd
from IPython.display import display
crtfc_key='YOUR_APIKEY'
page_no=1
page_count=100
bgn_de='20220701'
end_de='20220930'
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'))]
df = df.reset_index(drop=True)
print(df.shape)
display(df)
입력 요청인자 설정부분입니다.
bgn_de(시작날짜), end_de(종료날짜) 인데 corp_code를 입력안하면 3개월까지 검색이 됩니다.
pblntf_detail_ty(공시유형)에서 B001(주요사항보고서)만 설정했습니다.
page_no=1
page_count=100
bgn_de='20220701'
end_de='20220930'
pblntf_detail_ty='B001'
결과를 보면 기간내 102개의 유상증자결정 공시가 확인됩니다.
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/piicDecsn.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])
# 신주의 종류와수, 증자전 발행주식총수, 자금조달의목적만 사용
detail=detail[['rcept_no','nstk_ostk_cnt','nstk_estk_cnt',
'bfic_tisstk_ostk','bfic_tisstk_estk','fdpp_fclt','fdpp_bsninh',
'fdpp_op','fdpp_dtrp','fdpp_ocsa','fdpp_etc']]
#report no를 index로
detail=detail.set_index('rcept_no')
detail이라는 DataFrame에 유상증자 상세의 전체 결과를 저장합니다.
유상증자결정 상세는 요청인자를 corp_code를 받게 되는데 회사별 1번만 실행하고 싶은데
3개월내 한개의 회사에서 여러건의 유상증자결정(정정포함) 공시가 있는 경우가 있어
중복 실행 방지를 위해 실행한 회사를 저장하기 위한 exec_check 리스트를 만들었습니다.
detail = pd.DataFrame()
exec_check = [] #회사별 중복실행 방지
실행이력이 있는 회사의 경우는 다음 for문으로 skip하고 실행한 회사는 exec_check에 저장합니다.
if corp_code in exec_check:
continue
exec_check.append(corp_code)
결과중에서 신주의 종류와 수, 증자전 발행주식총수, 자금 조달의 목적만 사용하기 때문에
해당 column만 가져와 다시 저장합니다.
'rcept_no' column을 index로 만듭니다.
# 신주의 종류와수, 증자전 발행주식총수, 자금조달의목적만 사용
detail=detail[['rcept_no','nstk_ostk_cnt','nstk_estk_cnt',
'bfic_tisstk_ostk','bfic_tisstk_estk','fdpp_fclt','fdpp_bsninh',
'fdpp_op','fdpp_dtrp','fdpp_ocsa','fdpp_etc']]
#report no를 index로
detail=detail.set_index('rcept_no')
4. 유상증자 규모 및 목적별 분류
detail의 경우는 최종보고서만 표시를 하는 것 같고,
df의 경우는 최종문서가 아니어도 리스트에 표시가 되므로 보고서 수가 다를수 있습니다.
그래서 두 곳에 다있는 정보만을 사용하겠습니다.
#inner join으로 두개 병합
df_all = pd.concat([df,detail], axis=1, join='inner')
cols=['nstk_ostk_cnt','nstk_estk_cnt','bfic_tisstk_ostk','bfic_tisstk_estk',
'fdpp_fclt','fdpp_bsninh','fdpp_op','fdpp_dtrp','fdpp_ocsa','fdpp_etc']
#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')
신주 발행 주식수와 발행 주식수로 신주 발행 주식수 비율을 구합니다.
Column명은 알기 쉽게 한글로 변경합니다.
df_all['신주비율(보통주식)']=df_all['nstk_ostk_cnt'] / df_all['bfic_tisstk_ostk'] *100
df_all['신주비율(기타주식)']=df_all['nstk_estk_cnt'] / df_all['bfic_tisstk_estk'] *100
cols=['fdpp_fclt','fdpp_bsninh','fdpp_op','fdpp_dtrp','fdpp_ocsa','fdpp_etc']
df_all=df_all.rename(columns={'fdpp_fclt':'목적_시설자금','fdpp_bsninh':'목적_영업양수자금',
'fdpp_op':'목적_운영자금', 'fdpp_dtrp':'목적_채무상환자금',
'fdpp_ocsa':'목적_타법인증권취득','fdpp_etc':'목적_기타자금'})
신주비율(보통주식) 에 대한 결과를 보겠습니다.
import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic')
df_all_sort = df_all.sort_values('신주비율(보통주식)', ascending=False)
plt.figure(figsize=(8,2))
plt.bar(df_all_sort['corp_name'], df_all_sort['신주비율(보통주식)'])
plt.xticks(rotation=90)
plt.show()
display(df_all_sort[['corp_code','corp_name','신주비율(보통주식)','rcept_dt']])
유상증자 목적별로 정리해서 출력해보겠습니다.
cols=['목적_시설자금','목적_영업양수자금','목적_운영자금','목적_채무상환자금',
'목적_타법인증권취득','목적_기타자금']
display_cols=['corp_name'] + cols
for col in cols:
print(col)
df_sort1=df_all_sort.loc[df_all_sort[col]!=0,display_cols]
display(df_sort1)
이상으로 유상증자 신주 비율 확인 및 목적별 분류를 확인해 봤습니다.
'API' 카테고리의 다른 글
[공공데이터포털 API] 가입하기 및 인증키(APPKey) 발급, 확인 (4) | 2022.10.25 |
---|---|
[전자공시 Dart API] 자기주식취득 공시 회사의 취득주식수 및 주가확인 (4) | 2022.10.23 |
[전자공시 Dart API] 배당률 높은 회사 리스트 가져오기 (16) | 2022.10.21 |
[전자공시 Dart API] 무상증자 결정 공시 낸 회사의 주가 정보 확인 (4) | 2022.10.20 |
[전자공시 Dart API] 임원 주요주주 소유보고 회사리스트 수집 (4) | 2022.10.19 |