이번에는 주식 토탈리턴 계산기를 만들어보고자 합니다.
파이썬 코드를 통해 간단하게 사용할 수 있는 토탈리턴 계산기에 대한 포스팅 시작해보겠습니다.
1. 주식의 토탈리턴(Total Return)이란?
- 토탈 리턴은 단순한 주가 변화가 아닌, 배당 재투자를 포함한 실제 수익률을 반영해야 하는 것입니다.
- 즉, 배당을 매번 주가에 재투자한다고 가정하여 계산하는 방법입니다.
토탈리턴의 계산 공식은 아래와 같습니다.
즉, 배당금의 재투자가 고려되는 것인 만큼 배당을 주는 주식에 대한 총 수익률을 계산할때 꼭 필요한 개념입니다.
이 효과를 예시를 통해 알아보겠습니다.
먼저, 배당을 주지 않는 성장주의 예시입니다.
위와 같은 성장주는 배당을 주지 않기에 토탈 리턴과 주가의 누적 수익률이 동일합니다.
하지만, 배당주의 경우는 다릅니다.
배당금이 존재하기에, 이 배당금이 최종 누적 수익률에 포함이 되어야하며 이를 고려한 것이 총 수익률인 토탈리턴 입니다.
2. 파이썬을 활용한 토탈리턴 계산기 만들기
- 이번에는 코랩 환경에서 파이썬을 활용해 간단하게 토탈리턴 계산기를 만들어보겠습니다.
- 코드는 아래와 같습니다.
# 🟢 라이브러리 임포트
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
# Google Colab에서 그래프 한글 폰트 설정
mpl.rc('font', family='DejaVu Sans') # Colab 기본 폰트 사용
# === 🟢 Total Return 계산 함수 정의 === #
def calculate_total_return(ticker, start_date, end_date):
"""
특정 주식의 Total Return을 계산하는 함수.
- 티커(symbol), 시작 날짜(start_date), 종료 날짜(end_date)를 입력받아 Total Return을 계산.
"""
# 🟢 yfinance에서 데이터 다운로드
stock = yf.Ticker(ticker)
df = stock.history(start=start_date, end=end_date, auto_adjust=False)
if df.empty:
print("⚠️ No data found. Please check the date range.")
return None
# 🟢 주가(Close) 및 배당금(Dividends) 데이터 확인
df = df[['Close', 'Dividends']]
df = df.dropna(subset=['Close']) # 주가 NaN 제거
# 🟢 주가 변화율(%) 계산
df['Stock Price Change (%)'] = (df['Close'] / df['Close'].iloc[0] - 1) * 100
# 🟢 배당금이 없는 경우 NaN → 0으로 변경
df['Dividends'].fillna(0, inplace=True)
# 🟢 배당금 누적 계산 (배당 재투자를 가정)
df['Cumulative Dividends'] = df['Dividends'].cumsum()
# 🟢 일일 수익률 및 누적 수익률 계산
df['Daily Return'] = df['Close'].pct_change().fillna(0) # 첫 번째 값 NaN 방지
df['Cumulative Return'] = (1 + df['Daily Return']).cumprod()
# 🟢 배당 재투자를 반영한 Total Return (%) 계산
df['Total Return (%)'] = ((df['Cumulative Return'] + df['Cumulative Dividends'] / df['Close'].iloc[0]) - 1) * 100
return df
# === 🟢 사용자 입력 받기 === #
ticker = input("Enter stock ticker (e.g., AAPL, TSLA, MSFT): ").upper()
start_date = input("Enter start date (YYYY-MM-DD): ")
end_date = input("Enter end date (YYYY-MM-DD): ")
# === 🟢 Total Return 계산 및 시각화 === #
df_result = calculate_total_return(ticker, start_date, end_date)
if df_result is not None:
# 🟢 최근 5개 데이터 출력
print(f"\n📊 {ticker} Stock Data:")
print(df_result[['Close', 'Stock Price Change (%)', 'Total Return (%)']].tail())
# === 🟢 ① 주가 ($) 그래프 === #
plt.figure(figsize=(12, 5))
plt.plot(df_result.index, df_result['Close'], label='Stock Price ($)', color='b', linewidth=2)
plt.xlabel('Date')
plt.ylabel('Stock Price ($)')
plt.title(f'{ticker} Stock Price ({start_date} ~ {end_date})')
plt.legend(loc='upper left')
plt.grid()
plt.show()
# === 🟢 ② 주가 변화율 (%) 그래프 === #
plt.figure(figsize=(12, 5))
plt.plot(df_result.index, df_result['Stock Price Change (%)'], label='Stock Price Change (%)', color='g', linewidth=2)
plt.xlabel('Date')
plt.ylabel('Stock Price Change (%)')
plt.title(f'{ticker} Stock Price Change (%) ({start_date} ~ {end_date})')
plt.legend(loc='upper left')
plt.grid()
# 🔹 y축을 % 단위로 변환하여 표시
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))
plt.show()
# === 🟢 ③ Total Return (%) 그래프 === #
plt.figure(figsize=(12, 5))
plt.plot(df_result.index, df_result['Total Return (%)'], label='Total Return (%)', color='r', linewidth=2)
plt.xlabel('Date')
plt.ylabel('Total Return (%)')
plt.title(f'{ticker} Total Return ({start_date} ~ {end_date})')
plt.legend(loc='upper left')
plt.grid()
# 🔹 y축을 % 단위로 변환하여 표시
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))
plt.show()
위 코드를 활용해서 먼저 "Apple"의 주가에 대해서 알아보겠습니다.
위 코드를 실행하여 티커와 시작일, 그리고 종료일을 입력해주면 아래와 같은 결과들이 나옵니다.
이때 기간은 2010년 1월1일부터 2025년 2월 28일까지로 설정해보았습니다.
1) 애플의 주가 변화
2) 애플의 주가 변화율(%)
3) 애플의 토탈리턴
위 결과들을 종합해서 보면,
배당 재투자를 하지 않은 수익률은 해당 기간동안 약 3,000%인 (31배 / 0%가 1배, 100%는 2배, ..... 입니다) 반면
배당 재투자를 한 경우 수익률은 해당 기간동안 약 3,300%인 것을 알 수 있습니다.
애플의 배당금이 1%이하인 점을 감안하면 배당 재투자의 효과를 무시할 수 없음을 알 수 있습니다.
다음은 대표적인 배당주인 알트리아(MO)입니다.
1) MO의 주가 변화
2) MO의 주가 변화(%)
3) MO의 토탈리턴(%)
배당률이 큰 알트리아(MO)의 경우 2010년 1월1일부터 25년 2월 28일까지의 수익률 차이를 보면
주가 수익률은 약 170% 정도인 반면
배당 재투자를 고려한 토탈리턴의 수익률은
약 390%정도가 되는 것을 알 수 있습니다.
위 계산은 세금 등을 고려하지 않은 부분이기에 실제 금액과는 일부 차이가 있을 수 있습니다.
댓글