投資シミュレーションプログラムを高速化してみた

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、毛糸です。

先日、投資の将来予測を行うためのRプログラム「投資シミュレーションプログラム」を公開しました。
>>投資シミュレーションプログラムを作ってみた【Rでプログラミング】

このプログラムを用いて、年金の将来予測を行ったり、FXで億り人になれる確率を計算したりしました。

>>将来の年金積立金の状況と損失確率をシミュレーションしてみた【モンテカルロ・シミュレーション】

>>FXの期待リターン、億り人になれる確率、破産する確率【モンテカルロ・シミュレーション】

「投資シミュレーションプログラム」を使ってみる中で、より「速く」計算するための改善策を思いついたのでメモしておきます。

本記事では投資シミュレーションプログラム1.1(2019年5月29日現在の最新版)の内容を説明します。

Rプログラムを速くするための方法:ベクトル化

統計プログラミング言語Rは、ベクトル演算を高速で行える言語として知られています。

ここではベクトルを「数値やモノ(オブジェクト)を並べたもの」と理解しておけば十分です。

ベクトル演算が高速で行える、とは、具体的には、for文などを用いて一つ一つの対象(オブジェクト)を順繰りに処理していくよりも、ベクトルというまとまりに対して一括で処理を行うほうが速い、ということです。

投資シミュレーションプログラムでは、乱数をサンプル数×年数の数だけ発生させ、

  1. あるサンプルについて、各年の資産額をfor文で計算して
  2. その処理をサンプル数の数だけfor文で繰り返す
という、2重のfor文構造になっています。
しかし、Rはfor文よりもベクトルとして計算したほうが速いため、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の処理時間の比較

ベクトル化によりどれくらい高速化されたのか検証してみましょう。

R onlineでは実行時間が自動計測されますので、これを利用します(手持ちのPCで実行する場合はtitocライブラリを使ったりsystem.timeを使ってください)。

サンプル数100,000(10万)回のシミュレーションで、for文を使って計算するVer.1.0と、ベクトル演算を行うVer.1.1を比較すると、以下のようになりました。

投資シミュレーションプログラムVer.1.0(for文による繰り返し計算)

Absolute running time(絶対実行時間)は、17.18秒でした。

投資シミュレーションプログラムVer.1.1(ベクトル演算)

Absolute running time(絶対実行時間)は、1.46秒でした。

Ver.1.0からVer1.1に改善した場合の処理速度は1/10以上に縮まりました、驚異的な改善です。

まとめ

Rというプログラミング言語はベクトル演算を得意としており、for文をベクトル演算に書き換えられれば大幅な効率化に繋がります。

「動けばOK」という段階から一歩進んで、より速いプログラムを目指したいと思います。

本記事は、以下の書籍を参考にしました。Rを用いたデータ分析や投資意思決定に役立つ知識が豊富に紹介されており、とてもおすすめです。

(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”});

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*