見出し画像

老後に備える/FIRE実現         4%取り崩しの成否について考える

サブテーマ:PYTHON で取り崩しシミュレーション 


1 初めに

 今回は、出口戦略を検討するため、巷で言われている4%取り崩しを自分なりに解釈して、4%という数字は達成可能かどうか検証します。
 皆様は、老後いくら必要か考えたことはありますか?そもそもどれぐらい貯めれば良いのかを判断する上で、今回の結果は一つの参考になりますし、自分なりの銘柄、期間でのシミュレーションも可能になりますので、ぜひお付き合いください。

今回の結論:初期元本に対し4%分の定額取り崩し(確率95%以上)
   S &P500  ⭕️:達成可能
   米国債券  ❌:30年後
 例)元本5000万円→年200万円、元本1億円→年400万円 

S&P500(SPY),米国債権(AGG)

知人よりプログラム部分が難しくてよくわからないとご指摘をいただきました。そのためこのチャンネルでは、PYTHONを使った米国株投資に関わるさまざまな調査の結果OUTPUTにこだわった記事にします。投資に関わる身近な疑問にも答えていきますので、投資リテラシー向上にお役立ちを目指します!!
 なお、全ての解析データは引き続き、PYTHONを活用してコード全文も掲載します。Googleコラボならまずは”コピペ”でチャレンジできます。これから勉強始めたい方にも、プログラミングで何ができるのかを知る良いチャンスとなればと思っていますので応援お願いします!!


2 豆知識

1)出口戦略とは

 出口戦略とは、投資した資産をいつ、どのようにして現金化または再配置するかという計画のことです。具体的には、リスクを管理しながら最適なタイミングで資産を売却し、必要な現金を確保する方法を指します。老後の資金計画においては、定年後の生活費や医療費などの出費をカバーするために、これらの資産からの収益を計画的に引き出す必要があります。

2)4%ルールとは

 4%ルールは、退職後の資産取り崩し戦略に関する一般的なガイドラインです。このルールによると、退職初年度に投資ポートフォリオの総額の4%、例えば、投資資産が1000万円の場合、年に40万円を引き出します。以後、インフレを考慮した上で、資産額の4%を取り崩していくことで、長期的に資産を枯渇させずに済むよう設計されており、多くの退職計画者にとって退職生活をサポートするための基準とされています。
 なお今回のシミュレーションでは、定率売却ではなく、定額売却でのシミュレーションとしています。その理由は、運用がうまくいけば4%では取り崩す額が必要な額以上となること、逆に運用が不調の場合では、必要な額に足りず、老後やFIRE設計においては不向きと判断いたしました。

3 実践

1)調査内容

 今回、元本5000万円に対する4%→年200万円(月16.6万円)を定額で取り崩した場合想定します。対象はS&P 500ETFであるSPYと、米国債権ETFであるAGGです。過去の実績は過去20年間のリターンとリスク(標準偏差)を用いて、モンテカルロシミュレーションによる時系列グラフを描き、上下5%をのぞいた、90%の確率範囲を時系列グラフで表示します。

2)リスクとリターンの算出

いつものようにYahoo Financeから過去20年分の株価データを取得し、月毎のデータに変換しリターンとリスク(標準偏差)を計算します。

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語表示に対応

# 対象のティッカーシンボル
tickers = [ 'SPY', 'AGG']

# データの取得
data = yf.download(tickers, start="2004-04-01", end=pd.Timestamp.now().strftime('%Y-%m-%d'))
# 必要な列のみ抽出
data = data['Adj Close']

# 月次リターンを計算
monthly_returns = data.resample('M').ffill().pct_change().mean()
# 月次リターンの標準偏差を計算
monthly_std_devs = data.resample('M').ffill().pct_change().std()

次に、このリターンとリスク(標準偏差)を使って、1000回のモンテカルロシミュレーションを実施します。
今回は、退職時にお金がなくなるのが問題ですので、上下5%を除いたエリアを表示させます。これは悪い方だけ見れば95%以上の確率とも言えます。
*5%の失敗リスクも取りたくないという方はぜひ、確率範囲を変更してコードを実行してみてください。

