積立投資をシミュレーションするプログラムを作った(投資シミュレーションプログラムVer2)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
こんにちは、毛糸です。
先日開発した「投資シミュレーションプログラム」は、年金運用やFXなど幅広い投資活動の分析に役立っています。
最初のバージョン以降、レバレッジと撤退の意思決定を考慮したり、ベクトル演算による高速化を行うなど、改善を続けてきました。
しかしながら、投資シミュレーションプログラムは実際の投資活動をリアルに分析するツールとしてはまだ不十分です。
今回、投資シミュレーションプログラムを更に改良し、積立投資の分析ができるようなプログラムにアップグレードしたので、その内容を解説します。

 

投資シミュレーションプログラムver2の改善点

今回アップデートする投資シミュレーションプログラムでは、「追加投資」の分析が行えるようになります。
従来の投資シミュレーションプログラムでは、投資期間を決めたら、期初に一括投資を行い、その後資金の出し入れは行わない前提で計算を行っていました。
しかし、実際の投資活動においては、投資資金の出し入れが行われることが通常であり、広く利用されている投資手法であるドルコスト平均法も、定期的な積立を行うものです。
今回アップデートする投資シミュレーションプログラムでは、投資期間中の資金の出入りスケジュールを計算に織り込むことができるようにします。
これにより、追加投資や引き出し、積立投資など、より現実的な分析が可能になります。
参考記事>>ドルコスト平均法の検証が難しい理由

コード例

投資シミュレーションプログラムでは、投資スケジュールを設定することで、投資期間中の追加投資や資金の引き出しが可能になります。
具体的には、投資スケジュールを時間区分の数だけ設定し、これを期中の投資時価に反映させます。
最終的な投資時価は期中の投資スケジュールを反映させたものになり、この投資時価を何万パターンも発生させることで、将来をシミュレーションします。

資金の出入りを反映させるに伴い、まず期間を原則として月数とするようにし、投資月数をhorizonという変数に格納します。

#投資年数(自由入力)
Year<-1
#1年あたりの月数(通常は12)
Month_par_year<-12
#投資月数
horizon<-Year*Month_par_year#monthes

また、投資期間中の資金の出入りを、inv_schedule変数に格納します。たとえば、毎月1万円の積立投資を行う場合には、指定した数字を繰り返す関数rep()を用いて、以下のように記述します。

#投資スケジュールを入力(自由入力)
inv_schedule<-rep(1,horizon)

投資のリスク・リターンも、月次ベースに直します。

#年率期待リターン(期待収益率μ、自由入力)
mu<-7/100
mu_par_month<-mu/Month_par_year
#年率リスク(標準偏差σ、自由入力)
sigma<-12.88/100
sigma_par_month<-sigma/(Month_par_year)^0.5

シミュレーションを行う繰り返し計算の部分に、前述のinv_scheduleの各要素を足すように変更します。

#シミュレーション開始
for (s in 1:sample){
        for ( t in 1:horizon){
            #撤退していれば計算を飛ばす
            if(W[s]==1) break
            #今年の資産額=前年の資産額*(1+レバ比率*収益率)
            A[s,t+1]<-A[s,t]*(1+Lev*z[s,t])+inv_schedule[t]
            #もし資産額が撤退額を下回ったら撤退目印を立てる
            if(A[s,t+1]<Withdraw)W[s]<-1
        }
}
以上を加味した、投資シミュレーションプログラムver2.0のコードは以下のとおりです。
#投資年数(自由入力)
Year<-1
#1年あたりの月数(通常は12)
Month_par_year<-12
#投資月数
horizon<-Year*Month_par_year#monthes
#シミュレーション回数(自由入力、多いほど正確だが時間がかかる)
sample<-1000
#シミュレーション数値を格納する行列
A<-matrix(0,sample,horizon+1)
#初期投資額を入力(自由入力)
initial<-1000
#投資スケジュールを入力(自由入力)
inv_schedule<-rep(1,horizon)
#シミュレーション数値に初期投資額を入力
A[,1]<-initial
#年率期待リターン(期待収益率μ、自由入力)
mu<-7/100
mu_par_month<-mu/Month_par_year
#年率リスク(標準偏差σ、自由入力)
sigma<-12.88/100
sigma_par_month<-sigma/(Month_par_year)^0.5
#レバレッジ比率
Lev<-1
#撤退をカウントする目印
W<-rep(0,sample)
#撤退額を設定
Withdraw<-0
#乱数を生成(ランダムな投資収益率)
set.seed(1234)
x<-rnorm(sample*horizon,mu_par_month,sigma_par_month)
#乱数(ランダムな収益率)を行列形式に変換
z<-matrix(x,sample,horizon)
#シミュレーション開始
for (s in 1:sample){
        for ( t in 1:horizon){
            #撤退していれば計算を飛ばす
            if(W[s]==1) break
            #今年の資産額=前年の資産額*(1+レバ比率*収益率)
            A[s,t+1]<-A[s,t]*(1+Lev*z[s,t])+inv_schedule[t]
            #もし資産額が撤退額を下回ったら撤退目印を立てる
            if(A[s,t+1]<Withdraw)W[s]<-1
        }
}
#シミュレーション結果の期待値を表示
paste(Year,"年後の資産額の期待値は",mean(A[,horizon+1]))
#シミュレーション結果の中央値を表示
paste(Year,"年後の資産額の中央値は",median(A[,horizon+1]))
#損する確率を表示
paste("損失を被る確率は",length(A[,horizon+1][A[,horizon+1]<initial])/sample)
#億り人になれる確率を表示
paste("億り人になれる確率は",length(A[,horizon+1][A[,horizon+1]>10000])/sample)
#破産する確率を表示
paste("破産する確率は",sum(W)/sample)
#将来の資産額の確率分布(ヒストグラム)を表示
hist(A[,Year+1])

 

まとめ

投資シミュレーションプログラムをアップデートし、期中の資金の出入りを考慮できるようになりました。
これにより、積立投資のシミュレーションや、資金の引き出しについての分析が行なえます。
具体的なシミュレーションの例は、近日公開予定です。
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*