2024. 9. 22. 15:06ㆍ금융공학/모델링
배당성장주는 시간이 지남에 따라 꾸준히 배당이 성장하는 기업에 투자함으로써, 안정적인 현금 흐름과 복리 효과를 동시에 기대할 수 있는 전략입니다. 이러한 투자 방식은 특히 장기적인 수익을 목표로 하는 투자자들에게 매우 매력적입니다. 많은 투자자들은 적립식 투자 방식을 채택하여 매년 또는 매월 일정 금액을 배당성장주에 투자하고, 배당금을 재투자함으로써 복리 효과를 극대화합니다.
이 전략을 더욱 체계적으로 접근하기 위해 현대 포트폴리오 이론(MPT, Modern Portfolio Theory)을 적용할 수 있습니다. MPT는 기대 수익률과 리스크(변동성)를 고려하여 다양한 자산에 최적의 비율로 배분함으로써 위험을 최소화하면서 수익을 극대화하는 전략을 제시합니다. 배당성장주에 투자할 때 MPT를 적용하면, 투자자들은 자산 간의 상관관계를 분석하고, 배당 성장률과 변동성을 최적화하여 장기적으로 더욱 안정적이고 수익성 있는 포트폴리오를 구성할 수 있습니다.
이번 글에서는 배당성장주를 기반으로 한 적립식 투자 전략과, 이를 MPT의 관점에서 최적화하는 방법을 살펴보고, 배당 재투자가 장기적인 투자 성과에 어떻게 기여하는지에 대해 깊이 탐구해 보겠습니다.
1. 주가 가져오기 및 출력
분석 종목은 배당(성장)주와 일부 채권 ETF로 구성하였습니다.
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 티커 리스트
tickers = ['SCHD', 'SPY', 'QQQ', 'VIG', 'DGRO', 'NOBL', 'SDY', 'BND', 'BNDX', 'SCHH']
# 데이터 가져오기
data = yf.Tickers(tickers)
history = data.history(period='max')
history = history[['Dividends', 'Close']]
# 주가 데이터를 연간 데이터로 리샘플링 (연간 마지막 주가 사용)
div_data = history.Dividends
price_data = history.Close
div_data_resampled = div_data.resample('YE').sum()
div_data_resampled = div_data_resampled.replace(0, pd.NA).ffill()
div_data_resampled = div_data_resampled.dropna()
price_data_annual = price_data.resample('YE').mean()
price_data_annual = price_data_annual.replace(0, pd.NA).ffill()
price_data_annual = price_data_annual.dropna()
price_data_annual_normalized = price_data_annual.div(price_data_annual.iloc[0])
price_data_annual_normalized.plot()

2. 배당 수익률과 누적 배당 성장률
배당 수익률과 누적 배당 성장률이 어떻게 변화했는지, 그리고 이를 통해 각 ETF가 투자자에게 어떤 가치를 제공하는지 분석할 수 있습니다. 연간 배당 수익률은 투자자들이 매년 받은 배당금의 비율을 나타내고, 누적 배당 성장률은 시간이 지나면서 배당이 얼마나 증가했는지를 보여줍니다.
# 배당 수익률 계산 (배당금 / 주가)
div_yield_annual = div_data_resampled.div(price_data_annual) * 100 # 퍼센트로 변환
# 배당 성장률 계산
div_growth_annual = div_data_resampled.pct_change() * 100
# 첫 해의 배당 가치를 1로 설정
initial_div_value = pd.Series(1, index=div_growth_annual_trimmed.columns)
# 배당 성장률을 반영한 누적 배당 가치 계산 (첫 해 배당 가치를 1로 설정한 상태에서 변동 반영)
cumulative_div_value = (1 + div_growth_annual_trimmed / 100).cumprod() # 성장률을 누적하여 반영
adjusted_div_value = cumulative_div_value.multiply(initial_div_value, axis=1)
# 모든 티커가 첫 해 배당 가치를 1로 시작하게 정규화
adjusted_div_value_normalized = adjusted_div_value.div(adjusted_div_value.iloc[0])
# 연간 배당 수익률 플롯
plt.figure(figsize=(10, 6))
div_yield_annual.plot()
plt.title("Annual Dividend Yield Over Time (%)")
plt.ylabel("Dividend Yield (%)")
plt.xlabel("Year")
plt.legend(div_yield_annual.columns, title="Tickers")
plt.grid(True)
plt.show()
# 누적 배당 성장률 플롯
plt.figure(figsize=(10, 6))
adjusted_div_value_normalized.plot()
plt.title("Cumulative Dividend Growth Over Time (Starting Value = 1)")
plt.ylabel("Dividend Growth (Relative Value)")
plt.xlabel("Year")
plt.legend(adjusted_div_value_normalized.columns, title="Tickers")
plt.grid(True)
plt.show()

