요즘 배당주 인기가 많은 것 같습니다.
개별 배당주식에 투자하는 것은 생각보다 어렵습니다. 각각의 기업에 대해서 과거 배당추이를 확인해야 할 뿐만 아니라 각종 재무제표와 기업의 성장가능성 등도 파악해서 예측해야 합니다.
우리같은 월급쟁이 투자자는 항상 시간이 없잖아요. 그래서 배당성장 ETF가 인기가 많아진 것 같습니다.
그 중에서 " Dow Jones U.S. Dividend 100 Index"를 추종하는 SCHD(Schwab US Dividend Equity ETF)가 인기가 많습니다.
이번 포스트에서는 SCHD의 과거 데이터로 백테스트를 진행해서 향후 기대수익률이 어떻게 될 것인지 예상해 보도록 하겠습니다.
배당성장률
이 ETF 의 장점은 배당이 매년 지속적으로 늘어난다는 점입니다.
위의 그래프와 같이 배당이 매년 증가해서 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 매월 적립식 투자 |
CAGR | 12.1% | 6.2% (추가투입금 고려시 48%) |
MDD | -33.4% | -32.8% |
총 수익률 | 342% | 117% |
※ 추가투입금이 수익으로 잡혀서 CAGR이 48%가 나왔으며, 수익으로 고려하지 않으면 6.2%임
생각보다 수익률이 저조하고 CAGR도 낮네요. 10년이상 투자해서 겨우 2배정도가 되었고, CAGR도 저축은행 예금이자보다 약간 더 높은 수준입니다.
하지만 이 ETF는 이름 그대로 배당금이 중요합니다.
이번에는 배당금을 고려하고 수익률을 계산해 보겠습니다.
구 분 | 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()
'파이썬(Python) > 파이썬으로 투자실험' 카테고리의 다른 글
미국ETF 양도소득세는 복리에 어떤 영향을 미칠까? (0) | 2024.04.15 |
---|---|
SCHD를 QQQ와 함께 자산분배해서 투자하면 수익률이 괜찮을까? (1) | 2024.04.12 |
파이썬으로 미국주식 배당금 데이터 가져오기 (TypeError: Cannot join tz-naive with tz-aware DatetimeIndex) (0) | 2024.04.08 |
미국 ETF 적립식 투자시 초기 비용에 따른 수익률 비교 (0) | 2024.04.05 |
매월적립식 미국주식(ETF) 투자, 수익률을 더 올릴 방법은 없을까? (0) | 2024.04.03 |
댓글