SCHD를 QQQ와 함께 자산분배해서 투자하면 수익률이 괜찮을까?
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

SCHD를 QQQ와 함께 자산분배해서 투자하면 수익률이 괜찮을까?

by Squat Lee 2024. 4. 12.

지난 포스트에서 SCHD를 매월 적립식으로 투자하면 수익률이 어떻게 될지 백테스트를 해 보았습니다.

 

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

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

 

배당금을 고려하고 투자시 CAGR이 8.2% 이고, MDD가 -32.8%였습니다.

 

SCHD는 배당금이 계속 성장하기에 분명이 장점이 있지만, 생각보다 수익률이 좋지 않고, 안정성도 좋지 않아서 다른 자산과 함께 투자하는 방안을 생각해 보았습니다.

 

유튜브에서 누가 QQQ와 함께 투자시 괜찮을거라고 얘기해 주더라구요. 그런데 괜찮다는게 CAGR은 얼마나 향상되고, MDD는 얼마나 줄어드는지 구체적으로 얘기하지 않고 그냥 괜찮을거라고 비중을 적절히 조절해서 오래동안 투자하라는 얘기만 했습니다.

 

저는 숫자로 얘기하잖아요. 그래서 백테스트를 한 번 해 보았습니다. 감이 아닌 객관적인 근거를 봐야 투자에 대한 판단이 서지 않을까요?

 

 

SCHD vs QQQ 상관관계 분석

 

자산분배의 기본은 서로 반대되고, 각각 우상향하는 자산을 함께 투자해야 한다는 것입니다.

 

반대되는 자산이라고 하나는 우상향하고 다른 하나는 우하향하는 것이 아니라 증감률이 반대로 되어야 합니다. 

 

한 자산이 가치(주가)가 올라갈때 나머지 다른 자산은 가치(주가)가 떨어지고, 반대의 경우도 존재해서 비중조절을 통해  서로 위험을 보완해주어야 합니다. 그리고 자산분배를 통해 이익이 더 높아지는 것도 기대할 수 있습니다.

 

증감율 기간을 3개월로 했을시 QQQ와 SCHD의 상관관계

 

증가되는 기간을 3개월로 했을시 QQQ와 SCHD는 R 값이 0.55가 나왔습니다. 

 

증감율 기간을 3개월로 했을시 QQQ와 SPY의 상관관계

 

QQQ와 SPY 처럼 상관관계가 0.87  정도로 높은편은 아니지만, 반대되는 자산이라 하기에는 무리가 있네요.

 

증감율 기간을 3개월로 했을시 QQQ와 TLT의 상관관계

 

QQQ와 TLT처럼 R값이 마이너스가 나와야 반대되는 자산이라 할 수 있습니다.

 

이번에는 증감율 기간을 6개월로 해서 분석해 보겠습니다.

 

증감율 기간을 1년으로 했을시 QQQ와 SCHD의 상관관계

 

3개월로 할 때보다 오히려 상관관계가 증가했네요. 

 

반대되는 자산이 아니지만 일단 QQQ와 SCHD를 자산분배해서 투자하는 백테스트를 진행해 보도록 하겠습니다.

 

 

QQQ와 SCHD 백테스트

 

백테스트 조건은 아래와 같이 설정하였습니다.

 

1. QQQ와 SCHD를 5:5 비율로 매월 리밸런싱을 합니다.

2. 초기자산은 $2,000이고, 매월 $1,000씩 추가금이 투입됩니다.(리밸런싱은 추가금이 투입된 기준입니다.)

3. 배당수익은 재투자를 한다고 가정했습니다.

4. 매매수수료는 0.25%, 매당수수료는 15.4%를 반영했습니다.

5. 기간은 QQQ와 SCHD 중 상장일이 늦은자산을 기준으로 2023년 12월 31일까지입니다.

QQQ와 SCHD를 분산해서 투자했을 시 백테스트 결과

 

 

위의 그래프를 보면 변동성은 SCHD가 확실히 적어보이네요. 그런데 수익률이 높은 기간에서는 기울기가 완만해서 수익의 효과는 누리지 못하는 것을 확인할 수 있습니다.

 

