본문 바로가기
업무자동화 with Python

[업무자동화 with Python] 파이썬으로 주식 토탈리턴(Total Return) 계산기 만들어보기

by CodeCrafter 2025. 3. 16.
반응형

 

 

이번에는 주식 토탈리턴 계산기를 만들어보고자 합니다.

 

파이썬 코드를 통해 간단하게 사용할 수 있는 토탈리턴 계산기에 대한 포스팅 시작해보겠습니다.

 

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%정도가 되는 것을 알 수 있습니다.

 

 

 

 

위 계산은 세금 등을 고려하지 않은 부분이기에 실제 금액과는 일부 차이가 있을 수 있습니다.

반응형

댓글