インデックス投資はETFと公募投資信託どちらが良いかを検証してみる

# テーマ

皆さんはインデックス投資をご存知でしょうか？インデックスとは日経平均株式指数やダウ工業平均指数など、複数の株式の値を加重平均した指標んことで、この指標と同じような値動きをするようなファンドに投資することをインデックス投資といいます。インデックス投資は個別銘柄やファンドとは異なり、複数の銘柄に同時に投資することになるのでリスク分散になる上、様々な市場調査を必要としないのでファンドのコストとても安いというメリットがあります。

インデックスをする上で主に2つの選択肢があります。1つは上場投資信託(ETF)、もう一つは公募投資信託(mutual fund、いわゆる投資信託)です。ETFは通常の株式市場と同様に売買できてコストが低いのに比べ、投資信託は分配金を出さず、課税なしに効率よく再投資できるというメリットがあります。信託報酬の低いETFと課税先延ばしができる投資信託のどちらが良いかというのがインデックス投資家の間で頻繁に議論されるテーマの一つです。

ここではSP500というアメリカ市場の指数を対象にどちらが良いかを検証してみます。言わずもがな、実際の投資は自己責任でお願いします。

ETFとしては[1557(SPY)](https://www.spdrs.jp/etf/fund/fund_detail_SPY.html#)、投資信託は[eMAXIS Slim米国株式](https://emaxis.jp/fund/253266.html)のコストを用います。この2つは日本からSP500に投資する際には最もコストが低い2つになります。

# 問題設定

- SP500の指数の上昇率を5%、分配金を2%とします
- 1557のコストは0.0945%、Slimは0.25%(実質コスト)とします。
- 分配金にかかる税率はアメリカ分は10%、日本分は20%とします
- 売買益にかかる税率は日本分の20%とします
- 1557の売買コストは無視
- 1557はアメリカ課税分は確定申告で取り戻せるが、Slimは不可

# コード

```python
capital_growth_ratio = 0.05
income_ratio = 0.02
us_tax_ratio = 0.1
jp_tax_ratio = 0.2
mf_cost_ratio = 0.0025
etf_cost_ratio = 0.000945

def simulate(duration, cost_ratio, reinvest=False, us_tax_withholding=True, jp_tax_withholding=True):
    # initialization
    current = 1.0
    total_income = 0.0
    
    for t in range(duration):
        # calculate income and tax
        income = current * income_ratio
        if us_tax_withholding:
            income *= (1.0 - us_tax_ratio)
        if jp_tax_withholding:
            income *= (1.0 - jp_tax_ratio)
            
        # capital growth
        current *= (1.0 + capital_growth_ratio)
        
        # subtract cost 
        current *= (1.0 - cost_ratio)
        
        # handle reinvestment
        if reinvest:
            current += income
        else:
            total_income += income
        
    capital_ret = (current - 1.0) * (1.0 - jp_tax_ratio)
    return capital_ret + total_income, current, capital_ret, total_income
```

`reinvest`は分配金の再投資、`us_tax_withholding`と`jp_tax_withholding`はアメリカと日本での分配金に課税するかどうかを表します。例えば10年間1557に投資をし、その間は分配金を再投資し、確定申告でアメリカ課税分を取り戻すという設定であれば

```python
{{"duration": 10, "cost_ratio": etf_cost_ratio, "reinvest": True, "us_tax_withholding": False, "jp_tax_withholding": True }}
```

というようなパラメータを上記の`simulate`関数に入れればOKです。

# 検証

次の4条件を考えます。

```py
def run(duration):
    etf1 = {"cost_ratio": etf_cost_ratio, "reinvest": False, "us_tax_withholding": True, "jp_tax_withholding": True }
    etf2 = {"cost_ratio": etf_cost_ratio, "reinvest": False, "us_tax_withholding": False, "jp_tax_withholding": True }
    etf3 = {"cost_ratio": etf_cost_ratio, "reinvest": True, "us_tax_withholding": False, "jp_tax_withholding": True }
    mf =   {"cost_ratio": mf_cost_ratio, "reinvest": True, "us_tax_withholding": True, "jp_tax_withholding": False }
    return [simulate(duration, **cfg) for cfg in (etf1, etf2, etf3, mf)] 
```

`etf1`は再投資なし、分配金は2重課税の厳しい条件で、`etf2`は確定申告でアメリカ課税を取り戻す、`etf3`は更に再投資もするという設定です。`mf`は投資信託を利用するケースでアメリカ課税分は取り戻すことができないが日本課税分は最後の売却時まで先延ばしできることができます。

この4条件で1-20年までのトータルリターンの推移をプロットしてみます。

```py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

def get_total_return(ret):
    return [r[0] for r in ret]

results = [get_total_return(run(i)) for i in range(1, 21)]
df = pd.DataFrame(index=np.arange(1, 21), data=results, columns=["etf1", "etf2", "etf3", "mf"])

df.plot.bar()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65444/79d9fb6d-77ec-68af-707e-c73ef4ff2ba3.png)

最終的に利回りは

- etf1: 175.4%
- etf2: 180.6%
- etf3: 201.9%
- mf: 203.9%

という結果になりました。ETF再投資や確定申告の手間を費やしたとしても投資信託の方が効率的であるというところまでコストが下がっているようです。

# まとめ

インデックス投資のための投資信託のコストはもうかなり低いところまで下がってきています。完全放ったらかしにできる投資信託の方がETFよりも効率的でした。もうSlim米国株式にメインの投資対象を乗り換えようと思います。

# おまけ

投資信託で20年目までホールドし、21年目から利回り分だけで生活しようと思うといくら必要かも概算できます。

```py
run(21)[-1][0] - run(20)[-1][0]
>>>
0.18558878043405702
```

21年目分のみの課税後利回りは元本に対して18.5%です。生活費として400万円必要だとすると 400万 / 18.5% = 2162万の元手をSP500のインデックスファンドに投資しておけば20年後には金利生活ができそうです。