見出し画像

リターンとリスクを見た目で実感!?

サブテーマ:リターン、リスク、シャープレシオの各数値をイメージする


1 初めに

 前回、資産形成から取崩期のシミュレーションコードを作成し紹介しましたが、そのコードを触っていると今まで話していた投資のリターンとリスクの値とその2つから算出されるシャープレシオが深くイメージできましたのでこの気持ちが共有できるかどうかわかりませんが、小話程度にお付き合いください。

今回の結論:
リターン10%でリスクが15%→10%→4%の場合のシミュレーション
→同じリターンでも、リスクってやっぱり大切(取崩期)
 *リスクの高い投資対象だと同じ取崩額でも元本割れとなる確率が上がる


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


2 豆知識

1)リスク、リターン、シャープレシオ(おさらい)

リスクとは

リスクとは、投資における不確実性や変動のことを指します。具体的には、投資した資産の価格が上下に変動することを意味し、その変動幅が大きいほどリスクが高いとされます。リスクには市場リスクや信用リスク、流動性リスクなど様々な種類がありますが、ここでは標準偏差をリスクとして取り扱っています。ちなみにボラティリティ(変動幅)も一般的に同意義で使われています。

リターンとは

リターンとは、投資から得られる利益のことを指します。これは、投資元本に対する利益の割合で示され、通常はパーセンテージで表されます。リターンにはキャピタルゲイン(資本利得)や配当、利子などが含まれます。高いリターンは投資の成功を意味しますが、それに伴うリスクも考慮する必要があります。この記事では年率に換算した値として、年率のリターンとして取り扱っています。

シャープレシオとは

シャープレシオとは、リスクに対するリターンの効率性を測る指標です。具体的には、ポートフォリオのリスク(標準偏差)に対してどれだけの超過リターン(無リスク金利を上回るリターン)が得られたかを示します。計算式は、(ポートフォリオのリターン - 無リスク金利)/ ポートフォリオのリスクですが、この記事では簡単に、リターン➗リスクでシャープレシオとしています。なお高いシャープレシオは、リスクに対して効率的にリターンを上げていることを意味します。

リスク、リターン、シャープレシオの関係性

リスクとリターンは投資の基本概念であり、一般にリスクが高いほどリターンも高くなる傾向があります。しかし、単にリターンが高い投資が良いとは限りません。シャープレシオは、このリスクとリターンのバランスを評価するための指標です。高いシャープレシオは、同じリスク水準でより高いリターンを実現していることを示し、効率的な投資戦略を評価するのに役立ちます。したがって、リスク、リターン、シャープレシオの関係を理解することで、よりバランスの取れた投資判断が可能となります。

3 実践

1)調査内容

 今回は、リターンを4%(債券相当)、7%(オルカン相当)、10%(SP500相当)、15%(FANG+やNASDAQ100)とした上で、下記のようにシャープレシオとなるようにリスクの値を変化させた場合の残り資産をシミュレーションしています。前回と同じPYTHONコードです。

# パラメータ設定
initial_investment = 200 # 初期投資額(万円)
monthly_investment = 10 # 月次積立額(万円)
investment_duration = 360 # 投資期間(月)
withdrawal_start_month = 240 # 取崩開始月(月数)
withdrawal_amount = 30 # 月次取り崩し額(万円)
simulations = 100 # シミュレーション回数

調査1 シャープレシオ 0.75
調査2 シャープレシオ 1.0
調査3 リスク 0.04で一定

2)調査結果

調査1、2、3をそれぞれ手動で数値を入れ替えコードを実行しました。

pip install japanize-matplotlib

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

# パラメータ設定
initial_investment = 200  # 初期投資額(万円)
monthly_investment = 10  # 月次積立額(万円)
investment_duration = 360  # 投資期間(月)
withdrawal_start_month = 240  # 取崩開始月(月数)
withdrawal_amount = 30  # 月次取り崩し額(万円)
simulations = 100  # シミュレーション回数

# tickersリストを定義
tickers = ['4%', '7%', '10%', '15%']

# 年次リターンと年次標準偏差(手動設定)
annual_returns = {'4%': 0.04, '7%': 0.07, '10%': 0.10, '15%': 0.15}
annual_std_devs = {'4%': 0.06, '7%': 0.105, '10%': 0.15, '15%': 0.225}

# 年次リターンと年次標準偏差を月次リターンへ変換
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}

# 各シミュレーションの資産額を保存する配列の初期化
all_time_series = []

