投資シミュレーションプログラムを作ってみた【Rでプログラミング】

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

こんにちは、毛糸です。

投資にはリスクがあります。

自分の資産が将来どれくらいの金額になるのか、リタイアまでにどれくらいの資産を築けるのか、といった疑問に、現時点で確定した答えを出すのは不可能です。

しかし、投資データと統計学を用いて、将来をシミュレーションすることは可能です。

私は大学院で金融工学を専攻し、公認会計士として日々数字と向き合う仕事をしながら、プログラミングを勉強して投資意思決定に使えるツールを開発して遊んでいます。

今回はそんな日々の勉強の成果として「投資シミュレーションプログラム」を作ってみました。

将来に渡って投資を行っていった場合に、数年・数十年後にいくらの資産が築けるかをシミュレーションするプログラムです。

この記事では「投資シミュレーションプログラム」のコードをすべて公開し、その使いかたを解説します。

統計プログラミング言語Rと、オンラインでの利用

統計プログラミング言語Rは、データサイエンスで用いられるプログラミング言語です。

統計解析や計算を簡単に行うことができ、計算機としても使えます。

本記事ではプログラミング言語Rを用いて、投資シミュレーションプレミアムを作成します。

Rを使うには、本来RのソフトウェアをPCにインストールする必要がありますが、今回はちょっとした計算に使うのみなので、ブラウザ上で完結するR onlineを利用します。
参考記事:ブラウザ上でRプログラミング(R online、Rオンラインを使う方法)

R onlineのサイト(リンク)でコードを打ち込めば、すぐにRによる計算が実行できます。

試しにサイト上で
1+1
と入力し、[Run it]してみると、すぐに下の方に計算結果が表示されます。

以下、このR onlineを使って、「投資シミュレーションプログラム」作成します。

すでに打ち込んである内容は、すべて削除して構いません。

投資シミュレーションプログラムの流れとモンテカルロ・シミュレーション

「投資シミュレーションプログラム」は、以下のような流れでシミュレーションを行い、将来の投資額の予測値や確率分布を算出します。
  1. 投資のリターンやリスクなどの前提条件を入力する
  2. 時間ステップ(年単位、日単位など)ごとに「乱数」を発生させ、ランダムな収益率をシミュレーションする
  3. 複利計算により将来の資産額を算出する
  4. 以上を数千、数万回繰り返し、確率論的に将来資産額の推定値を算出し確率分布を予測する
このように、乱数を用いて将来を予測しシミュレーションする方法を「モンテカルロ・シミュレーション(モンテカルロ法)」といいます。

モンテカルロ・シミュレーションは金融実務において非常に重要な手法として認知されており、金融機関においてデリバティブの価格計算やリスク管理などに用いられています。

「投資シミュレーションプログラム」はモンテカルロ・シミュレーションを使って、将来の資産額がどれくらいになるかを予測するプログラムです。

「投資シミュレーションプログラム」のコードは以下にすべて記しており、コードをR onlineにコピー&ペーストするだけでシミュレーションを行うことが出来ます。

モンテカルロ法は統計学・確率論を基礎として、プログラミング言語を用いながら、ファイナンスの知識をフル活用する高度な手法です。下記書籍はそんなモンテカルロ法を基礎から学べる良書ですので、気になる方は是非手にとってみてください(本書が理解できれば投資シミュレーションプログラムはゼロから自作できます)。


インプット情報の入力

まず、シミュレーションに必要な情報を入力します。

投資年数を入力します。以下では年単位で入力することとし、40年間の投資をシミュレーションしてみますが、自由に変更して構いません。

#投資年数(自由入力)
Year<-40

シミュレーション回数を入力します。今回シミュレーションに使用するのは金融工学で用いられる「モンテカルロ法」という手法で、統計学の「大数の法則」に従っています。シミュレーション回数が多いほど「正確な」計算ができますが、計算に時間がかかるようになります。100回や1000回程度だと、シミュレーションの都度、結果がばらつきます。

#シミュレーション回数(自由入力、多いほど正確だが時間がかかる)
sample<-10000

「投資シミュレーションプログラム」では毎年のリターンが確率的に決まるような状況で、資産額がどのように変化するかをシミュレーションするものです。そのために、シミュレーションの数値を格納する「箱」を用意し、ここに数値を格納します。「箱」は数学用語でいうところの行列にあたります。

#シミュレーション数値を格納する行列
A<-matrix(0,sample,Year+1)

初期投資額を入力します。投資元本(元手)は自由に決めて構いません。単位も問いません(今回は2000万円のつもりで2000を入力します)。

#初期投資額を入力(自由入力)
initial<-2000

先ほど作成したシミュレーション数値格納用の「箱」に初期投資額を代入します。

#シミュレーション数値に初期投資額を入力
A[,1]<-initial

投資の期待リターンを入力します。ここでは一年あたりの期待収益率を入力します。今回は投資の年あたり期待リターンを7%として計算します。

#期待リターン(期待収益率μ、自由入力)
mu<-7/100

投資のリスクを入力します。今回は米国株式に連動して値動きする投資信託VTIのリスク(標準偏差)としての概算値12.88%(12.88/100)を入力します(参考ページリンク)。

