본문 바로가기

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-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']]

설치 및 사용법은 아래 정보를 참고하셔도 좋습니다.

https://yenpa.tistory.com/19

 

[FinanceDataReader] 설치 및 주식 주가 정보 가져오기(코스피, 코스닥)

국내 주식 정보를 가져와 보겠습니다. 1. FinanceDataReader 설치 2. 종목 정보 가져오기 3. 주가 정보 가져오기 1. FinanceDataReader 설치 명령프롬프트에서 아래의 명령어로 설치 가능합니다. anaconda의 경

yenpa.tistory.com

 

마지막으로 결과를 확인해보겠습니다.

일부회사의 정보만 살펴보겠습니다.

위쪽에 자기주식취득 상세정보가 표시되고, 아래쪽에 그래프가 표시되는데

빨간선은 공시접수일자이고 녹색선은 취득예상기간(시작일)이 되겠습니다.

취득예정주식은 보통주식으로 650000이고 취득예상기간(시작일)은 2022-03-10인것이 확인됩니다.

키움증권의 결과입니다. 취득예정주식은 보통주식 500000만주 이고

공시접수일자는 2022-01-28일 취득예상기간(시작일)은 2022-02-03으로 5일정도 차이가 있는것을 알수 있습니다.

 

자기주식취득의 일부정보만 표시한것이고 다른 정보도 많으니 활용하시면 될것 같습니다.

이상으로 자기주식취득 공시 회사의 취득주식수 및 주가를 확인해봤습니다.

반응형