# パラメータ設定
initial_investment = 5000  # 初期投資額(5000万円)
withdrawal_amount = 16.7  # 月次取り崩し額(16.7万円)
investment_duration = 360  # 投資期間(月)
simulations = 1000  # シミュレーション回数

# 時系列データを格納するためのDataFrameを初期化
time_series_data = pd.DataFrame(index=range(investment_duration))

# グラフの描画(縦に配置)
fig, axes = plt.subplots(len(tickers), 1, figsize=(14, 5 * len(tickers)), sharex=False)  # 各ティッカーごとにサブプロットを作成

for i, ticker in enumerate(tickers):
    monthly_values_all_simulations = []
    for simulation in range(simulations):
        monthly_values = []
        total_value = initial_investment
        for month in range(investment_duration):
            monthly_return = np.random.normal(monthly_returns[ticker], monthly_std_devs[ticker])
            total_value = total_value * (1 + monthly_return) - withdrawal_amount
            monthly_values.append(max(total_value, 0))

        monthly_values_all_simulations.append(monthly_values)

    # Q1、中央値、Q3の計算
    median_values = np.median(monthly_values_all_simulations, axis=0)
    q1_values = np.percentile(monthly_values_all_simulations, 5, axis=0)
    q3_values = np.percentile(monthly_values_all_simulations, 95, axis=0)

    # サブプロットにプロット
    ax = axes[i]
    ax.plot(time_series_data.index, median_values, label=f'{ticker} 中央値')
    ax.fill_between(time_series_data.index, q1_values, q3_values, alpha=0.15)
    ax.set_ylim(0, initial_investment * 5)  # Y軸の範囲を設定
    ax.set_title(f'{ticker}')
    ax.set_ylabel('資産額')
    ax.legend()
    ax.grid(True)

# X軸のラベルは最下部のサブプロットのみに表示
axes[-1].set_xlabel('月')

plt.tight_layout()
plt.show()
S&P500(SPY),米国債権(AGG)

このコードを実行すると、S &P500(SPY)は、200ヶ月以降元本割れの確率が減り、4%取り崩しによる資金の枯渇は回避できる結果となりました。米国債権では30年後に元本割れとなり、リスクを控えた商品を選択したとしても資金枯渇があり得ることが確認できました。

補足)そもそも5000万円貯めるには?のシミュレーション

 5000万円あればS &P500に投資しておき取り崩せば4%分受け取り続けられることは分かりましたが、まずその5000万円をどう貯めるのかが課題だと思います。そこで、シミュレーションできるコードを用意しました。前回以前の記事の内容に、目標額(Goal_Value)を入れ、シミュレーション値のQ 1,中央値,Q3との交点にマークを表示するようにしました。
 見方としては、Q3点調子非常に良ければこの期間で目標金額へ到達。逆に調子が悪ければQ 1点ぐらいの期間は覚悟しておかなければならない点となります。
 なお、Q 1,Q3点をそれぞれ25%、75%としてますので、過去の統計上この範囲で目標額に到達するのでは?という範囲になってます。こちらもコピペで実行可能ですので、ぜひ金額や確率範囲を変えてシミュレーションしてみてください。

# パラメータ設定
initial_investment = 1000  # 初期投資額
monthly_investment = 10  # 月次積立額
investment_duration = 540  # 投資期間(月)
simulations = 1000  # シミュレーション回数
goal_value = 5000

# 時系列データを格納するためのDataFrameを初期化
time_series_data = pd.DataFrame(index=range(investment_duration))

# 積立投資額を考慮した投資額の計算
total_investments = [initial_investment + monthly_investment * month for month in range(investment_duration)]