#リスク(標準偏差σ、自由入力)
sigma<-12.88/100

「投資シミュレーションプログラム」では、各年の投資収益率が既に入力したリターンとリスクに基づいた正規分布に従うと仮定し、正規分布に従う確率変数(乱数)を多数発生させて将来を予測します。Rではrnorm()で正規分布に従う乱数を生成することが出来ます。この正規乱数を、投資年数×シミュレーション回数の分だけ作ります。

#乱数を生成(ランダムな投資収益率)
x<-rnorm(sample*Year,mu,sigma)

次に、生成した乱数を計算に適した行列形式に整えます。

#乱数(ランダムな収益率)を行列形式に変換
z<-matrix(x,sample,Year)

ではシミュレーションを初めましょう。シミュレーションはsample回行います。各シミュレーションにおいて、1年ごとに資産額を算出します。今年の資産額=前年の資産額×(1+収益率)で計算できます。この計算をRのfor文(繰り返し文)を用いて行います。

#シミュレーション開始
for (s in 1:sample){
        for ( t in 1:Year){
            #今年の資産額=前年の資産額*(1+収益率)
            A[s,t+1]<-A[s,t]*(1+z[s,t])
        }
}

シミュレーションの結果、つまり投資期間経過後の資産額はA[,Year+1]という「箱」に収められています。

シミュレーションでは、良い投資結果を収めたシナリオもあれば、ほとんど儲からなかったケースもあります。全体的な「傾向」を知るためには、シミュレーション結果の平均や中央値を計算します。

#シミュレーション結果の期待値を表示
paste(Year,"年後の資産額の期待値は",mean(A[,Year+1]))
#シミュレーション結果の中央値を表示
paste(Year,"年後の資産額の中央値は",median(A[,Year+1]))

投資期間経過後の資産額はA[,Year+1]に格納されていますので、ここから将来の資産額の分布を用いた様々な確率の計算が可能です。

たとえば将来の資産額が初期投資額を下回るような確率(つまり投資で損失が発生する確率)も計算できます。

#損する確率を表示
paste("損失を被る確率は",length(A[,Year+1][A[,Year+1]<initial])/sample)
ヒストグラムを描くことで、将来の資産額の確率分布をビジュアル的に知ることも出来ます。
#将来の資産額の確率分布(ヒストグラム)を表示
hist(A[,Year+1])

この結果は乱数を用いたものなので、このプログラムを走らせるたびに結果が変わります。乱数の変動性を取り除きたい(つまりより高い精度で計算したい)場合は、sampleの数を増やしてください。

今回の例では、年あたりの収益率が期待リターン7%、リスク(標準偏差)12.88%の正規分布に従うような投資機会に、当初一括で2,000万円を投資した場合に、40年後の資産額の期待値が約3億円となることがわかりました。

まとめ

モンテカルロ・シミュレーションで将来の資産額を推計する「投資シミュレーションプログラム」を作成しました。
以下がそのコードの全体像です。
#投資年数(自由入力)
Year<-40
#シミュレーション回数(自由入力、多いほど正確だが時間がかかる)
sample<-10000
#シミュレーション数値を格納する行列
A<-matrix(0,sample,Year+1)
#初期投資額を入力(自由入力)
initial<-2000
#シミュレーション数値に初期投資額を入力
A[,1]<-initial
#期待リターン(期待収益率μ、自由入力)
mu<-7/100
#リスク(標準偏差σ、自由入力)
sigma<-12.88/100
#乱数を生成(ランダムな投資収益率)
x<-rnorm(sample*Year,mu,sigma)
#乱数(ランダムな収益率)を行列形式に変換
z<-matrix(x,sample,Year)
#シミュレーション開始
for (s in 1:sample){
        for ( t in 1:Year){
            #今年の資産額=前年の資産額*(1+収益率)
            A[s,t+1]<-A[s,t]*(1+z[s,t])
        }
}
#シミュレーション結果の期待値を表示
paste(Year,"年後の資産額の期待値は",mean(A[,Year+1]))
#シミュレーション結果の中央値を表示
paste(Year,"年後の資産額の中央値は",median(A[,Year+1]))
#損する確率を表示
paste("損失を被る確率は",length(A[,Year+1][A[,Year+1]<initial])/sample)
#将来の資産額の確率分布(ヒストグラム)を表示
hist(A[,Year+1])
このプログラムを使うことで、将来の資産額の推計につかったり、将来資産を10倍にするために必要なリターンを探したり、投資で損失が出る確率を知ってリスク管理に活かすことも出来ます。
今後このプログラムを更に発展させていきたいと思います。

もし「こんな使い方もできる!」「こんな内容も知れたらいいな」といったアイデアがあれば、是非教えてください

参考文献

「投資シミュレーションプログラム」はモンテカルロ・シミュレーションという手法に基づく予測を行っております。モンテカルロ・シミュレーションを投資に活用するためには、統計学・プログラム・ファイナンスの知識が必要になりますが、下記書籍はそれらを必要な範囲で解説しており、優れた良書です。

プログラミング言語Rを使ってファイナンスや投資の問題を分析するテキストとして、下記が参考になります。

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

SNSでもご購読できます。

コメントを残す

*