구  분 QQQ SCHD QQQ+SCHD(5:5)
CAGR 17.8% 12.2% 8.7%
MDD -35.1% -33.4% -29.9%
최종 수익률 740% 348% 172%

 

적립식 투자와 비교했을때 수익률은 확실히 올라갔습니다.

 

구  분 QQQ+SCHD(5:5) SCHD 매월 적립식 투자
CAGR 8.7% 8.2%
(추가투입금 고려시 50.8%)
MDD -29.9% -32.8%
총 수익률 172% 177%

 

매월 분할해서 SCHD만 매수하는 것보다 QQQ와 SCHD를 일정비율로 리밸런싱 하면서 투자하는 것이 수익률은 더 높이고 MDD는 낮출 수 있습니다. 그런데 차이는 크게 나지 않네요.

 

이제 비율을 다르게 해서 백테스트를 해 보겠습니다.

 

구  분(QQQ:SCHD 비율) CAGR(%) MDD(%) 총수익률(%)
1 : 9 7.0 -32.1 126
2 : 8 7.5 -33.5 137
3: 7 7.9 -30.9 149
4 : 6 78.3 -30.4 160
5 : 5 8.7 -29.9 172
6 : 4 9.1 -29.4 184
7 : 3 9.3 -28.9 197
8 : 2 9.9 -29.0 210
9 : 1 10.3 -31.2 223

 

결과가 재미있네요.

 

SCHD비율이 높을 수록 CAGR은 줄어들지만 MDD도 좋아질거라고 예상했었는데 의외의 결과가 나왔습니다.

 

QQQ : SCHD비율이 8 :2 일때 CAGR은 9.9%까지 올라가고 MDD도 -29%까지 낮아집니다. 

하지만 우리가 하나 간과한 사실이 있습니다. 

 

미국 주식은 양도소득세르 부과받습니다. 1년동안 손익통산 250만원까지는 비과세 적용이 되지만, 초과되는 이익에 대해서는 22%의 세금이 부과됩니다.

 

이 세금을 아직 반영하지 않았습니다.

 

양도소득세를 적용한 백테스트 결과는 다음 포스트에서 확인해 보도록 하겠습니다.

 

※ 백테스트는 과거의 데이터를 사용해서 수익률을 추정했기에 미래의 수익률은 보장해 줄 수는 없습니다. 백미러만 보고 운전할 수 없는 것과 같은 이치입니다. 하지만, 백미러도 보지 않고 운전하는 것 보다는 좋겠죠?

 

※ 연간 ETF운용보수는 ETF금액에 포함된 것이기에 별도로 고려하지 않았습니다.

 

 

백테스트를 진행한 코드는 아래와 같으니 참고하시기 바랍니다.

 

 

정적 자산분배 백테스트 코드

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

#투자자산
p1 = 'QQQ'
p2 = 'SCHD'

p1비율 = 0.8

def get_div(p):
    ticker1 = yf.Ticker(p)
    div = ticker1.dividends.tz_localize(None)
    return div

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

start = datetime(2005, 1, 1)
end = datetime(2023, 12, 31)

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

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

#데이터 가져오기
def get_data(p1, p2, start, end):
    df1 = pdr.get_data_yahoo(p1, start, end)
    df1.rename(columns={'Adj Close':'p1주가'}, inplace=True)

    df2 = pdr.get_data_yahoo(p2, start, end)
    df2.rename(columns={'Adj Close':'p2주가'}, inplace=True)

    df = pd.merge(df1['p1주가'], df2['p2주가'], left_index=True, right_index=True, how='inner')

    return df

# 배당데이터에 다른 데이터 넣기
def merge_div(p1, p2, start, end):
    df = get_data(p1, p2, start, end)
    div1 = get_div(p1)
    div2 = get_div(p2)
    if 배당금적용여부 == 1:
        df['배당금1'] = div1
        df['배당금2'] = div2
        df.fillna(0, inplace=True)
    else:
        df['배당금1'] = 0
        df['배당금2'] = 0
    return df

