見出し画像

FIRE 取崩失敗確率を可視化する

サブテーマ:取崩できる金額をシミュレーション


1 初めに

 今回は、FIRE・老後の生活をイメージし今の資産を、月々〇万円取り崩したとき、元本がどの確率でのこりそうかをシミュレーションしてみます。
PYTHONであればいろいろな条件がシミュレーションできますので、ぜひみてみてください。

今回のまとめ:
資産7000万円を月々10~50万円取り崩した10年後の資産額
緑中央値~黄色点線下位5%の人
 →ほとんどの人は月々50万円取り崩しても余裕で生きていける
  しかし、4人に1人~20人に1人ぐらいの確率で元本割れ


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


2 豆知識

1)モンテカルロシミュレーションとは(おさらい)

モンテカルロシミュレーションとは、確率論と統計学に基づく計算手法で、不確実性を含む複雑な問題を解決するために使用されています。この方法は、ランダムな数値を用いてシミュレーションを多数回繰り返し、結果の分布を観察することで、問題の解答や予測を導きます。例えば、金融リスクの評価、製品開発の成功率予測、在庫管理の最適化など、幅広い分野で利用されます。ここでは、実際の値動きの年率のリターンとリスク(標準偏差)をつかって現実の状況をモデル化し、100~1000回のシミュレーションを行うことで、確率的な予測を導くことができます。

3 実践

1)実施内容

 今回以前の記事の通り、YahooFinaceから過去20年分の株価実績値を取得し、年率リターンと年率リスク(標準偏差)を算出します。
 今回は、対象をS&P500としてSPY、NASDAQ100としてQQQ、全世界株(オルカン相当)としてVT、比較として米国債券TLT,IEF・金GLDを取得しています。なおこの期間のベストポートフォリオ(算出コードは以前の記事を参照ください)QQQ60%、TLT10%、金30%のオリジナルポートフォリオの4つを選択しています。
 対象:SPY S&P500
    QQQ NASDAQ100(ハイテク大型)
    VT  オルカン相当
    PORT 過去ベストポートフォリオ
今回のシミュレーションでの初期額は7000万円としています。これは1億円ためてFIREしようとしても、実際リスク資産(株や債券)に回すお金はこのぐらいで、残り3000万円は現金としてや、今すぐ使えないお金だったりする可能性を考慮してみました。
その初期元本を10~50万円を月々取り崩して10年後を各500回シミュレーションし残りの資産額をグラフで出力します。

2)実践 

実際にモンテカルロシミュレーションしますが、コード自体は今までと変わりません。(初期投資額や運用期間、投資商品を変えた場合等は、それぞれのパラメーターをいじって実行すると簡単に実行できますので、ぜひトライしてみてください。)

# 必要なライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
initial_investment = 7000  # 初期投資額(万円)
monthly_investment = 0  # 月次積立額(万円)
investment_duration = 120  # 投資期間(月)
withdrawal_start_month = 0  # 取崩開始月(月数)
simulations = 500  # シミュレーション回数
withdrawal_amounts = range(10, 50, 1)  # 月次取り崩し額(万円) 10万円から50万円まで1万円刻み

# tickersリストを定義
tickers = ['SPY', 'QQQ', 'VT', 'Port']

# 年次リターンと年次標準偏差(手動設定)120
annual_returns = {'SPY': 0.127, 'QQQ': 0.172, 'VT': 0.100, 'Port': 0.131}
annual_std_devs = {'SPY': 0.179, 'QQQ': 0.211, 'VT': 0.179, 'Port': 0.157}

# 年次リターンと年次標準偏差を月次リターンへ変換
monthly_returns = {ticker: (1 + annual_returns[ticker])**(1/12) - 1 for ticker in tickers}
monthly_std_devs = {ticker: annual_std_devs[ticker] / np.sqrt(12) for ticker in tickers}

