こんにちは、毛糸です。
先日、投資の将来予測を行うためのRプログラム「投資シミュレーションプログラム」を公開しました。
>>投資シミュレーションプログラムを作ってみた【Rでプログラミング】
このプログラムを用いて、年金の将来予測を行ったり、FXで億り人になれる確率を計算したりしました。
>>将来の年金積立金の状況と損失確率をシミュレーションしてみた【モンテカルロ・シミュレーション】
>>FXの期待リターン、億り人になれる確率、破産する確率【モンテカルロ・シミュレーション】
「投資シミュレーションプログラム」を使ってみる中で、より「速く」計算するための改善策を思いついたのでメモしておきます。
本記事では投資シミュレーションプログラム1.1(2019年5月29日現在の最新版)の内容を説明します。
目次
Rプログラムを速くするための方法:ベクトル化
統計プログラミング言語Rは、ベクトル演算を高速で行える言語として知られています。
ここではベクトルを「数値やモノ(オブジェクト)を並べたもの」と理解しておけば十分です。
ベクトル演算が高速で行える、とは、具体的には、for文などを用いて一つ一つの対象(オブジェクト)を順繰りに処理していくよりも、ベクトルというまとまりに対して一括で処理を行うほうが速い、ということです。
投資シミュレーションプログラムでは、乱数をサンプル数×年数の数だけ発生させ、
- あるサンプルについて、各年の資産額をfor文で計算して
- その処理をサンプル数の数だけfor文で繰り返す
投資シミュレーションプログラムのベクトル化
下記に示す投資シミュレーションプログラム1.1は資産額をベクトル化して計算することで、サンプルの繰り返し計算を回避しています。
#投資年数(自由入力) Year<-40 #シミュレーション回数(自由入力、多いほど正確だが時間がかかる) sample<-100000 #シミュレーション数値を格納する行列 A<-matrix(0,sample,Year+1) #初期投資額を入力(自由入力) initial<-2000 #シミュレーション数値に初期投資額を入力 A[,1]<-initial #期待リターン(期待収益率μ、自由入力) mu<-7/100 #リスク(標準偏差σ、自由入力) sigma<-12.88/100 #シミュレーション開始 #sampleの計算は明示せずベクトル化 for ( t in 1:Year){ #今年の資産額=前年の資産額*(1+収益率) A[,t+1]<-A[,t]*(1+rnorm(sample,mu,sigma)) } #シミュレーション結果の期待値を表示 paste(Year,"年後の資産額の期待値は",mean(A[,Year+1]))
投資シミュレーションプログラム1.0と1.1の処理時間の比較
投資シミュレーションプログラムVer.1.0(for文による繰り返し計算)
投資シミュレーションプログラムVer.1.1(ベクトル演算)
まとめ
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName(“body”)[0],e.appendChild(d))})
(window,document,”script”,”//dn.msmstatic.com/site/cardlink/bundle.js”,”msmaflink”);
msmaflink({“n”:”ファイナンスのためのRプログラミング証券投資理論の実践に向けて”,”b”:””,”t”:””,”d”:”https://images-fe.ssl-images-amazon.com”,”c_p”:””,”p”:[“/images/I/41UrHrQ9vlL.jpg”],”u”:{“u”:”https://www.amazon.co.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AER%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E2%80%95%E8%A8%BC%E5%88%B8%E6%8A%95%E8%B3%87%E7%90%86%E8%AB%96%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6%E2%80%95-%E5%A4%A7%E5%B4%8E-%E7%A7%80%E4%B8%80/dp/4320110447″,”t”:”amazon”,”r_v”:””},”aid”:{“amazon”:”1251300″,”rakuten”:”1249750″,”yahoo”:”1251299″},”eid”:”mcwYY”});