df = merge_div(p1, p2, start, end)


#월말투자금 넣기
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[['p1주식수', 'p1금액', 'p2주식수', 'p2금액', '합계', '원금누계']] = 0
for m in range(len(df)):
    if m == 0:
        df['합계'].iloc[m] = df['투자금'].iloc[m] * (1-매매수수료)
        df['p1금액'].iloc[m] = df['합계'].iloc[m] * p1비율
        df['p1주식수'].iloc[m] = df['p1금액'].iloc[m] / df['p1주가'].iloc[m]
        df['p2금액'].iloc[m] = df['합계'].iloc[m] - df['p1금액'].iloc[m]
        df['p2주식수'].iloc[m] = df['p2금액'].iloc[m] / df['p2주가'].iloc[m]
        df['원금누계'].iloc[m] = df['투자금'].iloc[m]
    else:
        df['합계'].iloc[m] = df['투자금'].iloc[m] * (1-매매수수료) + \
                           (df['p1주가'].iloc[m] * df['p1주식수'].iloc[m-1]) + (df['p2주가'].iloc[m] * df['p2주식수'].iloc[m-1])+ \
                           (df['배당금1'].iloc[m] * df['p1주식수'].iloc[m-1] + df['배당금2'].iloc[m] * df['p2주식수'].iloc[m-1]) * (1 - 배당소득세)
        # 매월 리밸런싱 할 때는 주식수가 변하지만
        if df['투자금'].iloc[m] > 0:
            df['p1금액'].iloc[m] = df['합계'].iloc[m] * p1비율
            df['p1주식수'].iloc[m] = df['p1금액'].iloc[m] / df['p1주가'].iloc[m]
            df['p2금액'].iloc[m] = df['합계'].iloc[m] - df['p1금액'].iloc[m]
            df['p2주식수'].iloc[m] = df['p2금액'].iloc[m] / df['p2주가'].iloc[m]
        # 리밸런싱을 안 하는 날에는 주식수가 고정
        else:
            df['p1주식수'].iloc[m] = df['p1주식수'].iloc[m - 1]
            df['p1금액'].iloc[m] = df['p1주식수'].iloc[m] * df['p1주가'].iloc[m]
            df['p2주식수'].iloc[m] = df['p2주식수'].iloc[m - 1]
            df['p2금액'].iloc[m] = df['p2주식수'].iloc[m] * df['p2주가'].iloc[m]
        df['원금누계'].iloc[m] = df['원금누계'].iloc[m - 1] + df['투자금'].iloc[m]

df = df[['p1주가', 'p1주식수', 'p1금액', '배당금1', 'p2주가', 'p2주식수', 'p2금액', '배당금2', '투자금', '합계', '원금누계']]

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

df.dropna(inplace=True)

#CAGR
diff = df.index[-1].year - df.index[0].year
cagr_etf1 = (df['주가백분율1'].iloc[-1] / df['주가백분율1'].iloc[0]) ** (1 / diff) - 1
cagr_etf2 = (df['주가백분율2'].iloc[-1] / df['주가백분율2'].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(ETF1) : {round(cagr_etf1, 3)} / CAGR(ETF2) : {round(cagr_etf2, 3)} / ' \
       f'CAGR(전략) : {round(cagr_전략, 3)} CAGR(실질전략) : {round(cagr_전략_실질, 3)}'
print(cagr)

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

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

print(f'{p1} 수익률 : {round(ETF1수익률,2)}')
print(f'{p2} 수익률 : {round(ETF2수익률,2)}')
print(f'전략 수익률 : {round(전략수익률,2)}')

#엑셀파일로 만들기
# df.to_excel(f'적립식투자 백테스트({p1}({round(p1비율*10,0)}) {p2}({round((1-p1비율)*10,0)}) CAGR {round(cagr_전략_실질*100,1)} '
#             f'MDD {round(mdd_전략*100,1)}).xlsx')

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

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

plt.title(f'{p1} {p2} {round(p1비율*10,0)}:{round((1-p1비율)*10,0)} Static Ratio Invest')

plt.show()
728x90
반응형

댓글