見出し画像

これは良いかも!Zテック20

サブテーマ:積立・一括・取崩をシミュレーション


1 初めに

 大和アセットマネジメント株式会社より、新しい投資信託Zテック20が発売されます。ユーチューバーの風丸さんが作成したものだそうですが、アメリカのマグ7に期待している私にとってこの投資信託はNASDAQ100(QQQ)より良い気がしてます。今回はこの投資信託の紹介と、私なりのシミュレーション結果をご報告します。ぜひお付き合いください。
 
今回のまとめ:QQQより良い結果

Zテック20 月10万円の積立投資シミュレーション
月10万円投資後の箱ひげ図(1,5,10,15,20年後)

このチャンネルでは直近よりアウトプットを重視して、本文はPYTHONコードに触れず結果をご報告します。コード全文は最下部に公開しておきます。再現性を確保するため、GoogleColabを使って実行した結果としています。PYTHONを使ってみたい方勉強してみたい方はまずはコピペでぜひ触ってみてください。
 あとユーチューブも始めてみました。動画は不慣れですが、このチャンネルでのマスコットキャラクターを使って、これまでの記事をより分かりやすく紹介します。まだまだ動画数は少ないですが、いずれこの記事の内容も動画にしたいと思ってます。ぜひ見ていただき、率直なご意見を頂けるとありがたい限りです。


2 豆知識 

Zテック20について *引用先:大和アセット特集サイト

世界の上場銘柄に投資&保有割合は時価総額加重平均

選定基準
銘柄と保有割合(時価総額加重平均)
過去トレンド

3 実践

1)実行結果

 今回、大和アセットの特集サイトの実績から、年率リターン、リスクの値をつかって、積立・一括・取崩シミュレーションを実施します。
 比較としてSP500、NASDAQ100、FANG+の値も公式ページありますので、併せて比較します。
 積立  :月10万円×20年、
 一括投資:1000万円×20年
 取崩  :元本5000万円から月25万円の定額
今回、1年、5年、10年、15年、20年後の箱ひげ図で比較しやすいようにしました。

2)積立シミュレーション

月10万円×20年を500回のシミュレーション結果とその結果を箱ひげ図にした結果が下記のとおりです。
 結果、資産形成期にはリターンが大きな影響をあたえます。
いずれの場合でも FANG+>Zテック20>QQQ>SP500  の関係がなりたっていますが、1箇所、20年後の箱ひげの下線が元本を超えるのはFANG+とZテック20のみで、バランスの高さが確認できます。

モンテカルロシミュレーション
箱ひげ図

3)一括投資

 一括投資の場合も積立投資と同じ傾向です。1000万を投資額にしていますが、ご自身の投資額との割合に応じて結果を確認してみてください。

モンテカルロシミュレーション
箱ひげ図

4)取崩シミュレーション

 初期投資額5000万円を月々25万円取り崩した場合のシミュレーションです。この場合は、中央値は増え続ける一方ですが、下記5%以下で資産枯渇の可能性がでてきます。このため失敗回数を失敗確率として出力してみました。その結果、SP500でも2.4%資産が枯渇してしまいますが、その確率はQQQやZテックを選択することで、下げることができます。

モンテカルロシミュレーション
箱ひげ図
失敗確率の出力

5)個人的に見解
 Zテック20のトータルとしての性能は、FANG+に劣りますが、SP500やQQQより優れる良い投資先です。
 今後購入を考えるにあたって、①銘柄選定基準と、②均等加重平均か時価総額加重平均かどうかが私自身ポイントになっています。①の銘柄選定基準は、FANG+はFANG+以外の銘柄入れ替え基準が少しあいまいなことに対し、Zテック20はセクター分け+世界の時価総額加重平均20社という洗練された選定基準があります。またSP500は米国のみ、QQQはNASDAQ市場に上場している会社のみという縛りがありますが、Zテック20は世界中のテック系の会社という長く保有し続けることができる確かな安心感があります。
 ②の均等加重平均もまた逆張り的な要素もあって、過去は10年は素晴らしい成績でしたが、均等加重平均が今後も安定して良い成績が得られるかどうかは少し疑問が残ります。
 私自身、高いリターンで保有銘柄を少なくしたい場合、このZテック20は良い選択だと考えます。
 銘柄数が多くて良い場合は、過去記事のような今後相性の良いポートフォリオを検討してみると良いのではと考えてます。一投資家の意見ではありますが、もし少しでも参考になれば幸いです。

