K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

配当再投資で総リターンをシミュレーションする

05.1.14

配当再投資で総リターンをシミュレーションする

最終更新 2020-07-29 読了時間 4 分
まとめ
配当再投資は、受け取った配当で同じ株を買い増し、増えた株からさらに配当を受け取ることで複利を働かせる運用方法です。このページでは 2015 年から 9 年分(108 か月)の擬似株価と年率 1.5〜2.5% の配当利回りを numpy で作り、「配当を現金のまま積み上げる」シナリオと「毎月 cash / price 株を買い増す」シナリオの評価額を pandas で並べて描きます。差は最終評価額の上乗せ率、年平均成長率 CAGR、最大ドローダウンの 3 つの数値で確かめ、再投資が収益だけでなく下落時の値幅も大きくすることまで見ます。読み終えると、for ループ 6 行の再投資計算を実データの配当履歴に差し替えて自分の銘柄で試せるようになります。
動画で見る:pythonで米国株の配当履歴を可視化する方法(K_DM チャンネル)

直感 #

株価 100 の株を 1 株持ち、毎月 0.17(年率 2% の 12 分の 1)の配当を受け取るとします。現金で持てば 9 年で配当は約 18 積み上がり、評価額は「株価 + 18」です。再投資すると 1 か月目の配当で 0.0017 株を買い、2 か月目はその分の配当も入り、108 か月後には株数が 1.2 株前後に増えています。株価が 100 から 150 に上がる局面ではこの 1.2 株が値上がり益を大きくし、下がる局面では損失も 1.2 倍にします。差は期間が長いほど開くので、ここでは 9 年という中期で 2 本の線がどれだけ離れるかを数値で確認します。

擬似データの生成 #

実際の配当履歴ではなく、答えの分かる人工データで比べます。株価は月次リターンが平均 0.5%・標準偏差 4% の正規乱数を累積した幾何ブラウン運動、配当利回りは年率 1.5〜2.5% の一様乱数です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

np.random.seed(21)
plt.style.use("scripts/k_dm.mplstyle")

dates = pd.date_range("2015-01-01", periods=9 * 12, freq="M")
price = 100 * np.exp(np.cumsum(np.random.normal(0.005, 0.04, len(dates))))
dividend_yield = np.random.uniform(0.015, 0.025, len(dates))  # 年率1.5〜2.5%

frame = pd.DataFrame({"price": price, "dividend_yield": dividend_yield}, index=dates)
frame["dividend_cash"] = frame["price"] * frame["dividend_yield"] / 12

シナリオ 1:配当を現金のまま保持 #

配当は受け取るが再投資せず、株式 1 株の評価額に累積した配当金を足して評価します。

1
2
cash_hold = frame["dividend_cash"].cumsum()
total_value_cash = frame["price"] + cash_hold

シナリオ 2:配当を即座に再投資 #

受け取った配当 dividend_cash をその月の price で割った株数だけ買い増し、保有株数 shares を増やしていきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
shares = 1.0
cash = 0.0
portfolio_value = []

for price, dividend in zip(frame["price"], frame["dividend_cash"]):
    cash += dividend
    additional_shares = cash / price
    shares += additional_shares
    cash = 0.0
    portfolio_value.append(shares * price)

total_value_reinvest = pd.Series(portfolio_value, index=frame.index)

結果を比較 #

2 本の評価額を 1 つの DataFrame にまとめて折れ線で重ねます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
comparison = pd.DataFrame(
    {
        "現金保持": total_value_cash,
        "再投資": total_value_reinvest,
    }
)

fig, ax = plt.subplots(figsize=(9, 4.2))
comparison.plot(ax=ax)
ax.set_title("配当再投資シミュレーション(擬似データ)")
ax.set_ylabel("評価額(基準=100)")
ax.grid(alpha=0.3)

output = Path("static/images/finance/main/dividend_reinvestment.svg")
output.parent.mkdir(parents=True, exist_ok=True)
fig.tight_layout()
fig.savefig(output)

配当再投資シミュレーション結果

実行結果の読み方 #

2 本の線は最初の数年はほぼ重なり、株価が上昇する後半で「再投資」が上に離れていきます。離れ方は一定ではなく、株価が下がる月には再投資の線のほうが大きく落ちるため、2 本の差が一時的に縮まる場面もあります。株数が 1 株から 1.2 株前後に増えたことで値動きの絶対額が大きくなるためで、次の CAGR と最大ドローダウンで数値として確かめます。


再投資による追加リターンの内訳 #

108 か月目の評価額 iloc[-1] を比べ、再投資がどれだけ上乗せになったかを金額と比率で出します。

1
2
3
4
5
6
7
final_cash = total_value_cash.iloc[-1]
final_reinvest = total_value_reinvest.iloc[-1]
reinvest_bonus = final_reinvest - final_cash

print(f"現金保持の最終評価額:  {final_cash:.1f}")
print(f"再投資の最終評価額:    {final_reinvest:.1f}")
print(f"再投資による上乗せ:    {reinvest_bonus:.1f} ({reinvest_bonus/final_cash*100:.1f}%)")

CAGR(年平均成長率)の比較 #

期間が違う投資を比べるには、最終評価額を「毎年何 % で増えたことになるか」に換算した CAGR(Compound Annual Growth Rate)を使います。

1
2
3
4
5
6
7
8
years = len(dates) / 12

cagr_cash = (total_value_cash.iloc[-1] / 100) ** (1 / years) - 1
cagr_reinvest = (total_value_reinvest.iloc[-1] / 100) ** (1 / years) - 1

print(f"CAGR(現金保持): {cagr_cash:.2%}")
print(f"CAGR(再投資):   {cagr_reinvest:.2%}")
print(f"差分:             {cagr_reinvest - cagr_cash:.2%}")

最大ドローダウンの比較 #

再投資シナリオは株数が増えるため、下落局面では評価額の減少幅も大きくなります。過去の最高値からの最大下落率(最大ドローダウン)で、リターンの裏側のリスクを確認します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def max_drawdown(series: pd.Series) -> float:
    cummax = series.cummax()
    drawdown = (series - cummax) / cummax
    return drawdown.min()

mdd_cash = max_drawdown(total_value_cash)
mdd_reinvest = max_drawdown(total_value_reinvest)

print(f"最大ドローダウン(現金保持): {mdd_cash:.2%}")
print(f"最大ドローダウン(再投資):   {mdd_reinvest:.2%}")

実務に向けて #

実際のデータを使うときは、配当落ち日と支払日がずれるので、再投資のタイミングを支払日に合わせます。海外株では源泉徴収税と為替が効くため、税引後の配当金を dividend_cash に入れてネットの総リターンで比べるほうが現実に近づきます。ポートフォリオ全体では、銘柄ごとに毎月再投資するのか、一定金額が貯まった時点でまとめて買うのかといった運用ルールを先に決めてから検証します。DRIP(配当再投資プラン)を提供する証券会社なら手数料無料で自動再投資できるので、手数料を cash -= fee として組み込むかどうかも実装コストの違いとして考慮に入れてください。

まとめ #

配当再投資のシミュレーションは、月次配当 price × yield / 12 を現金で積む cumsum() と、cash / price 株を買い増す for ループの 2 本の評価額を比べるだけで実装できます。乱数の種 21 の擬似データでは、再投資が最終評価額を数 % 上乗せし、CAGR では 0.5% 前後の差、最大ドローダウンでは再投資のほうが数ポイント深いという結果になりました。再投資は収益と値動きの両方を増幅する運用であることが 3 つの数値から読め、実データでは税引後配当と支払日を反映してから同じ比較を行います。