개요
– 시작은 한 영상이었다. 해당 영상에 나오신 분께서는 배당주에 대해 다른 접근법을 제시한다. 우리가 흔히 고배당률의 배당주를 보면 달달한 배당에 군침부터 흘리지만, 높은 배당률이 저평가된 배당주의 척도가 될 수 있다는 것이다.
– 이익이 늘어나고 배당금도 높아지는데 주가가 아직 낮다면 이는 상승할 여력이 있는 배당주다. 잠재력이 있는 종목이다.
– 종목 선정의 기준을 발견하는 건 언제나 보람찬 일. 나는 배당 귀족주들의 배당률과 배당금을 확인해 저평가 배당주를 발굴하고, 직접 투자해 보려고 한다. 일명 ‘저평가 배당주 발굴하기’ 프로젝트다.
– 이번 프로젝트는 크게 3가지 부분으로 이루어지며, 순차적으로 글을 작성할 예정이다.
- 배당 귀족주 리스트업 후 배당금, 배당률 정리
- 투자할 만한 배당주 발굴
- 실제 배당주 투자
– 이 글은 프로젝트의 첫 번째 글이며, 파이썬과 yfinance 라이브러리를 활용해 배당 귀족주들의 역대 배당금과 배당률을 그래프로 시각화하는 방법과 결과물을 공유한다.
사용자 환경
– 나의 파이썬, 라이브러리 버전은 다음과 같다.
1. 파이썬 : Python 3.8.10
2. yfinance : 0.2.48
3. pandas : 2.0.3
4. matplotlib : 3.5.3
코드
* 주의 : 해당 코드는 수십 개의 그래프를 결과로 띄웁니다. 주피터 노트북 환경에서 실행하는 걸 추천합니다.
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
1. 라이브러리 import
- 사용할 라이브러리들을 import 한다.
# 시각화
def plot_data(df, ticker):
# 한글 폰트 설정
plt.rcParams['font.family'] = 'Malgun Gothic' # Windows의 맑은 고딕
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
fig, ax1 = plt.subplots(figsize=(12, 6))
# 그래프1
ax1.set_xlabel('년도') # 수정. x축 label
ax1.set_ylabel('배당률', color='red') # 수정. 그래프1 y축 label
line1, = ax1.plot(df.index, df["Dividends yield rate"], 'ro--', markersize=4, label='배당률', color='red') # 그래프1 그리기
ax1.tick_params(axis='y', labelcolor='red') # 그래프1 y축 색상 지정
# 그래프1 숫자표시 : x축, y축 좌표에 값을 텍스트로 표시
for i, v in enumerate(df.index): # x축 리스트에서 (인덱스, x축 리스트[인덱스]에 해당하는 value)를 가져온다.
plt.text(v, df["Dividends yield rate"][i], round(df["Dividends yield rate"][i], 2), # x축 리스트[인덱스] : x축 좌표, y축 리스트[인덱스] : y축 좌표, y축 리스트[인덱스] : 표시할 숫자
fontsize=9, # 텍스트 크기
color='red', # 텍스트 색깔
horizontalalignment='center', # 수평 위치 (left, center, right)
verticalalignment='bottom', # 수직 위치 (top, center, bottom)
# rotation=70 # 텍스트 각도
)
plt.xticks(rotation=45, fontsize=8) # 그래프 2 그리기 이전에 해야 x축 45도 돌아감
# 그래프2
ax2 = ax1.twinx() # 두 번째 y축 생성
ax2.set_ylabel('배당금', color='blue') # 수정. 그래프2 y축 label
line2 = ax2.bar(df.index, df['Dividends'], label=ticker+"_배당금", color='blue') # 그래프2 그리기
ax2.tick_params(axis='y', labelcolor='blue') # 그래프2 y축 색상 지정
# 그래프2 숫자표시
for i, v in enumerate(df.index):
plt.text(v, df["Dividends"][i], round(df["Dividends"][i], 2),
fontsize=9,
color='blue',
horizontalalignment='center',
verticalalignment='bottom',
# rotation=45
)
# 제목 및 범례 추가
lines_labels = line1.get_label(), line2.get_label()
handles= [line1, line2]
plt.legend(handles, lines_labels, loc='upper left', fontsize=10, frameon=True)
ax1.set_zorder(ax2.get_zorder() + 10) # 그래프1 zorder를 그래프2 zorder보다 무조건 높게. zorder 낮을수록 먼저 그려짐
ax1.patch.set_visible(False) # 그래프1 레이어 투명하게
plt.title(f'배당률 & 배당금 : {ticker}') # 수정. 그래프 제목
fig.tight_layout() # 레이아웃 조정
plt.show()
2. 시각화 함수
- 종목의 배당금, 배당률 정보가 기록된 데이터프레임과 종목의 ticker를 입력받으면 해당 종목의 역대 배당금과 배당률을 시각화하는 함수
- 이때 배당률은 해당 년도의 배당금을 해당 년도의 종가 평균으로 나눈다.
DIR_SAVEFILE = "C:/coding/DA/dividends_info.xlsx" # 수정 필요. 테스트 데이터프레임들 저장할 엑셀 경로
DIR_DIVIDEND_ARISTOCRAT = "C:/Users/LG/Desktop/바탕화면/재테크/주식/배당귀족주 리스트.xlsx"
df_result_list = list() # df_merge 저장하기 위해 리스트 만들기
df_dividend_aristocrats = pd.read_excel(DIR_DIVIDEND_ARISTOCRAT) # 수정 필요. 배당귀족주 목록 데이터프레임으로 불러오기
lst_dividend_aristocrats = df_dividend_aristocrats["Ticker"]
# 배당률, 배당금, 종가 받아오는 함수
def scraping_stock_data(stock_ticker):
ticker = stock_ticker # 특정 종목 티커
stock = yf.Ticker(ticker) # 주식 데이터 다운로드
dividends = stock.dividends # 역대 배당금 조회
# 종가 데이터프레임 만들기
df = yf.download(ticker) # 특정 종목 정보 받아오기
df = df.reset_index() # 인덱스 초기화
df["Year"] = df["Date"].astype('str').str.split('-').str[0] # 연도 컬럼 생성
# 종가 피벗 테이블 만들기
df_pivot_price = pd.pivot_table(df, values="Close", index="Year", aggfunc='mean') # 같은 년도의 종가 평균가
df_pivot_price = df_pivot_price.rename(columns={ticker:str(ticker+"_closed")}) # 종가 피벗 테이블 컬럼명 바꾸기
# 배당금 데이터프레임 만들기
df_dividends = pd.DataFrame(dividends) # 배당금 시리즈 -> 배당금 데이터프레임
df_dividends = df_dividends.reset_index() # 인덱스 초기화 -> 날짜 컬럼(Date) 생성
df_dividends["Year"] = df_dividends["Date"].astype('str').str.split('-').str[0] # 연도 컬럼 생성
df_pivot_dividends = pd.pivot_table(df_dividends, values="Dividends", index="Year", aggfunc='sum') # 배당금 피벗 테이블 생성_연도별 배당금
# 종가 테이블, 배당금 테이블 join 하기
df_merged = pd.merge(left=df_pivot_price, right=df_pivot_dividends, left_index=True, right_index=True, how="inner") # 인덱스로 join 하기
df_merged["Dividends yield rate"] = round((df_merged["Dividends"]/df_merged[ticker+"_closed"])*100, 1) # 배당률 컬럼 생성
# 엑셀 파일에 시트로 저장
df_result_list.append(df_merged) # 각 종목별 만들어진 결과물 데이터프레임을 리스트에 모아준다.
# 시각화
plot_data(df_merged, ticker)
3. 배당 귀족주 데이터 받아오는 함수
- 배당 귀족주 리스트들의 역대 배당금, 배당률을 받아와서 시각화하는 함수
- 결과물은 엑셀파일로 저장된다.
- DIR_SAVEFILE : 결과물을 저장할 경로. 각자 알맞게 수정 필요
- DIR_DIVIDEND_ARISTOCRAT : 나는 배당 귀족주 리스트를 이 블로그에서 얻었다. 이 변수는 배당 귀족주 리스트를 저장한 경로이며, 배당 귀족주들의 티커가 Ticker 컬럼명으로 저장된다. 각자 알맞게 수정하자
– 부연 설명, 문의는 내 깃허브, 티스토리 블로그를 참고 부탁한다.
결과물