4 最後に

 今回は、Zテック20を題材に、積立・一括・取崩シミュレーションを紹介してみました。この方法でご自身の興味のある題材で自分でシミュレーションしてみることもできます。
今後もPYTHON×マネーリテラシー向上に役立つ情報を発信していきますので、引き続き応援よろしくお願いします!!

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

Youtube



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



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

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

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



以下実行コード全文:コピペで実行してみてください。


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

# パラメータ設定
initial_investment = 5000  # 初期投資額(万円)
monthly_investment = 0  # 月次積立額(万円)
investment_duration = 241  # 投資期間(月)
withdrawal_start_month = 0  # 取崩開始月(月数)
withdrawal_amount = 25 # 月次取り崩し額(万円)
simulations = 500  # シミュレーション回数

# ラベルや目盛のフォントサイズを設定
plt.rcParams.update({'font.size': 18})

# tickersリストを定義
tickers = ['SP500','QQQ','FANG','Ztech']

# 年次リターンと年次標準偏差(手動設定)
annual_returns = {'SP500': 0.14, 'QQQ': 0.19, 'FANG': 0.29, 'Ztech': 0.22}
annual_std_devs = {'SP500': 0.18, 'QQQ': 0.22, 'FANG': 0.28, 'Ztech': 0.23}

# 年次リターンと年次標準偏差を月次リターンへ変換
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, 6 * len(tickers)))
axes = axes.flatten() if len(tickers) > 1 else [axes]

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

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.1, 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='取崩し開始')
    
    # 年単位のX軸ラベル設定
    years = range(0, investment_duration // 12 + 1)  # 年単位の範囲(0年目から最終年まで)
    ax.set_xticks([year * 12 for year in years])  # 12か月ごとの位置
    ax.set_xticklabels([str(year) for year in years])  # 年のラベルを設定
    
    ax.set_title(f'{ticker} - 資産額の時系列推移')
    ax.set_xlabel('年')
    ax.set_ylabel('資産額')
    ax.legend(loc='upper right') 
    ax.grid(True)

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

plt.tight_layout()
plt.show()

# 箱ひげ図を描画するためのデータ準備
time_points = [12, 60, 120, 180, 240]  
fig, axes = plt.subplots(nrows=1, ncols=len(tickers), figsize=(20, 10), sharey=True)

for i, ticker in enumerate(tickers):
    time_series_simulations = all_time_series[i]
    data_for_boxplot = [time_series_simulations[:, t] for t in time_points]

    # 時点ごとの元本(積立額)を計算
    principal_values = [initial_investment + t * monthly_investment for t in time_points]

    ax = axes[i]
    ax.boxplot(data_for_boxplot, patch_artist=True)
    ax.set_xticks(range(1, len(time_points) + 1))
    ax.set_xticklabels([f'{t // 12}年' for t in time_points])
    ax.set_title(f'{ticker} - 資産分布の箱ひげ図')
    ax.set_xlabel('期間')
    ax.set_ylabel('資産額' if i == 0 else '')  # 最初のプロットのみy軸ラベルを追加

    # 元本ラインを追加
    for j, (x_pos, principal) in enumerate(zip(range(1, len(time_points) + 1), principal_values)):
        ax.hlines(principal, x_pos - 0.4, x_pos + 0.4, colors='red', linestyles='dashed', label='元本' if j == 0 else None)

    # 軸のレンジを固定
    ax.set_ylim([0, 30000])
    ax.grid(True, linestyle='--', alpha=0.7)

# 凡例の追加(1つのプロットにだけ表示)
axes[0].legend(loc='upper left')

plt.tight_layout()
plt.show()


# 各ティッカーごとの失敗確率を計算して出力
for i, ticker in enumerate(tickers):
    time_series_simulations = all_time_series[i]
    
    # 最終月で資産が0のシミュレーションをカウント
    failures = np.sum(time_series_simulations[:, -1] == 0)
    
    # 失敗確率を計算(割合)
    failure_probability = failures / simulations * 100
    
    print(f'{ticker} の失敗確率: {failure_probability:.2f}%')


いいなと思ったら応援しよう!