연간 배당 수익률과 누적 배당 성장률 데이터에서 가장 눈에 띄는 변화 중 하나는 DGRO와 SCHD의 꾸준한 배당 성장이었습니다. 특히, DGRO는 2015년 이후 지속적으로 높은 배당 성장을 기록하며 2023년에 두 배 이상의 배당 성장률을 보였습니다. 이는 장기적으로 배당 성장이 중요한 투자자에게 큰 가치를 제공할 수 있음을 시사합니다. SCHD 역시 배당 성장주 ETF로서 기대에 부응하며 꾸준한 배당 성장을 보여줍니다. 반면, BND와 같은 채권 중심의 ETF는 상대적으로 낮은 배당 수익률을 보여, 주식형 배당 성장 ETF와 차별화된 성격을 띠고 있습니다.
3. 적립식 투자 성과 비교
- 배당 재투자 전략: 매년 $12,000씩 투자하고, 배당금을 함께 재투자하는 전략.
- 적금 방식: 매년 $12,000씩 적금하면서, 3%의 복리 이자를 함께 재투자하는 전략.
# 연간 투자 금액
annual_investment = 12000
# 각 자산에 대한 총 자산 리스트 (연도별)
total_asset_values = {}
# 각 티커별 자산 가치 계산
for ticker in tickers:
# 첫해 시작 시 초기 자산 (첫해는 투자 금액만큼만 투자)
num_shares = annual_investment / price_data_annual[ticker].iloc[0] # 첫해 주식 수
portfolio_value = num_shares * price_data_annual[ticker].iloc[0] # 첫해 자산 가치
total_asset_value = [portfolio_value] # 첫해 자산 가치를 리스트에 저장
# 매년 투자 및 배당금 재투자
for year in range(1, len(price_data_annual.index)):
# 배당금 계산 및 재투자 (지난 해 배당금 수익률 기반)
dividends_received = num_shares * div_data_resampled[ticker].iloc[year - 1] # 배당금 수익
num_shares += dividends_received / price_data_annual[ticker].iloc[year] # 배당금으로 주식 추가 매수
# 매년 새로운 투자 금액으로 주식 매수
num_shares += annual_investment / price_data_annual[ticker].iloc[year]
# 현재 주식 수에 기반한 자산 가치 계산
portfolio_value = num_shares * price_data_annual[ticker].iloc[year]
# 총 자산 가치 저장
total_asset_value.append(portfolio_value)
# 해당 티커에 대한 총 자산 가치를 딕셔너리에 저장
total_asset_values[ticker] = total_asset_value
total_asset_value_df = pd.DataFrame(total_asset_values, index=price_data_annual.index)
# 추가 : 적금 (3% 복리 적용)
savings_values = []
initial_savings = 0
for year in range(len(price_data_annual.index)):
if year == 0:
savings = annual_investment
else:
savings = (savings_values[-1] + annual_investment) * 1.03 # 3% 복리 적용
savings_values.append(savings)
savings_df = pd.Series(savings_values, index=price_data_annual.index)
# 배당 재투자, 단순 바이앤홀드, 적금 방식을 그리기
plt.figure(figsize=(12, 8))
for ticker in tickers:
plt.plot(total_asset_value_df.index, total_asset_value_df[ticker], linestyle='-', alpha=0.8, label=f"{ticker}")
savings_df.plot(ax=plt.gca(), color='green', linestyle='-.', linewidth=2, label="Savings Account (3% CI)")
plt.title("Comparison of Total Asset Value Over Time")
plt.ylabel("Total Asset Value ($)")
plt.xlabel("Year")
plt.grid(True)
plt.legend(title="Strategy", loc='upper left')
plt.tight_layout()
plt.show()

