🔥

新NISA:年始一括か毎月投資か

2023/12/30に公開

免責:素人なので色々検証が怪しいと思います。その旨ご了承ください。

検証目的

新NISAの投資枠が年間最大で360万となっている。一定額投資する場合、年始に一括で入金するか、毎月同じ額を投資するかの2つの方法が考えられる。MSCI ACWIを対象に2つの方法を比較した。配当の再投資は行うとする("Gross Index"データを使用)。為替リスクは無視する(USDで計算)。

検証結果

Load 432 month data
#Method       Ratio   Std     (Ratio-1)/Std
Buy once      1.09026 0.16253 0.55536
Buy over year 1.04814 0.09657 0.49852

年始に一括で投資すると、毎月投資に比べて4.2%の追加リターンが得られるがリスクが6.6%増える。(暴落を予測することは実質不可能だが、)暴落直前に一括投資してしまった場合は毎月投資より悪くなる。

  • 一括投資するとした場合、追加リターン / 追加リスク = 4.2 / 6.6 = 0.64
  • ACWI自体の(金利0%での)シャープレシオ(1 Year)は0.55536 ~= 0.56

よって、一括投資する決断は、ACWI自体より分が良い賭け。すなわち一括投資すべき。とは言えたいして変わらないので、為替リスクも考えつつ、好きに選べばよいと思います。

検証コード

コード
"""
一括で買うか、12か月間平均で買うかを比較
"""
import numpy as np
import matplotlib.pyplot as plt


CSV_PATH = "MSCI_AWCI_USD_Gross_Index.csv"

def conv(s):
    s = s.decode('utf-8').replace(",", "")
    return np.float64(s)

data = np.loadtxt(CSV_PATH, delimiter="\t", skiprows=1, usecols=1, 
                  converters={1: conv})
print(f"Load {len(data)} month data")

def buy_once(data):
    """はじめに一括で買って、1年後に確認(年始に一括投資)"""
    l = len(data)
    ratios = []
    for s in range(0, l - 12):
        ratio = data[s + 12] / data[s]
        ratios.append(ratio)
    # print(ratios)
    return np.mean(ratios), np.std(ratios, ddof=1), ratios

def buy_once_middle_of_year(data):
    """はじめに一括で買って、6か月後に確認(年の真ん中で一括投資)"""
    l = len(data)
    ratios = []
    for s in range(0, l - 12):
        ratio = data[s + 12] / data[s + 6]
        ratios.append(ratio)
    # print(ratios)
    return np.mean(ratios), np.std(ratios, ddof=1), ratios

def buy_over_year(data):
    """12か月、同じ額買って、1年後(12か月後)に確認"""
    l = len(data)
    ratios = []
    for s in range(0, l - 12):
        ratio = 0
        for ss in range(0, 12):
            ratio += (data[s + 12] / data[s + ss]) / 12.0
        ratios.append(ratio)
    # print(ratios)
    return np.mean(ratios), np.std(ratios, ddof=1), ratios

print(f"#Method               Ratio   Std     (Ratio-1)/Std")

# buy once
r, std, arr1 = buy_once(data.copy())
sharpe_ratio = (r - 1.0) / std
print(f"一括(年始)          {r:.5f} {std:.5f} {sharpe_ratio:.5f}")

# buy over  year
r, std, arr2 = buy_over_year(data.copy())
sharpe_ratio = (r - 1.0) / std
print(f"毎月                  {r:.5f} {std:.5f} {sharpe_ratio:.5f}")

# buy once at the middle of a year
r, std, arr3 = buy_once_middle_of_year(data.copy())
sharpe_ratio = (r - 1.0) / std
print(f"一括(一年の真ん中)  {r:.5f} {std:.5f} {sharpe_ratio:.5f}")

# plot
l = len(arr1)

plt.figure(figsize=(16, 8)) 
ax1 = plt.subplot(2, 1, 1)
plt.title("Return ratio after a year")
plt.plot(range(12, l + 12), arr1, label="buy once")
plt.plot(range(12, l + 12), arr2, label="buy over year")
plt.grid()
plt.legend()
plt.subplot(2, 1, 2, sharex=ax1)
plt.title("MSCI ACWI USD Gross Index")
plt.plot(range(l + 12), data)
plt.grid()
plt.savefig("graph.jpg")

追記

年始ではなく、年の真ん中(7か月目)で一括で買うパターンも検証した。毎月とほぼ同じ期待リターンで、リスクは増えている。

#Method              Ratio   Std     (Ratio-1)/Std
一括(年始)         1.09026 0.16253 0.55536
毎月                 1.04814 0.09657 0.49852
一括(一年の真ん中)  1.04424 0.11139 0.39720

まとめると

  • "毎月"は"一括(一年の真ん中)"とほぼ同じリターンで、リスクを減らす(0.111→0.096)
  • "一括(年始)"は"一括(一年の真ん中)"に比べてリターンもリスクも増える
  • 比較すると、"一括(年始)"が一番良い

毎月買うことで得られるリスク減少のメリットより、半年程早く投資できるメリットのほうが大きいと言える。

Discussion