こんにちは、最近になってつみたてNISAを始めた今年2年目の社会人です。つみたてNISAは運用益が非課税、半自動的に積立運用可能、途中で取り崩し可能と様々なメリットがあり、非常に有益な制度です。そんなつみたてNISAを活用する上でよく耳にするのは「信託報酬が安くてパフォーマンスの高い米国インデックスファンド一択!一時的に暴落しても戻るから気にするな!」という話です。確かに2000年のITバブル崩壊、2008年のリーマンショックという暴落を経験しながらも、S&P500といった代表的な米国インデックスの直近20年のパフォーマンスは素晴らしいです。
しかし、本当に米国インデックスファンドを積立・放置するだけでいいんでしょうか?頭を使わずに、というのは言い過ぎかもしれませんが放置しているだけで資産が殖えるなんて美味い話、不安を感じるのも確かです。そこで過去に米国インデックスファンドを積立・放置していたらどうなるか簡単にシミュレートしてみました。また、よく見るシミュレーションは直近20年のものが多いですが、今回は積立開始時期を変えながら検証してみました。
注意事項
- 私は資産運用を始めて数ヶ月の初心者です。資産運用を勉強する中で初心者が「それって本当?」と思ったことを自分なりに検証してみたという趣旨ですので経験豊富な方には引っかかる点があるかもしれません。その際はコメントにてご指摘いただければ幸いです。
- 投資は自己責任です。この記事を信じた結果、損したとしても補償はできないのでご了承ください。
- 検証したいのは現行の制度であるため、過去のデータをもとに現在の制度で運用したらどうなるかということをシミュレートします。実際は為替相場が変化していますし、そもそもつみたてNISA自体がありませんが、そのあたりは無視しています。
- データはあくまで過去のものです。当たり前ですが例えば1980年代と2020年代では市場規模や世界情勢など様々な状況が違うので本来は直接比較できません。あくまで参考としてください。
- (2021/07/16 追記) 上記と関連しますが、このシミュレーションは「米国インデックスがこれからも成長していく」という主張を支持する目的ではなく、「仮に過去の米国インデックスのような値動きをする商品があり、つみたてNISAの枠組みで運用する場合、どのような投資戦略が好ましいか」を検証する目的のものです。未来の(長期的な)値動きは過去のチャートではなく現時点での状況をもとに予測すべきです。
シミュレーション
準備
今回は代表的な米国インデックスであるS&P500をもとに検証してみます。このサイトでユーザー登録するとCSVデータを取得できます。今回は月足で1981/01/01-2021/01/01のデータをダウンロードしました。
https://jp.investing.com/indices/us-spx-500-historical-data
以下ではJupyter labを利用しています。まずはデータを読み込みます。
import pandas as pd
import numpy as np
data = pd.read_csv('./s&p500_data.csv')
data.head()
"""
日付け 終値 始値 高値 安値 出来高 前日比%
0 1月 1981 129.55 135.76 140.32 128.57 - -4.57%
1 2月 1981 131.27 129.48 132.02 124.66 - 1.33%
2 3月 1981 136.00 131.27 138.38 128.56 - 3.60%
3 4月1981 132.81 136.00 137.72 131.58 - -2.35%
4 5月1981 132.59 132.81 134.92 128.78 - -0.17%
"""
処理しやすいように整形していきます。今回使うのは日付と前日比のデータだけです。日付データに全角数字と半角数字が混在していたり、スペースがあったりなかったりするのが面倒です。
data = data.rename(columns={
'日付け':'date', '終値': 'close', '始値': 'open', '高値': 'high',
'安値': 'low', '出来高': 'volume', '前日比%': 'ratio'})
dic = {'1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9'}
for key in dic:
data['date'] = data['date'].replace(key, dic[key], regex=True)
data['date'] = data['date'].replace(' ', '', regex=True)
data['date'] = pd.to_datetime(data['date'], format='%m月%Y')
data['ratio'] = data['ratio'].replace('%', '', regex=True).astype(np.float64) / 100
data.head()
"""
date close open high low volume ratio
0 1981-01-01 129.55 135.76 140.32 128.57 - -0.0457
1 1981-02-01 131.27 129.48 132.02 124.66 - 0.0133
2 1981-03-01 136.00 131.27 138.38 128.56 - 0.0360
3 1981-04-01 132.81 136.00 137.72 131.58 - -0.0235
4 1981-05-01 132.59 132.81 134.92 128.78 - -0.0017
"""
後ほど様々な期間で検証するため、特定期間の日付・前日比データを返す関数を作成します。
def clip_data(data, start_date, end_date):
clipped_data = data[(data['date'] >= start_date) & (data['date'] < end_date)]
clipped_data = clipped_data.sort_values('date')
return clipped_data['date'].values, clipped_data['ratio'].values
積立投資をシミュレートする関数を作成します。後述しますが、つみたてNISA満了後も運用することを見据えて240ヶ月目以降は追加積立金0円で運用しています。
def nisa_simulate(ratio, nisa_invest_per_month, nisa_month=240):
result = np.zeros(len(ratio) + 1)
principal = np.zeros(len(ratio) + 1)
for i in range(len(ratio)):
result[i + 1] = (result[i] + nisa_invest_per_month) * (1 + ratio[i])
principal[i + 1] = principal[i] + nisa_invest_per_month
if i == nisa_month:
nisa_invest_per_month = 0
return result[1:], principal[1:]
運用中の元利合計金額の推移をプロットする関数を作成します。また、つみたてNISA期間中の最高値を通る水平線も引っ張っています。
import matplotlib.pyplot as plt
def plot_amount(date, amount, principal, nisa_month=240):
fig, ax = plt.subplots()
ax.plot(date, amount / 1e4, label='Amount')
ax.plot(date, principal / 1e4, label='Principal')
ax.axhline(y=np.max(amount[0:nisa_month]) / 1e4, linestyle='dashed', color='green', alpha=0.8)
ax.axvline(x=date[nisa_month - 1], linestyle='dashed', color='red', alpha=0.8)
ax.set_xlim(date[0], date[-1])
ax.annotate('NISA finished', xy=(date[nisa_month - 1], np.max(amount) / 1e4 / 2), color='red')
ax.set_xlabel('Year')
ax.set_ylabel('Amount [x10,000 yen]')
ax.set_title('S&P500 performance')
ax.legend(loc='upper left')
ax.grid()
結果
さて、これで準備ができました。積立期間を変えながら結果を見ていきましょう。まずはよく見る、直近20年間つみたてNISAでS&P500を運用していた場合の結果を見てみましょう。つみたてNISA枠を使い切るために毎月33,333円積み立てたと仮定しています。
start_date = '2001-01-01'
end_date = '2021-01-01'
nisa_invest_per_month = 33333
date, ratio = clip_data(data, start_date, end_date)
amount, principal = nisa_simulate(ratio, nisa_invest_per_month)
plot_amount(date, amount, principal)
plt.tight_layout()
plt.show()
いや、何度も見てますけどやっぱりすごいですね。2009年頃にリーマンショックの影響で一時的に元金割れを起こしているものの、わずか1年後には回復し、最終的には元利合計が約2090万円と元金800万円の約2.6倍のパフォーマンスを叩き出しています。この結果を見ると、確かに一時的に暴落してもすぐに回復するから放置でOKという話は説得力があるように感じます。
しかし、これはたまたま上手くいったケースだと考えられないでしょうか?運用開始から8年目では運用資金が少ないため、暴落してもダメージが小さかったのだと考えることができます。つみたてNISA満了直前に暴落が起こってしまったら運用資金が多い分、ダメージが大きくなってしまうことが予想されます。そこでちょっとイジワルですが、リーマンショックによる影響が最も大きい2009年につみたてNISAが満了する、1989-2009年で運用していた場合の結果を見てみましょう。(ここではつみたてNISA満了後も商品を持ち続けた場合の評価額推移もプロットしています。)
start_date = '1989-01-01'
end_date = '2021-01-01'
nisa_invest_per_month = 33333
date, ratio = clip_data(data, start_date, end_date)
amount, principal = nisa_simulate(ratio, nisa_invest_per_month)
plot_amount(date, amount, principal)
plt.tight_layout()
plt.show()
これを見てみると2007年には元金の2倍のパフォーマンスを出せていたのに、満了時にはほぼ元金分まで下落していることが分かります。元金割れこそ起こしていないものの、暴落時には目の前が真っ暗になりそうですね。。。しかし、つみたてNISAは満了後もNISA口座から課税口座に商品を移して運用を続けることができます(移動後に売却した場合には、移動時の評価額に対する利益分のみに課税されます)。なのでしばらく待っていれば2013年頃には運用中の最高値まで回復します。また、さらに待てばその後も右肩上がりに増えていくことが分かります。しっかり待つことができれば、満了直前の暴落もさほど怖くないのです。
…………そう、待てさえすれば。実際には待つことができない場合もあります。パッと思いつくのは以下の2ケースです。
- 暴落に怖くなってしまい、元金割れだけはさせまいと売ってしまう。
- つみたてNISAを何らかの用途でアテにしていたため、現金として取り崩さざるを得ない。
1のケースを回避するには暴落に耐えうる精神力を鍛える他ありません。これは想像より大変そうです。上のようなチャートを描くことが事前に分かっていれば簡単なことですが、例えば上の図の2009年以降が隠されていたらどうでしょう?暴落時の悲観ムードの中、2009年以降の爆発的な伸びを信じて待ち続けるのは容易ではないことが想像できます。
2のケースはもっと難しいです。例えば子どもの教育資金として使うことを考えていた場合、大学入学などが重なって多額の現金化が必要になる可能性があります。他に資金がない場合には、(数年後には倍になることを信じていたとしても)取り崩さざるをえないでしょう。しかも暴落時には投資以外の経済状況(勤め先など)が悪化することも考えられ、取り崩さざるを得ない状況が増えると予想されます。
とはいえ、暴落は起こりうるものという心構えがあり、米国経済が立ち直ることを予想できるだけの知識があり、他に現金化できる資産を持つなどリスク分散できていれば乗り切れるようにも思います。そこでもう一つのケースを見てみましょう。ITバブル崩壊の影響が最も強く出てしまう1983-2003年のケースです。
start_date = '1983-01-01'
end_date = '2021-01-01'
nisa_invest_per_month = 33333
date, ratio = clip_data(data, start_date, end_date)
amount, principal = nisa_simulate(ratio, nisa_invest_per_month)
plot_amount(date, amount, principal)
plt.tight_layout()
plt.show()
このケースの厄介なところは、最高値まで回復してきた2008年にリーマンショックが起きてしまうところです。2008年に利確しなかった場合、もとの水準に戻るのはさらに4年後の2012年になります。この場合でもひたすら待っていれば2012年以降、爆発的に評価額は増えていきますが、果たして待てるでしょうか?当初運用が終わると思っていた時期からさらに8年以上待つのはなかなか忍耐が要ります。そうでなくとも、忍耐といった精神的な話とは別に、現実的に現金が必要になることも出てくると考えられます。
さらに言うと、前述の通りNISA口座から課税口座に移動後の売却益には課税されてしまいます。例えば2008年に利確したとして、口座移動時の評価額に対する売却益1000万円は課税されるため、200万円ほど税金として持っていかれることになります。__(追記:つみたてNISAの制度内容を見直していて誤りに気づきました。つみたてNISAでは各商品の購入から20年間が非課税になります。これについては金融庁HPが分かりやすいです。したがって2008年に一括売却した場合でも、売却益として課税されるのは1983-1987年に購入した商品それぞれの2003-2007年時点の評価額と2008年時点での評価額の差益のみです。上記のコードをもとに計算すると1983-1987年購入分の2008年時点での課税売却益は350万円程度になり、税金として70万円ほど持っていかれることになります。)__となると、2008年に最高値まで回復しても「せっかく4年待ったのに、このまま売ると200万円70万円も持っていかれる。。もう少し待って運用中の最高値を更新しないと割に合わない!」と考えてしまう恐れもあります。そうこうしているとリーマンショックの憂き目にあってまた4年待つことになりかねません。
ここで挙げたのはイジワルなケースですが、いくら放置とは言っても出口戦略を少しは考えておく必要がありそうです。
まとめ
今回はつみたてNISAでよく言われている「米国インデックスファンド放置でOK」というのはどこまで本当かということを検証してみました。1981年から2021年のデータをもとにつみたてNISAでS&P500を運用するシミュレーションの結果、以下のことが分かりました。
- 1981年以降、最悪なケースを想定しても最終的な運用成果として元金割れは起こっていない。良いケースでは例えば2.6倍のパフォーマンスを放置しているだけで得られる。
- 運用開始から間もない頃に起こる暴落が最終成果に与える影響は少ない。
- 満了直前の暴落は影響が大きく、出口戦略を複雑にする恐れがある。
この結果をもとにした自分なりの考えが以下です。
- 基本的に放置しておいてよいというのは妥当。ただし、期間満了が近いかつ市場の動きが怪しい場合には利確含め出口戦略を考える。
- 何を目的とした運用かを念頭におき、妥協ラインや現金化を待つことのできる期間を明確にしておく。出口戦略の具体化につながる。
- 米国インデックスファンドを緊急性・必要性の高い用途(子どもの教育資金など)のアテにしすぎない。他資産でリスク分散する。
- アンテナを高く持ち、市場の異変を素早く察知できるようになる。放置≠無関心。
というわけで、基本放置、運用目的の明確化、リスク分散、勉強の継続という教科書に書いてあるような結論になりました。でも、やっぱりこういう基本は大事なのでしょうね。「放置でよい」というのと「何も考えなくてよい」というのは同じようで違うのだと思います。「戦略的に放置」できるようになりたいものです。皆さんもぜひ一度、自分の手でシミュレートしてみて運用戦略を考えてみてはいかがでしょうか。