미국 배당성장ETF SCHD로 적립식 투자를 하면 10년 후에 수익률이 어떻게 될까?(SCHD 적립식 투자 백테스트 배당금 포함)
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

미국 배당성장ETF SCHD로 적립식 투자를 하면 10년 후에 수익률이 어떻게 될까?(SCHD 적립식 투자 백테스트 배당금 포함)

by Squat Lee 2024. 4. 10.

요즘 배당주 인기가 많은 것 같습니다.
 
개별 배당주식에 투자하는 것은 생각보다 어렵습니다. 각각의 기업에 대해서 과거 배당추이를 확인해야 할 뿐만 아니라 각종 재무제표와 기업의 성장가능성 등도 파악해서 예측해야 합니다.
 
우리같은 월급쟁이 투자자는 항상 시간이 없잖아요. 그래서 배당성장 ETF가 인기가 많아진 것 같습니다.
 
그 중에서 " Dow Jones U.S. Dividend 100 Index"를 추종하는 SCHD(Schwab US Dividend Equity ETF)가 인기가 많습니다.
 
이번 포스트에서는 SCHD의 과거 데이터로 백테스트를 진행해서 향후 기대수익률이 어떻게 될 것인지 예상해 보도록 하겠습니다.
 

배당성장률

이 ETF 의 장점은 배당이 매년 지속적으로 늘어난다는 점입니다.

SCHD 배당금 성장 추이
 

위의 그래프와 같이 배당이 매년 증가해서 2012년(주당 $0.812) 대비 2023년(주당 $2.659)로 배당금이 약 22배가 늘어났습니다. 그런데 2011년 하반기부터 배당이 지급되어서 2012년($0.81)부터 계산하면 약 3.3배 정도로 늘었습니다.
 
2012년 말 기준 배당율은 약 4% 정도이고, 만약 이때 산 주식을 계속 가지고 있는다면 2023년기준 배당률은 약 12.3%가 됩니다.
 
즉, 12.3%의 예금에 넣는 효과와 동일하다고 볼 수 있습니다. 
 
 
그러면 이 주식을 매월 적립식으로 투자했을 때 수익률이 어떻게 나오는지 보도록 하겠습니다.
 
 

SCHD 매월 적립식투자 백테스트

 
백테스트 기간은 상장일부터 2024년 2월 28일까지이며, 매월 말일자로 투자를 한다는 가정을 했습니다.
 
초기투자금은 $2,000이고 매월 $1,000씩 추가금을 적립식으로 투자를 했습니다. 세금은 매매매시 0,25%를 적용했고, 배당소득세 15.4%도 고려한 결과입니다.
 
배당금을 고려한 백테스트는 배당을 재투자했다고 가정했습니다. 
 
 

우선 배당금을 고려하지 않고 수익률을 살펴보겠습니다.

SCHD 매월 적립식 투자 백테스트(배당금 고려하지 않음)

 
 

구  분 SCHD 지수 SCHD 매월 적립식 투자
CAGR 12.1% 6.2%
(추가투입금 고려시 48%)
MDD -33.4% -32.8%
총 수익률 342% 117%

※ 추가투입금이 수익으로 잡혀서 CAGR이 48%가 나왔으며, 수익으로 고려하지 않으면 6.2%임
 
생각보다 수익률이 저조하고 CAGR도 낮네요. 10년이상 투자해서 겨우 2배정도가 되었고, CAGR도 저축은행 예금이자보다 약간 더 높은 수준입니다.
 
하지만 이 ETF는 이름 그대로 배당금이 중요합니다.
 

이번에는 배당금을 고려하고 수익률을 계산해 보겠습니다.

 

SCHD 매월 적립식 투자 백테스트(배당금 포함)

구  분 SCHD 지수 SCHD 매월 적립식 투자
CAGR 12.1% 8.2%
(추가투입금 고려시 50.8%)
MDD -33.4% -32.8%
총 수익률 342% 177%

 
CAGR이 약 2%가량 올랐습니다. 이 정도면 괜찮은 것 같습니다.
 
배당금이 계속 늘어난다고 가정하고, 배당을 재투자 한다면 기간이 길어질 수록 상당한 복리효과를 기대할 수 있을 것 같습니다. 
 
CAGR이 QQQ에 비해서는 낮지만 여전히 부담스러운 수치인 것 같습니다. 다음 포스트에서는 다른 반대되는 자산과 투자했을 시 CAGR과 MDD가 어떻게 변화되는지 살펴보겠습니다.
 
백테스트를 한 파이썬 코드는 아래와 같습니다.
 
배당성장확인

import pandas as pd
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

symbol = 'SCHD'

ticker = yf.Ticker(symbol)
div = ticker.dividends.tz_localize(None)
df = pd.DataFrame({'DIV':div})
df = df.groupby(by=df.index.year).sum()
print(df)

#그래프로 표현하기
plt.rcParams['figure.figsize'] = (16, 9)

plt.plot(df.index, df['DIV'], color='red', label=symbol)
plt.grid(True)
plt.legend(loc='best')