for ticker in tickers:
    monthly_values_all_simulations = []

    for simulation in range(simulations):
        monthly_values = []
        total_value = initial_investment
        for month in range(investment_duration):
            monthly_return = np.random.normal(monthly_returns[ticker].mean(), monthly_std_devs[ticker])
            total_value += monthly_investment
            total_value = total_value * (1 + monthly_return)
            monthly_values.append(total_value)

        monthly_values_all_simulations.append(monthly_values)

    # Q1、中央値、Q3の計算
    median_values = np.median(monthly_values_all_simulations, axis=0)
    q1_values = np.percentile(monthly_values_all_simulations, 25, axis=0)
    q3_values = np.percentile(monthly_values_all_simulations, 75, axis=0)

    time_series_data[f'{ticker} 中央値'] = median_values
    time_series_data[f'{ticker} Q1'] = q1_values
    time_series_data[f'{ticker} Q3'] = q3_values

# グラフの描画
plt.figure(figsize=(14, 7))
for ticker in tickers:
    plt.plot(time_series_data.index, time_series_data[f'{ticker} 中央値'], label=f'{ticker} 中央値')
    plt.fill_between(time_series_data.index, time_series_data[f'{ticker} Q1'], time_series_data[f'{ticker} Q3'], alpha=0.05)
    # 交点の計算とプロット
    for stat, color in zip(['Q1', '中央値', 'Q3'], ['blue', 'green', 'red']):
        cross_points = np.where(time_series_data[f'{ticker} {stat}'] >= goal_value)[0]
        if len(cross_points) > 0:
            first_cross = cross_points[0]
            plt.plot(first_cross, goal_value, 'o', color=color, label=f'{ticker} {stat} 到達点')

# 目標値の直線の追加
plt.axhline(y=goal_value, color='r', linestyle='--', label='目標資産額')

# 積立投資額を考慮した投資額の線
plt.plot(time_series_data.index, total_investments, color='k', linestyle='--', label='投資元本')
plt.ylim(0, max(total_investments) * 5)
plt.title('投資期間中の資産額の中央値、Q1、Q3と積立投資額の推移')
plt.xlabel('月')
plt.ylabel('資産額')
plt.legend()
plt.grid(True)
plt.show()
投資期間のシミュレーション

4)考察

 同じコードで、NASDAQ100(QQQ)、VYM(米国株高配当ETF)を実行した結果が下記です。S&P500に対してリスクもリターンも高いQQQでは元本割れリスクが減っています。逆にハイテク株が少なく安定銘柄多いVYMでは元本割れリスクが増えてます。米国債券AGGとも同様ですが、4%取り崩しを実現させるには、またそれ以上の取り崩しを検討するなら、ある程度の割合をリスク覚悟でリターンの狙える銘柄選定が必要であることがわかりました。皆様の投資の参考になれば幸いです。

年200万円(月16.7万円) SPY(S &P500)& QQQ(NASDAQ100)
年200万円(月16.7万円) VYM(バンガード高配当ETF)

さらに、S &P500、QQQにおいて年240万円 月20万円に増やした場合です。この場合においてもやや元本割れ期間が長いものの、どちらも資産が枯渇することがないことがわかります。

年240万円(月20万円) SPY &QQQ

4 まとめ

 今回、出口戦略を考えるため、一般的な4%という数字にこだわった取り崩しシミュレーションを実施してみました。私自身、4%という数字を統計的に感じられましたし、自身の出口戦略にもこの4%の数字は一つの目安にすべき判断できました。
 皆様におかれましても、今回の記事がご自身の投資生活に少しでも役に立ったと思っていただければ幸いです。

*今回の結果は、過去20年の実績をもとにシミュレーションした結果です。今後の結果を保証するものではありません。実際の投資判断はご自身にてお願いいたします。


以下、過去記事、AI時系列予測等のご紹介
他サイトですがココならで、A I(LSTM)を使った株価予測の販売もやってます。こちらではFREDから、失業率や2年10年金利、銅価格等結果も取得しLSTMモデルで予測するコードとなってますので興味があれば見てみてください。またその他2件も米国株投資とは直接関係はありませんがプログラム入門におすすめですのでみてみてください。



チャンネル紹介:Kota@Python&米国株投資チャンネル

過去の掲載記事:興味があればぜひ読んでください。
グラフ化集計の基礎:S &P500と金や米国債を比較してます。

移動平均を使った時系列予測



この記事が気に入ったらサポートをしてみませんか?