はじめに
自分がNISAを初めて早4年が経ちました。
投資信託を始めた頃は米国インデックスファンドのS&P500だけ入れておけばいいと聞いており、今もその通りに積み立てを続けているのですが確かな資産増加を目の当たりにしています。
そんなS&P500ですが年の利回りはおよそ7~10%と言われてるのですが、果たして本当に利回りは7~10%もあるのでしょうか?
少し気になったので、今回は私の新NISAの1年10か月分の実評価額と利回り7%および10%の場合のシミュレーションデータを使って検証していきます。
検証内容
利回りシミュレーションデータの作成
利回りシミュレートのデータセットはJupyterLabを使って作成しました。
下記は20年間毎月10万円積み立てを行い、毎年12月に利回り(下記では10%)が付与されるシミュレーションの式の例になります。
# パラメータ設定
simulation_years = 20
months = simulation_years * 12
annual_interest_rate = 0.10 # 年間利率
current_balance= 0
amounts=[current_balance] #投資開始前の資産額
# 20年間の複利増加シミュレーション
for month in range(1, months + 1):
# 月末に積み立て
current_balance += 100000 # 毎月の積み立て額(円)
# 年末12月に利回りX%を付与
if month % 12 == 0:
current_balance *= (1 + annual_interest_rate)
amounts.append(current_balance)
df_pred_10=pd.DataFrame({'date': dates,'assets': amounts})
df_pred_10
|
date |
assets |
| 0 |
2023-12-31 |
0.000000e+00 |
| 1 |
2024-01-31 |
1.000000e+05 |
| 2 |
2024-02-29 |
2.000000e+05 |
| 3 |
2024-03-31 |
3.000000e+05 |
| 4 |
2024-04-30 |
4.000000e+05 |
| ... |
... |
... |
| 236 |
2043-08-31 |
6.833000e+07 |
| 237 |
2043-09-30 |
6.843000e+07 |
| 238 |
2043-10-31 |
6.853000e+07 |
| 239 |
2043-11-30 |
6.863000e+07 |
| 240 |
2043-12-31 |
7.560300e+07 |
分かりにくいですがe+07=10の7乗=10000000です。
20年間毎月10万円積み立てで利回り10%の場合、2043/12/31最終時点でおよそ7560万円の資産になるようです。
20年間投資をせず毎月貯金だけした場合は、10万×12ヶ月×20年=2400万となりますので、利益率は軽く倍を超える見込みです。
まずは愚直にこのdataframeを
- 貯金のみ(save_only)
- 年利7%(interest rate 7%)
- 年利10%(interest rate 10%)
で折れ線グラフをプロットしてみます。
月10万円積立投資 利回りシミュレート 2024~2044
毎年12月に利回りの掛け算をしているため、階段状の遷移になりめっちゃ違和感。。月レベルの検証がこのままでは難しい。。
y軸1e8=1なので、y=1の場合は1億円を示しています。
20年後のsave_onlyは2400万円(グラフで0.24)、interest rate 10%は7560万円(グラフで0.756)と、図と先述予測値が一致していることを確認しました。
階段の違和感をなくすため、昨年12月と今年12月の資産額から間の月(1月~11月)の資産額を線形補間を行うようにして、滑らかな曲線に変換します。
df_pred_10_tmp=df_pred_10.copy()
df_pred_10_tmp['year']=df_pred_10_tmp['date'].dt.year
df_pred_10_tmp['month']=df_pred_10_tmp['date'].dt.month
#2023年12月を初期値資産額0円として用意。
df_pred_10_ex = df_pred_10_tmp[(df_pred_10_tmp['year'] == 2023) & (df_pred_10_tmp['month'] == 12)].copy()
df_pred_10_ex.loc[0,'linear_assets']=[0]
df_tmp=pd.DataFrame()
for year in range(start_year, start_year + simulation_years):
# 前年12月と今年12月の予測資産で線形補間する
# tmp1で昨年12月、tmp2で今年1年分のデータを取得し結合
df_tmp1=df_pred_10_tmp[(df_pred_10_tmp['year'] == year - 1) & (df_pred_10_tmp['month'] == 12)]
df_tmp2=df_pred_10_tmp[df_pred_10_tmp['year'] == year]
df_tmp = pd.concat([df_tmp1, df_tmp2], axis=0)
df_tmp.reset_index()
df_tmp.loc[df_tmp.index[0], 'linear_assets'] = df_tmp['assets'].iloc[0]
df_tmp.loc[df_tmp.index[12], 'linear_assets'] = df_tmp['assets'].iloc[12]
df_tmp['linear_assets'] = df_tmp['linear_assets'].interpolate(method='linear')
#昨年12月のデータ(1行目)は削除
df_tmp = df_tmp.iloc[1:]
df_pred_10_ex = pd.concat([df_pred_10_ex, df_tmp], axis=0)
長いコードになってしまった。。普段pandasを全然触っていないので結構苦労しました。
もっと短くできそうな気がしますが気づいた方いましたらコメントください。
このdf_pred_10_exを再度図出力します。
月10万円積立投資 利回りシミュレート 2024~2044
期待通り滑らかな曲線となり、指数関数っぽい増加になりました。
ここに実データ(actual)を加えてみます。実データ(新NISA積み立て)はまだ1年10か月だけですので2024~2027年に絞ります。
実評価額について
上記でも述べた通り、私の積み立てNISA枠毎月10万円の1年10ヶ月分(2024年1月から現在2025年10月31日まで)の実資産額のデータを使って比較します。
なお私の積み立て枠の内訳ですが、オルカンや日本インデックスなどにも投資しており、S&P500の割合は7割ほどになります。
そのためS&P500のみのRawデータではないことをご了承ください。
この中で現在(2025/10/31)で一番利益率が高いファンドですが、やはりS&P500でした。
このS&P500を稼ぎ頭とした資産額が利回り7%や10%の資産額に匹敵しているかを検証します。
利回りシミュレーションと実データの比較
月10万円積立投資 利回りシミュレート 2024~2027
赤線が私の資産額を用いた実データ(actual)になります。
y軸1e6=1なので、y=1は100万円を示します。
貯金、利回りの線に対して上下をさ迷う形になっていました。
2025年4月のトランプ関税暴落があったり、2025年10月現在はかなり好景気になったりと差が激しかったためです。
実際のところ、私の現在の評価額は2015/10現在で271万円ほどで、積立額220万に対して50万ほどの利益が出ていました。
22ヶ月分とデータ数が少なく、まだ何とも言えないというところでした。
おまけ
最後に実評価額の推移を単回帰に変えて、申し訳程度の機械学習要素を入れてこの記事を終了します。
df_actual['day_count'] = (df_actual['date'] - df_actual['date'].min()).dt.days
X = df_actual[['day_count']]
y = df_actual['assets']
model = LinearRegression()
model.fit(X, y)
# 予測値の計算
df_actual['predicted_assets'] = model.predict(X)
月10万円積立投資 年利シミュレート 2024~2027
たまたまかと思いますが今のデータセットでは7%利回りと10%利回りの間に入りました。
もしS&P500に全額入れていたら10%を超えているように思われます。
検証結果
現在のデータで見てみると、基本的にはS&P500は確かに利回り7~10%近くの利益が出ているようには見られました。
まだデータ数が少なく今後大きく変わる可能性もあるので、引き続き積み立てを続けて結果を確認してみたいと思います。