위 데이터는 배당금 재투자와 배당금 미재투자(단순 바이앤홀드) 두 가지 시나리오에서 누적 자산 가치의 차이를 보여주고 있습니다. 특히, SDY는 22.08%, SCHD는 23.09% 증가하며, 배당금 재투자 전략이 자산 가치를 크게 향상시켰음을 확인할 수 있습니다. 반면, 기술주 중심의 QQQ는 배당 재투자 효과가 상대적으로 미미하여 4.57%의 자산 가치 증가에 그쳤습니다.
이 결과는 배당금을 재투자하는 경우, 배당성장주에 투자하는 것이 기술주에 투자하는 것만큼이나 높은 가치가 있을 수 있음을 시사합니다. 배당성장주는 주가 상승 외에도 꾸준한 배당금 성장을 통해 추가적인 현금 흐름을 제공하고, 이를 재투자할 경우 복리 효과가 극대화됩니다. 장기적인 자산 증식 측면에서 볼 때, 배당성장주에 대한 투자는 주가 상승률에 의존하는 기술주와 비교해도 안정성과 수익성을 동시에 제공하는 중요한 전략으로 평가될 수 있습니다.
위에서 언급한 배당성장주에 대한 배당금 재투자 전략은 장기적 자산 증식에 있어서 강력한 효과를 발휘합니다. 추가로, 이를 현대 포트폴리오 이론(MPT)을 적용하여 최적화하면 더 나은 결과를 얻을 수 있습니다. MPT는 수익률과 리스크(변동성)를 동시에 고려하여 자산을 배분함으로써, 최소한의 위험으로 최대의 수익을 달성하는 포트폴리오 구성을 가능하게 합니다.
4. 배당 성장률 기반 MPT 시뮬레이션
배당성장주에 투자하는 전략은 주식을 판매하지 않고 배당 수익을 통해 현금 흐름을 창출하는 것을 목표로 합니다. 이 방식은 주식의 자본 이득에 의존하지 않고, 배당금의 지속적인 성장을 통해 수익을 극대화하기 때문에, 포트폴리오 분석 시 배당 성장률을 기반으로 접근하는 것이 더 합리적입니다. 주식을 매도하지 않고도 배당을 통해 꾸준한 현금 흐름을 확보할 수 있다는 점에서, 주가 변동에 의존하는 전통적인 MPT 분석보다 배당 성장률을 활용한 MPT 분석이 장기 투자자들에게 더욱 적합한 전략이 됩니다.
아래 코드는 배당 성장률을 기준으로 포트폴리오 최적화를 시도하는 방법을 보여줍니다. 코드의 핵심은 무작위 가중치를 사용하여 10,000번의 포트폴리오 시뮬레이션을 수행하고, 각 포트폴리오의 기대 수익(배당 성장률)과 변동성(배당 성장률 변동성)을 계산하는 것입니다. 그 후, 샤프 비율을 기준으로 가장 높은 성과를 낸 포트폴리오를 찾고, 이를 시각화합니다.
# Returns based on dividend value growth
rets = adjusted_div_value_normalized.pct_change().fillna(0)
# Expected Returns (based on dividend value growth)
er = rets.mean()
# Co-Variance (based on dividend value growth)
cov = rets.cov()
# Portfolio Simulation
# Empty Returns List
p_returns = []
# Empty Volatility List
p_volatility = []
# Empty Weights List
p_weights = []
# Number of Assets
number_of_asset = len(adjusted_div_value_normalized.columns) # 컬럼명을 사용하여 자산 수 결정
# Simulations
simulations = 10000
for i in range(simulations):
# Random Weights
weights = np.random.random(number_of_asset)
weights /= np.sum(weights)
# Portfolio Returns and Volatility
ret = np.dot(weights, er) # 기대 수익
vol = np.sqrt(np.dot(weights.T, np.dot(cov, weights))) # 변동성
# Store Results
p_returns.append(ret)
p_volatility.append(vol)
p_weights.append(weights)
# Convert to Numpy Arrays
prets = np.array(p_returns)
pvols = np.array(p_volatility)
pweights = np.array(p_weights)
# 최대 샤프 비율 인덱스
max_sharpe_idx = np.argmax(prets / pvols)
max_sharpe_return = prets[max_sharpe_idx]
max_sharpe_volatility = pvols[max_sharpe_idx]
# Visualize the scatter plot
plt.figure(figsize=(10, 6))
plt.scatter(x=pvols, y=prets, c=prets/pvols, marker='o', cmap='viridis')
plt.colorbar(label='Sharpe Ratio')
plt.axhline(y=max_sharpe_return, color='red', linestyle='--', label=f'Max Sharpe Return: {max_sharpe_return:.2%}')
plt.axvline(x=max_sharpe_volatility, color='blue', linestyle='--', label=f'Max Sharpe Volatility: {max_sharpe_volatility:.2%}')
plt.xlabel('Expected Dividend Volatility')
plt.ylabel('Expected Dividend Growth')
plt.title('Portfolio Optimization based on Dividend Growth')
plt.grid(True)
plt.show()
max_sharpe_idx = np.argmax(prets / pvols) # 최대 샤프 비율 인덱스
optimal_weights = pweights[max_sharpe_idx]
labels = adjusted_div_value_normalized.columns
sizes = optimal_weights * 100 # 퍼센트로 변환
explode = [0.05] * len(labels) # 파이 조각을 조금씩 띄워서 표시
# 파이 차트 그리기
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title("Optimal Weights for Highest Dividend Growth")
plt.axis('equal') # 파이 차트가 원형으로 유지되도록 함
plt.show()