for ticker in tickers:
    monthly_return_mean = monthly_returns[ticker]
    monthly_return_std = monthly_std_devs[ticker]
    # この配列に各シミュレーションの時系列データを保存
    time_series_simulations = np.zeros((simulations, investment_duration))

    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
            # 各月の資産額を保存
            time_series_simulations[simulation, month] = max(total_value, 0)  # 資産額が0未満にならないようにする

    all_time_series.append(time_series_simulations)

fig, axes = plt.subplots(nrows=len(tickers), ncols=1, figsize=(10, 3 * len(tickers)))
axes = axes.flatten() if len(tickers) > 1 else [axes]

# y軸の上限を設定
y_max = (initial_investment + monthly_investment * withdrawal_start_month) * 8

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

    # 中央値、下5%、上95%の計算
    median_values = np.median(time_series_simulations, axis=0)
    percentile_5 = np.percentile(time_series_simulations, 5, axis=0)
    percentile_95 = np.percentile(time_series_simulations, 95, axis=0)

    # 各シミュレーションの時系列データをプロット
    for simulation in range(simulations):
        ax.plot(range(investment_duration), time_series_simulations[simulation], alpha=0.2, color='blue')

    # 中央値、下5%、上95%のプロット
    ax.plot(range(investment_duration), median_values, color='green', label='中央値', linewidth=2)
    ax.plot(range(investment_duration), percentile_5, color='orange', linestyle='--', label='下5%')
    ax.plot(range(investment_duration), percentile_95, color='purple', linestyle='--', label='上95%')

    # 元本の推移をプロット(黒の点線)
    total_principal_over_time = np.concatenate([
        initial_investment + np.arange(withdrawal_start_month) * monthly_investment,
        [initial_investment + monthly_investment * withdrawal_start_month - withdrawal_amount * (i - withdrawal_start_month) for i in range(withdrawal_start_month, investment_duration)]
    ])
    ax.plot(total_principal_over_time, color='black', linestyle=':', label='元本の推移')

    # 縦線を追加(積立期と取り崩し期の境界)
    ax.axvline(x=withdrawal_start_month, color='red', linestyle='--', label='取崩し開始')

    ax.set_title(f'{ticker} - 資産形成および取崩し時:資産額の時系列推移')
    ax.set_xlabel('月')
    ax.set_ylabel('資産額')
    ax.legend()
    ax.grid(True)

    # すべてのサブプロットのy軸の範囲を設定
    ax.set_ylim([0, y_max])

plt.tight_layout()
plt.show()

実行結果が下記です。

調査1 シャープレシオ0.75
調査2 シャープレシオ1.0
調査3 リスク0.4%

3)まとめ

 出力しただけではよくわからないので、リターン10%の場合のそれぞれをまとめて並べ替えてみました。すると、単純にリスクが高いと特に取崩期に資産が減少する(=枯渇する)リスクが上がることが明らかに見えます。取崩期にはリターンを確認し取崩額を決めて運用していたとしてもリスクの高い商品だと元本割れもしくは資産が枯渇するリスクがあることが、見た目で理解できるのではないでしょうか?

4)おまけ 資産1億円からの取崩シミュレーション

 シャープレシオ0.75に固定した場合の取崩シミュレーションを実施してみました。先ほどの結果と同じですが、取崩期には1億を月々20万円取崩した場合、取崩開始時の資産の増減を見る限り、たとえリターンが少なくてもリスクを抑えた商品の方が元本が維持できるので安心して老後もしくはFIRE生活が過ごせるのではと思える結果になりました。

以上今回のまとめ
今回のシミュレーション条件:
initial_investment = 200 # 初期投資額(万円)
monthly_investment = 10 # 月次積立額(万円)
investment_duration = 360 # 投資期間(月)
withdrawal_start_month = 240 # 取崩開始月(月数)
withdrawal_amount = 30 # 月次取り崩し額(万円)
simulations = 100 # シミュレーション回数

まとめ
リターン10%でリスクが15%→10%→4%の場合のシミュレーション
→同じリターンでも、リスクってやっぱり大切(特に取崩期)
 *リスクの高い投資対象だと同じ取崩額でも元本割れとなる確率が上がる

4 最後に

 今回は、過去の作成したコードをもとに、リスク、リターンの数値の違いを改めて可視化してみました。
今後も投資リテラシー向上兼プログラム活用に役立つ情報を発信していきますので応援のほどよろしくお願いします!

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



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



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

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

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




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