# 各取り崩し額に対する結果を保存する辞書
results = {ticker: {'median': [], 'percentile_5': [], 'percentile_10': [], 'percentile_20': []} for ticker in tickers}

for ticker in tickers:
    monthly_return_mean = monthly_returns[ticker]
    monthly_return_std = monthly_std_devs[ticker]

    for withdrawal_amount in withdrawal_amounts:
        # この配列に各シミュレーションの最終資産額を保存
        final_values = np.zeros(simulations)

        for simulation in range(simulations):
            total_value = initial_investment
            for month in range(investment_duration):
                monthly_return = np.random.normal(monthly_return_mean, monthly_return_std)
                if month < withdrawal_start_month:
                    # 資産形成期
                    total_value = total_value * (1 + monthly_return) + monthly_investment
                else:
                    # 取崩し期
                    total_value = total_value * (1 + monthly_return) - withdrawal_amount
                if total_value <= 0:
                    total_value = 0
                    break
            final_values[simulation] = total_value

        # 中央値、下5%、下10%、下20%の最終資産額を計算して保存
        results[ticker]['median'].append(np.median(final_values))
        results[ticker]['percentile_5'].append(np.percentile(final_values, 5))
        results[ticker]['percentile_10'].append(np.percentile(final_values, 10))
        results[ticker]['percentile_20'].append(np.percentile(final_values, 20))

# 結果をプロット
fig, axes = plt.subplots(nrows=len(tickers), ncols=1, figsize=(10, 4 * len(tickers)))
axes = axes.flatten() if len(tickers) > 1 else [axes]

# 統一されたY軸レンジ
y_min, y_max = 0, 20000  # 適切なレンジを設定

for i, ticker in enumerate(tickers):
    ax = axes[i]

    ax.plot(withdrawal_amounts, results[ticker]['median'], label='中央値', color='green')
    ax.plot(withdrawal_amounts, results[ticker]['percentile_5'], label='下5%', color='orange', linestyle='--')
    ax.plot(withdrawal_amounts, results[ticker]['percentile_10'], label='下10%', color='purple', linestyle='--')
    ax.plot(withdrawal_amounts, results[ticker]['percentile_20'], label='下20%', color='blue', linestyle='--')

    # 初期投資額のラインを追加
    ax.axhline(y=initial_investment, color='black', linestyle=':', label='初期投資額')

    ax.set_title(f'{ticker} - 月次取り崩し額に対する最終資産額の変化')
    ax.set_xlabel('月次取り崩し額(万円)')
    ax.set_ylabel('最終資産額(万円)')
    ax.legend()
    ax.grid(True)

    # Y軸のレンジを統一
    ax.set_ylim([y_min, y_max])

plt.tight_layout()
plt.show()

実行結果は下記です。
緑が中央値です。SPY(S&P500)であれば 100人いれば50人以上は月々45万円以上取り崩しても初期元本以上の資産があることがわかります。ただ運が悪い(4人から20人に1人以下では、月々30万以上ではリスク商品が初期より減っていることがわかります。)
またオルカンはS&P500に比べ全体的にリターンが低く、リスクが同等であるため、S&P500と同じ額取り崩すと元本割れのリスクが高まることがわかります。逆に、リータンの高いQQQや、リスクを抑えたオリジナルポートフォリオでは元本割れの可能性が少しながら下がっていることがわかりました。

資産7000万円月々取崩し10年後の最終資産評価額

4 最後に

今回は取り崩し額による元本割れを一括で可視化する方法について紹介してみましたがいかがだったでしょうか?個人的に今回が一番FIRE達成に必要な初期額と取り崩し額を決めるのにあたって一番参考になると思ってます。
次回はこの同じ方法で4%ルールのような定率売却の場合もシミュレーションしてみようと思ってますので、興味を持たれたらぜひお付き合いください。


記事の感想、要望があれば下記X(旧Twitterまで)
*今後の記事に活用させていただきます!!



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



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

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

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


コード全文:

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