본문 바로가기

API

[전자공시 Dart API] 유상증자 신주 비율 확인 및 유상증자 목적별 분류

반응형

전자공시 Dart API의 주요사항보고서 개발가이드 > 공시정보 > 공시검색 데이터에서 유상증자 결정 공시정보를 가져와

주요사항보고서 주요정보 > 유상증자 결정 데이터와 병합해서 유상증자의 규모를 확인하고

자금조달 목적별 분류를 해보겠습니다.

본인의  인증키(API Key)가 필요하니 필요하신분은 아래를 참고 부탁드립니다.

 

1. 가입 및 인증키 확인(Skip 가능)

2. 유상증자 결정 공시 데이터 가져오기

3. 유상증자 결정 상세 데이터 가져오기

4. 유상증자 규모 및 목적별 분류

 

1. 가입 및 인증키 확인(Skip 가능)

https://yenpa.tistory.com/23

 

[전자공시 Dart API] 가입 및 인증키(API Key) 확인하기

1. 사이트 가입 2. 인증키(API Key) 확인하기 1. 사이트 가입 사이트에 접속합니다. https://opendart.fss.or.kr/ 시스템 점검으로 모든 서비스 이용이 일시적으로 중단되어니 양해 부탁드립니다. 시스템 점

yenpa.tistory.com

 

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)

 

 

 

이상으로 유상증자 신주 비율 확인 및 목적별 분류를 확인해 봤습니다.

반응형