生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

リスク込みで年利10%月5万円の積み立てを何年間継続すれば1億円になるかシミュレートしてみた

前回記事 リスクの影響考えて年利10%で月5万円の積み立てを30年間継続して得られる資産をシミュレートしてみた に引き続き、今度はリスク込みの運用で年利10%、毎月5万円積立で1億円達成に何年かかるのかをシミュレートしてみました。

運用シミュレーション

前回と同じく、利回りは正規分布に従う乱数(正規乱数)とし、1億円を達成するのに何年かかるのかをシミュレートしました。
今回はグラフ描画もRで行いました。(前回のようにExcelで描画してIllustratorで加工した方がきれいに描けますが)
結果を下に示します。
横軸はかかった年数、縦軸はその年数で1億円を達成する確率です。
それぞれのグラフの色は リスク2%:黒色 10%:青色 18%:緑色 30%:黄色 40%:赤色です。

リスクの大きさ 1億円達成年数の平均 30年以内に達成 40年以内に達成 50年以内に達成
2% 29.7年 85.0% 100% 100%
10% 30.7年 51.6% 98.4% 99.9%
18% 32.8年 44.3% 84.5% 96.8%
30% 38.7年 37.6% 64.1% 80.3%
40% 45.8年 33.2% 52.1% 65.9%

リスクが大きければ大きいほど、1億円達成年数の平均は長くなります。
30年以内に1億円を達成する確率はリスク2%(国内債券並のリスク)であれば85%と高いですが、リスク10%で半分程度に、それ以上のリスクだと半分以下の確率にまで下がってしまいます。
特に株式フルインベストメントのリスク18%を超える30%、40%といった高リスクでは、40年、50年かけても達成できない確率が20%以上あり無視できません。

Rのコード

下のコードをコピペすればシミュレーション実行、グラフ描画まで行われます。
(10万回のシミュレーション実行を行いますので結構時間がかかります。短時間ですませたい場合はsampleNum を小さく設定してください)

# 毎月一定額investPerMonthを積み立てて、
# 平均利回りmeanInterestRate
# 利回りの標準偏差(リスク)stdInterestRateで投資したときに
# 1億円を達成するまでの年数を計算する関数
#   各年の利回りは正規分布に従う乱数により計算される
#   yearMax年たっても達成できなければyearMaxを返す
yearsAchieve1oku <- function(investPerMonth, meanInterestRate, 
                             stdInterestRate, yearMax){
  total <- 0
  for(i in 1:yearMax){
    rate <- rnorm(1,mean=meanInterestRate, sd=stdInterestRate)
    total <- ((investPerMonth*12) + total) * (1+rate)
    if(total < 0) {
      total <- 0
    }
    if(total >= 100000000) {
      return(i)
    }
  }
  return(yearMax)
}

# 算出したヒストグラムから、x以下の値となる
# 確率を算出する関数
calcPercentLessX <- function(h, x){
  i <- 1;
  total <- 0;
  while(h$mids[i] < x){
    total <- total + h$counts[i]
    i <- i + 1
  }
  total <- total /  sum(h$counts)
}

# シミュレーション条件
yearMax <- 100            # 上限100年でシミュレート
sampleNum <- 100000       # 試行の回数10万回
years1Oku <- 1:sampleNum  # サイズsampleNumの配列を用意

# 平均年利回り10%、年利回りの標準偏差(=リスク)が2%の場合
for(i in 1:sampleNum){       # 投資シミュレートをsampleNum回繰り返す
  # 1億円達成までの年数をシミュレート
  years1Oku[i] <- (yearsAchieve1oku(50000, 0.1, 0.02,yearMax))
}
# 1年刻みででヒストグラムを作成して表示する
h2 <- hist(years1Oku, breaks=0:yearMax, xlim=c(0,yearMax))
mean(years1Oku)             # かかった年数の平均
(calcPercentLessX(h2, 30))   # 30年で達成できる確率
(calcPercentLessX(h2, 40))   # 40年で達成できる確率
(calcPercentLessX(h2, 50))   # 50年で達成できる確率


# リスクが10%の場合
for(i in 1:sampleNum){       # 投資シミュレートをsampleNum回繰り返す
  # 1億円達成までの年数をシミュレート
  years1Oku[i] <- (yearsAchieve1oku(50000, 0.1, 0.10, yearMax))
}
# 1年刻みででヒストグラムを作成して表示する
h10 <- hist(years1Oku, breaks=0:yearMax, xlim=c(0,yearMax))
mean(years1Oku)             # かかった年数の平均
(calcPercentLessX(h10, 30))   # 30年で達成できる確率
(calcPercentLessX(h10, 40))   # 40年で達成できる確率
(calcPercentLessX(h10, 50))   # 50年で達成できる確率


# リスクが18%の場合
for(i in 1:sampleNum){       # 投資シミュレートをsampleNum回繰り返す
  # 1億円達成までの年数をシミュレート
  years1Oku[i] <- (yearsAchieve1oku(50000, 0.1, 0.18, yearMax))
}
# 1年刻みででヒストグラムを作成して表示する
h18 <- hist(years1Oku, breaks=0:yearMax, xlim=c(0,yearMax))
mean(years1Oku)             # かかった年数の平均
(calcPercentLessX(h18, 30))   # 30年で達成できる確率
(calcPercentLessX(h18, 40))   # 40年で達成できる確率
(calcPercentLessX(h18, 50))   # 50年で達成できる確率


# リスクが30%の場合
for(i in 1:sampleNum){       # 投資シミュレートをsampleNum回繰り返す
  # 1億円達成までの年数をシミュレート
  years1Oku[i] <- (yearsAchieve1oku(50000, 0.1, 0.30, yearMax))
}
# 1年刻みででヒストグラムを作成して表示する
h30 <- hist(years1Oku, breaks=0:yearMax, xlim=c(0,yearMax))
mean(years1Oku)             # かかった年数の平均
(calcPercentLessX(h30, 30))   # 30年で達成できる確率
(calcPercentLessX(h30, 40))   # 40年で達成できる確率
(calcPercentLessX(h30, 50))   # 50年で達成できる確率


# リスクが40%の場合
for(i in 1:sampleNum){       # 投資シミュレートをsampleNum回繰り返す
  # 1億円達成までの年数をシミュレート
  years1Oku[i] <- (yearsAchieve1oku(50000, 0.1, 0.40, yearMax))
}
# 1年刻みででヒストグラムを作成して表示する
h40 <- hist(years1Oku, breaks=0:yearMax, xlim=c(0,yearMax))
mean(years1Oku)             # かかった年数の平均
(calcPercentLessX(h40, 30))   # 30年で達成できる確率
(calcPercentLessX(h40, 40))   # 40年で達成できる確率
(calcPercentLessX(h40, 50))   # 50年で達成できる確率


# 各リスクでの年数分布を重ねて表示する
yrange <- c(0, 0.12)  # 縦軸は0-12%で描画
plot( h2$intensities,type="b", ylim=yrange, col="black") # リスク2% 黒色
par(new=T)  # 前の図に次の図を重ねて描画
plot(h10$intensities,type="b", ylim=yrange, col="blue")   # リスク10%青色
par(new=T)
plot(h18$intensities,type="b", ylim=yrange, col="green")  # リスク18%緑色
par(new=T)
plot(h30$intensities,type="b", ylim=yrange, col="yellow3")# リスク30%黄色
par(new=T)
plot(h40$intensities,type="b", ylim=yrange, col="red")    # リスク40%赤色

Rクックブック

Rクックブック