이 결과는 배당 성장률을 최대화하고 변동성을 최소화하여 샤프 비율을 극대화한 포트폴리오의 최적 자산 배분 비율을 보여줍니다. 각 ETF에 할당된 비율을 통해 투자자들이 위험 대비 수익률을 극대화할 수 있는 방향성을 제시합니다.
5. 결론
배당성장주에 적립식 투자와 배당 재투자 전략을 결합한 방식은 수익성과 안정성을 동시에 추구할 수 있는 견조한 투자법임을 보여줍니다. 이 전략은 배당금을 꾸준히 재투자하여 복리 효과를 극대화하고, 장기적으로 안정적인 현금 흐름을 확보할 수 있다는 장점이 있습니다. 비록 간단한 실습을 통해 설명했지만, MPT(현대 포트폴리오 이론)를 활용하여 이 전략을 최적화하는 방법 또한 탐구할 수 있었습니다.
특히, 위 코드는 티커 목록만 변경하면 다양한 자산으로 여러분만의 포트폴리오를 구성하고, 그 성과를 분석할 수 있습니다. 이를 통해 배당 성장주를 중심으로 한 투자 전략을 최적화하고, 개인화된 포트폴리오를 구축하여 장기적인 투자 성과를 더욱 강화할 수 있을 것으로 기대합니다.
'금융공학 > 모델링' 카테고리의 다른 글
| [Quant] 팩터와 알파 (0) | 2024.11.13 |
|---|---|
| CAPM, Fama-French 다중 팩터 모델과 오늘날 퀀트 (5) | 2024.11.12 |
| [Quant] 퀀트 투자 용어 (1) (3) | 2024.10.22 |
| [MPT] 분산 투자 종목 찾기 (0) | 2024.09.24 |