鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

ドルコスト投資は本当に得するかPerlでシュミレーションしたら、驚愕の結果

401kでドルコスト平均法投資をした場合、
本当に得するのか見てみたくなった。

標準偏差を求めるperl関数 - *「ふっかつのじゅもんがちがいます。」withぬこ

結果やいかに・・・

use strict;
use warnings;

sub calc{
  my $year = shift;
  my $income = shift;
  my $alg = shift;
  my $total = 0;
  my $amount = 0;
  my $total_cost = 0;
  for my $i ( 1.. $year * 12){
    my $value = 10000 + int (rand(10000));
    ($amount, $total, my $cost) = &$alg($income,$amount,$value);
    $total_cost = $total_cost + $cost;
  }
  return ($total, $total_cost);
};

sub total{
  my $result = 0;
  for(@_){
    $result += $_;
  }
  $result;
}

sub average{
  total(@_) / @_;
}

sub toukei {
    my $num = scalar(@_) or return 0;
    my $ave = average(@_);
    my $ret = 0;
    while(@_){
        my $i = shift;
        $ret += ($i-$ave)**2;
    }
    return ($ave, sqrt($ret/$num));
}

my $dol_cost = sub {

  my $income = shift;
  my $amount = shift;
  my $value = shift;

  $amount = $amount + ($income / $value);
  my $cost = $amount * (1.0 / 12) / 100; #信託報酬年率1%分減算
  $amount = $amount - $cost; 
  return ($amount, $amount * $value, $cost * $value);

};

my $teikiyokin = sub {

  my $income = shift;
  my $amount = shift;
  my $value = shift;
  my $cost = shift;
  
  $amount = $amount + $income;
  return ($amount, $amount, 0);

};

my @sum_result = ();
my @cost_result = ();
for my $i (1.. 1000){
  my ( $total, $total_cost) = calc(17,10000,$dol_cost);
  push @sum_result, $total;
  push @cost_result, $total_cost;
}

my ($ave, $hensa) = toukei(@sum_result);
printf "dol_cost ave=%d,hensa=%d\n", $ave,$hensa;

($ave, $hensa) = toukei(@cost_result);
printf "dol_cost cost ave=%d,hensa=%d\n", $ave,$hensa;

@sum_result = ();
@cost_result = ();
for my $i (1.. 1000){
  my ($total, $total_cost) = calc(17,10000,$teikiyokin);
  push @sum_result, $total;
  push @cost_result, $total_cost;
}

($ave, $hensa) = toukei(@sum_result);
printf "teikiyokin ave=%d,hensa=%d\n", $ave,$hensa;
($ave, $hensa) = toukei(@cost_result);
printf "dol_cost cost ave=%d,hensa=%d\n", $ave,$hensa;

dol_cost ave=1952110,hensa=375455
dol_cost cost ave=171348,hensa=2678
teikiyokin ave=2040000,hensa=0
dol_cost cost ave=0,hensa=0

基準価格が1万円から2万円のランダムの値を取るとして、1月1万円、17年間
ドルコストで投資したものと。毎月1万円ゼロ金利の定期預金に預けた場合を比較。

信託報酬を1%という甘目のシュミレーションしてみましたが、驚愕の結果。

平均値で、すでに定期預金金利0に負けている。標準偏差
考えると50%以上の確率で195万より少ないすなわちゼロ金利の定期預金より損をするということで。
絶対もうかるのは信託報酬をもらう金融機関ということに。17万円の儲け。

信託報酬を2%にしたら・・・
もう勘弁してください。平均で20万円の損。つまり50%以上の確率で20万円損する。

$ perl test.pl
dol_cost ave=1800125,hensa=346821
dol_cost cost ave=324726,hensa=5043
teikiyokin ave=2040000,hensa=0
dol_cost cost ave=0,hensa=0