[OpenDartReader] 주당 배당금 정보 수집

1.선물, 우선주 등을 제외한 코스피와 코스닥시장 상장기업의 사업보고서로부터 연도별 배당 정보 수집

2.배당정보는 주당 현금배당금,  주당 순이익(EPS: Earning Per Share)를 의미

3.수집한 주가당 순이익과 이전에 수집한 주가를 이용해 주가 수익비율(PER: Price Earning Ratio)를 계산 

 

 

OpenDart  API 신청  : https://opendart.fss.or.kr/

 

전자공시 OPENDART 시스템

--> 시스템 점검으로 모든 서비스 이용이 일시적으로 중단되어니 양해 부탁드립니다. 시스템 점검 일정 2019년12월30일 23:00 ~ 12월31일 24:00 (1시간) *상기 작업 시간은 사정에 의해 변경 될 수 있습니

opendart.fss.or.kr

dart 객체 생성

# Dart Api Key
my_api = '신청한APIkey'
dart = OpenDartReader(my_api)

 

미리 저장해 둔 종목정보에서 Code와 Name 하는 함수

def get_stock_list():
    engine = create_engine('mysql+pymysql://~~~~~')
    stock_list = pd.read_sql('select Code, Name from stock_info_krx order by Name;', con=engine)
    engine.dispose()
    return stock_list

 

종목명과 해당 연도를 넣으면  배당금 정보를 반환하는 함수  (전전기, 전기, 현재)

def find_divdends(stock_name, year):
    try:
        stock_name_report = dart.report(stock_name, "배당", year, "11011")  # 데이터 가져오기
    except:
        stock_name_report = None

    if stock_name_report is None:  # 리포트가 없다면 (참고: 리포트가 없으면 None을 반환함)
        return np.nan, np.nan, np.nan

    else:
        # 필터링: se컬럼이 주당 현금배당금(원)인 첫 번째 행만 가져옴
        try:
            stock_name_report = stock_name_report.loc[(stock_name_report['se'] == '주당 현금배당금(원)')].iloc[0]
            thstrm_divdends = int(stock_name_report['thstrm'].replace('-', '0').replace(',', ''))
            frmtrm_divdends = int(stock_name_report['frmtrm'].replace('-', '0').replace(',', ''))
            lwfr_divdends = int(stock_name_report['lwfr'].replace('-', '0').replace(',', ''))
            return lwfr_divdends, frmtrm_divdends, thstrm_divdends
        except:
            return np.nan, np.nan, np.nan

 

종목를 순회하면 배당금정보 수집하여 div_data에 모음

stock_list = get_stock_list()
stock_name_list = stock_list["Name"].values

div_data = []
for idx, stock_name in enumerate(stock_name_list):
    print(idx + 1, "/", len(stock_name_list))  # 현재까지 진행된 상황 출력
    print(stock_name)
    record = [stock_name]  # 레코드 초기화
    for year in [2023]:
        lwfr_divdends, frmtrm_divdends, thstrm_divdends = find_divdends(stock_name, year)  # 배당금 가져오기
        if year != 2020:
            record += [lwfr_divdends, frmtrm_divdends, thstrm_divdends]
        else:
            record += [frmtrm_divdends, thstrm_divdends]  # 2018년이 중복되므로
    print(record)
    div_data.append(record)
    time.sleep(0.5)  # 0.5초씩 재움

 

모든 배당금 정보를 db에 저장

div_data = pd.DataFrame(div_data, columns = ["stock_name", "2021", "2022", "2023"])
engine = create_engine('mysql+pymysql://~~~~')
div_data.to_sql('주당배당금', engine, if_exists='replace')
engine.dispose()