plt.title(f'{symbol} Dividend Yield')

plt.show()

 
 
과거데이터로 매월 적립식 백테스트

import pandas as pd
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

pd.options.display.float_format = '{:,.2f}'.format

symbol = 'SCHD'

ticker = yf.Ticker(symbol)
div = ticker.dividends.tz_localize(None)

매매수수료 = 0.0025
배당소득세 = 0.154

start = datetime(2005, 1, 1)
end = datetime(2024, 2, 29)

초기투자금 = 2000
매월투자금 = 1000

배당금적용여부 = 1 #1이면 적용, 0이면 미적용

df = pdr.get_data_yahoo(symbol, start, end)

#배당데이터에 다른 데이터 넣기
if 배당금적용여부  == 1:
    df_d = pd.DataFrame({'배당금':div})
    df = pd.merge(df, df_d, left_index=True, right_index=True, how='outer')
    df.fillna(0, inplace=True)
else:
    df['배당금'] = 0

#월말투자금 넣기
df_m = df
df_m['date'] = df_m.index #멀티인덱스로 만들어지기에 별도의 날짜컬럼을 만들고
df_m = df_m.groupby(by=[df.index.year, df.index.month]).last() #매월 마지막날만 필터
li_monthlast = df_m['date'].to_list()

df['투자금'] = 0
for i, m in enumerate(li_monthlast):
    if i == 0:
        df['투자금'].loc[m] = 초기투자금
    else:
        df['투자금'].loc[m] = 매월투자금

#MDD 구하기
def get_mdd(col):
    window = 252
    peak = col.rolling(window, min_periods=1).max()
    drawdown = col/peak -1
    연도별mdd = drawdown.rolling(window, min_periods=1).min()
    mdd = 연도별mdd.min()
    return mdd

# 적립식 투자하면서 자산변동 계산
df.rename(columns={'Adj Close':'p1'}, inplace=True)
df[['주식수', '합계', '원금누계']] = 0
for m in range(len(df)):
    if m == 0:
        df['합계'].iloc[m] = df['투자금'].iloc[m] * (1-매매수수료)
        df['주식수'].iloc[m] = df['합계'].iloc[m] / df['p1'].iloc[m]
        df['원금누계'].iloc[m] = df['투자금'].iloc[m]
    else:
        df['합계'].iloc[m] = df['투자금'].iloc[m] * (1-매매수수료) + (df['p1'].iloc[m] * df['주식수'].iloc[m-1]) + \
                           (df['배당금'].iloc[m] * df['주식수'].iloc[m-1]) * (1 - 배당소득세)
        df['주식수'].iloc[m] = df['합계'].iloc[m] / df['p1'].iloc[m]
        df['원금누계'].iloc[m] = df['원금누계'].iloc[m-1] + df['투자금'].iloc[m]

df = df[['p1', '배당금', '투자금', '주식수', '합계', '원금누계']]
df = df.loc[str(li_monthlast[0]):]

# 2가지 자산의 누적수익률을 비교하기 위해 백분율로 표현
df['주가백분율'] = df['p1'] / df['p1'].iloc[0]
df['전략백분율'] = df['합계'] / df['원금누계']

#CAGR
diff = df.index[-1].year - df.index[0].year
cagr_etf = (df['주가백분율'].iloc[-1] / df['주가백분율'].iloc[0]) ** (1 / diff) - 1
cagr_전략 = (df['합계'].iloc[-1] / df['합계'].iloc[0]) ** (1 / diff) - 1
cagr_전략_실질 = (df['전략백분율'].iloc[-1] / df['전략백분율'].iloc[0]) ** (1 / diff) - 1
cagr = f'CAGR(ETF) : {round(cagr_etf, 3)} / CAGR(전략) : {round(cagr_전략, 3)} ' \
       f'/ CAGR(실질전략) : {round(cagr_전략_실질, 3)}'
print(cagr)

#MDD구하기
mdd_etf = get_mdd(df['p1'])
mdd_전략 = get_mdd(df['합계'])
mdd_t = f'MDD(ETF) : {round(mdd_etf,3)} / MDD(전략) : {round(mdd_전략,3)}'
print(mdd_t)

ETF수익률 = df['p1'].iloc[-1]/df['p1'].iloc[0] - 1
전략수익률 = df['합계'].iloc[-1]/df['투자금'].sum() - 1

print(f'ETF 수익률 : {round(ETF수익률,2)}')
print(f'전략 수익률 : {round(전략수익률,2)}')

#엑셀파일로 만들기
df.to_excel(f'적립식투자 백테스트({symbol}, CAGR {round(cagr_전략*100,1)} '
            f'MDD {round(mdd_전략*100,1)}).xlsx')

#그래프로 표현하기
plt.rcParams['figure.figsize'] = (16, 9)

plt.plot(df.index, df['주가백분율'], color='blue', label=symbol)
plt.plot(df.index, df['전략백분율'], color='red', label='strategy')
plt.grid(True)
plt.legend(loc='best')

plt.title(f'{symbol} Accumulated Invest')

plt.show()
728x90
반응형

댓글