– 내 노트북에서는 약 6분 정도 만에 49개 배당 귀족주에 대해 배당금, 배당률 그래프를 그릴 수 있었다.
– 아래에는 내가 스크래핑에 사용한 배당 귀족주 리스트 엑셀 파일, 결과물 엑셀 파일을 첨부한다.
1. 배당 귀족주 리스트

– 이런 식으로 Ticker 컬럼에 배당귀족주 티커가 담겨있다.
2. 결과물 파일

– 결과물 파일에는 위 이미지와 같이 한 시트당 하나의 종목에 대해 해당 년도 종가 평균, 배당금, 배당률에 대해 정리되어 있다.
마치며
– 이번 글에서는 배당 귀족주들의 배당금, 배당률을 그래프로 시각화했다. 다음 글에서는 이들 중 괜찮아 보이는 배당 귀족주들에 대해 더 자세히 살펴보고 투자할 종목을 선정할 것! 그다음에는 실제로 투자한 후기를 들려드리겠다.
– 25/02/23 : yfinance 라이브러리에 문제가 생겨서 종목들 데이터를 제대로 받아오지 못하고 있다. 해결될 때까지 해당 코드는 정상적으로 동작하지 않을 것 같다… 야후 파이낸스에서 작정하고 블락을 한걸까?
-> 25/02/24 : 해결. 하지만 yf.download() 는 좀 불안정한 것 같아서 yf.Ticker.history 를 이용한 수정 코드도 만들었고 깃허브에도 해당 파일을 업로드했다.