파이썬

파이썬으로 시가배당률 역사적 저점, 고점 구하기

게으른 투자자 2020. 8. 17. 14:02

<절대로! 배당은 거짓말하지 않는다>에 소개된 배당가치 투자법을 실행하려면 종목별로 시가배당률의 역사적 저점, 고점을 파악해야 한다.

절대로! 배당은 거짓말하지 않는다
국내도서
저자 : 켈리 라이트 / 한지영,홍춘욱역
출판 : 리딩리더 2013.09.13
상세보기

 

손으로 쉽게 구할 수 있는 값이 아니어서 파이썬으로 구현해봤다.

 

import requests
import numpy as np
import pandas as pd
import FinanceDataReader as fdr


def get_dividends(ticker):
    if ticker.endswith('5'):  # 우선주
        ticker = ticker[:-1] + '0'  # 보통주
        dividend_offset = 2
    else:
        dividend_offset = 1
    dividends = {}
    url = 'https://comp.fnguide.com/SVO2/asp/SVD_Invest.asp?pGB=1&cID=&MenuYn=Y&ReportGB=D&NewMenuID=105&stkGb=701&gicode=A' + ticker
    page = requests.get(url)
    df = pd.read_html(page.text)[1]
    for column in df.columns[-4:-1]:  # '2019/12'
        series = df[column]
        year = int(column.split('/')[0])  # 2019
        dividend_index = series[series == 'Dividends'].index[0] + dividend_offset
        dividend = series.iloc[dividend_index]
        if dividend is not np.NaN:
            dividends[year] = int(dividend)
    return dividends
    
    
def get_dividend_yield_range(ticker):
    dividends = get_dividends(ticker)
    dy_high = 0
    dy_low = 100
    for year, dividend in dividends.items():
        price_df = fdr.DataReader(ticker, str(year+1), str(year+2))
        for _, row in price_df.iterrows():
            dy = round(dividend / row['Close'] * 100, 2)
            if dy > dy_high:
                dy_high = dy
            if dy < dy_low:
                dy_low = dy
    return (dy_low, dy_high)

 

get_dividends(ticker) 함수는 Company Guide에서 최근 3년의 배당금 정보를 가져와 dict 형식으로 반환한다. Company Guide에서 우선주에 대한 정보는 제공하지 않으므로 종목코드가 '5'로 끝나는 우선주의 경우 종목코드를 보통주의 종목코드로 변경하여 정보를 가져온다.

 

{2017: 851, 2018: 1417, 2019: 1417}

 

comp.fnguide.com/SVO2/ASP/SVD_Invest.asp?pGB=1&gicode=A005930&cID=&MenuYn=Y&ReportGB=&NewMenuID=105&stkGb=701

 

get_dividend_yield_range(ticker) 함수는 get_dividends(ticker) 함수로 가져온 배당금 정보와 FinanceDataReader로 가져온 가격정보를 바탕으로 시가배당률을 계산하여 저점과 고점을 tuple 형식으로 반환한다. 2017년의 배당금을 기준으로 2018년의 가격정보를 가져와 시가배당률을 계산하는 식이다.

 

(1.96, 4.65)

 

장중 최고가, 최저가가 아닌 종가를 기준으로 한 이유는 유동성이 부족한 종목의 경우 세력들의 장난으로 장중에 비상식적인 가격이 찍히는 경우가 있기 때문이다.

 

배당가치 투자법은 심플함이 미덕이다. 배당금이 꾸준히 증가할 것으로 기대되는 우량한 종목을 선정하여, 시가배당률이 역사적 고점에 가까울 때 매수, 역사적 저점에 가까울 때 매도한다. 끝.