プログラミング

日本株式、米国株式、欧州株式、全世界株式の日次リターンが正規分布ではなかった件

こんにちは、毛糸です。

先日、ファーマ−フレンチの3ファクターモデルのデータが無料で手に入るという記事を書きました。
>>ファーマ-フレンチの3ファクターモデルのデータを入手する方法


ここで手に入るデータには、市場ポートフォリオのリターンデータが含まれています。

本記事ではこの市場ポートフォリオのリターンデータが、ファイナンスでしばしば仮定される「正規分布」に従わないことを確かめてみます。

日本、アメリカ、ヨーロッパ、全世界の市場ポートフォリオ

ファーマ−フレンチの3ファクターモデルに用いるヒストリカルデータには、市場ポートフォリオの日次リターンが含まれます。
市場ポートフォリオとは、各地域の時価加重平均ポートフォリオのことです。
フレンチ教授のwebページから取得できるデータの中で、Mkt-RFというのが市場ポートフォリオのリターンと安全資産リターン(米国短期証券)の差を表しており、別にあるRFの列を足してやることで、市場ポートフォリオのリターンが計算できます(通貨は米ドル建てです。
市場ポートフォリオは各地域の株式市場の時価総額を反映した指数ですから、日本、アメリカ、ヨーロッパ、全世界の各市場の株式指数と考えて良いでしょう。
データは1990/7/2から2019/4/30までの7,522日分あります。
以下では各地域の市場ポートフォリオデータをもとに、株価の日次リターンの平均(期待リターン)、標準偏差(リスク)、歪度と尖度を計算し、日次リターンが正規分布に従うかを確かめます。
本記事の分析手法は、下記記事を参考にしています。
分析には統計プログラミング言語Rを用います。Rの使い方や投資理論への活用については、下記書籍が参考になります。


日本株式のリターン、リスク、正規性

mean()関数を使って計算した日本株式の日次期待リターンは0.01%、1年250営業日を乗じて計算する年率換算の期待リターンは3.8%でした。
sd()関数を使って計算した日本株式の日次リスクは1.37%、1年250営業日の平方根を乗じて計算する年率換算のリスクは21.7%でした。
分布の偏りを示す歪度は0.12(正規分布ならば0)、分布の尖り具合を示す尖度は 8.2(正規分布ならば3)でした。
データが正規分布に従うかを示すシャピロ・ウィルク検定を実施したところ、「正規分布に従う」という帰無仮説は棄却され、日本株式の日次データは統計的には正規分布に従わないことがわかりました。
データをQ-Qプロットしてみたところ、正規分布であればデータは一直線に並ぶべきところ、以下のようになりました。

米国株式のリターン、リスク、正規性

mean()関数を使って計算した日本株式の日次期待リターンは0.04%、1年250営業日を乗じて計算する年率換算の期待リターンは10.5%でした。
sd()関数を使って計算した日本株式の日次リスクは1.06%、1年250営業日の平方根を乗じて計算する年率換算のリスクは16.8%でした。
分布の偏りを示す歪度は-0.21(正規分布ならば0)、分布の尖り具合を示す尖度は 11.6(正規分布ならば3)でした。
データが正規分布に従うかを示すシャピロ・ウィルク検定を実施したところ、「正規分布に従う」という帰無仮説は棄却され、米国株式の日次データは統計的には正規分布に従わないことがわかりました。
データをQ-Qプロットしてみたところ、正規分布であればデータは一直線に並ぶべきところ、以下のようになりました。

欧州株式のリターン、リスク、正規性

mean()関数を使って計算した日本株式の日次期待リターンは0.03%、1年250営業日を乗じて計算する年率換算の期待リターンは3.8%でした。
sd()関数を使って計算した日本株式の日次リスクは1.11%、1年250営業日の平方根を乗じて計算する年率換算のリスクは8.1%でした。
分布の偏りを示す歪度-0.14(正規分布ならば0)、分布の尖り具合を示す尖度は 10.5(正規分布ならば3)でした。
データが正規分布に従うかを示すシャピロ・ウィルク検定を実施したところ、「正規分布に従う」という帰無仮説は棄却され、欧州株式の日次データは統計的には正規分布に従わないことがわかりました。
データをQ-Qプロットしてみたところ、正規分布であればデータは一直線に並ぶべきところ、以下のようになりました。

全市場株式のリターン、リスク、正規性

mean()関数を使って計算した日本株式の日次期待リターンは0.03%、1年250営業日を乗じて計算する年率換算の期待リターンは7.8%でした。
sd()関数を使って計算した日本株式の日次リスクは0.87%、1年250営業日の平方根を乗じて計算する年率換算のリスクは13.8%でした。
分布の偏りを示す歪度-0.25(正規分布ならば0)、分布の尖り具合を示す尖度は 10.7(正規分布ならば3)でした。
データが正規分布に従うかを示すシャピロ・ウィルク検定を実施したところ、「正規分布に従う」という帰無仮説は棄却され、全世界株式の日次データは統計的には正規分布に従わないことがわかりました。
データをQ-Qプロットしてみたところ、正規分布であればデータは一直線に並ぶべきところ、以下のようになりました。

まとめ

フレンチ教授が公開している市場ポートフォリオの日次データを使って、日本、アメリカ、ヨーロッパ、全世界の株式リターンの分析を行いました。
その結果、いずれの地域でも、日次リターンは正規分布に従わないことがわかりました。
ファイナンスの多くの研究ではリターンは正規分布に従うと仮定されていますが、実際のデータはそうではないようです。
本ブログでたびたび登場する「投資シミュレーションプログラム」はリターンが正規分布に従うことを仮定していますので、本記事の結果を重く受け止めるならば、改善する必要があります。
この点については、近く改良版を公開しますので、ご期待下さい。

Rで多次元正規分布に従う乱数を生成する(年金運用の例題付き)

こんにちは、毛糸です。

ファイナンス(金融工学)において、正規分布は資産の収益率をモデル化するために頻繁に用いられます。

投資対象となる資産は通常1つだけではなく、複数資産を扱いたいことも多いですから、その場合には多次元の正規分布を考えなければなりません。

本記事では統計プログラミング言語Rで多次元正規分布に従う確率変数ベクトルを生成する方法について説明します。

ライブラリ「MASS」による多次元(多変量)正規分布の乱数発生

多次元(多変量)正規分布に従う確率変数ベクトルは、多変量解析用パッケージのMASSのmvrnorm()を使って発生させることが出来ます(公式リファレンスのPDFはこちら)。

mvrnorm()は、発生させる確率変数ベクトルの個数n、期待値ベクトルmu、分散共分散行列Sigmaを与え、n組の確率変数ベクトルを返す関数です。

例えば、( mu=(1,1))、分散共分散行列( Sigma=left(  begin{array}{cc}1&0\0&1end{array}right))の2次元正規分布に従う確率変数( (x_1,x_2))を発生させるには、以下のように記述します。

#MASSライブラリを読み込む
library(MASS)
#期待値ベクトル
mu0<-c(1,1)
#分散共分散行列
Sigma0<-rbind(
  c(1,0),
  c(0,1)
)
#多次元正規分布に従う確率変数ベクトルを1組発生
mvrnorm(1,mu0,Sigma0)
#[1]  1.8590647 -0.6548381

参考>> 元データ分析の会社で働いていた人の四方山話_多変量正規分布

例題:年金資産の収益率

MASSライブラリを用いた多次元正規分布の乱数発生方法がわかったところで、応用例を考えてみましょう。
私たちの年金運用のシミュレーションです。
年金積立金は4つのリスク資産に投資されており、その収益率は正規分布に従うと仮定されています。
期待収益率と分散、相関係数の推定値は公表されており、これに基づいて投資が行われています。

(出所:https://www.gpif.go.jp/gpif/portfolio.html)

年金の期待収益率(投資4資産+余剰資金の短期資産と賃金上昇率の6次元)と分散共分散行列から、年金資産の収益率を乱数として発生させてみましょう。

分散共分散行列( Sigma)については、標準偏差ベクトル( S=(sigma_1,cdots,sigma_n))と相関係数行列( P)を用いて

[ begin{split}
Sigma=diag(S) cdot P cdot diag(S)
end{split} ]で表せます。ただし( diag(S))は( S)を対角成分に持つ対角行列で、「( cdot)」は通常の行列積(Rでは%*%)です。

#各資産クラスの期待リターン
mu<-c(2.6/100, 6.0/100, 3.7/100, 6.4/100, 1.1/100)
#各資産クラスの分散(標準偏差の2乗)
sigma<-c(0.047,0.251,0.126,0.273,0.005)
#相関行列
Rho<-rbind(
    c(1,-0.16,0.25,0.09,0.12),
    c(-0.16,1,0.04,0.64,-0.1),
    c(0.25,0.04,1,0.57,0.15),
    c(0.09,0.64,0.57,1,-0.14),
    c(0.12,-0.1,-0.15,-0.14,1))
#分散対角行列
sigma_diag<-diag(sigma)
#分散共分散行列
Sigma<-sigma_diag%*%Rho%*%sigma_diag
#多次元正規分布の発生
X <- mvrnorm(10000, mu, Sigma)

結果の確認

こうして得られた6次元確率変数ベクトルの1万個について、標本平均と標本標準偏差を計算すると、大数の法則により、パラメタとして与えたmuとsigmaに近くなるはずです。

Xは、行にサンプル数n、列に確率変数ベクトルの要素が並んでいます。列に対して平均meanと標準偏差sdを適用するには、apply(X,MARGIN=2,mean)という関数を使います。MARGIN=1はXの「列」方向に関数を適用するという意味です。
参考>>24. apply() ファミリー

#各要素の平均を計算(経済中位ケース)
apply(X,2,mean)*100
#[1] 2.591798 5.739046 3.773379 6.390514 1.097378 2.793776
#各要素の標準偏差を計算
apply(X,2,sd)*100
#[1]  4.6795340 25.1717768 12.6962985 27.2644081  0.5005285  1.9114364

いずれも理論値に近い値になっています。

まとめ

MASSライブラリを用いて多次元正規分布に従う確率変数ベクトルを生成する方法をまとめました。
多次元正規分布はファイナンスにおいてよく目にするため、しっかり使いこなせるようにしておきましょう。

ドルコスト平均法と一括投資の比較シミュレーション|リスク、リターン、損失確率

こんにちは、毛糸です。

手軽な投資手法として有名なドルコスト平均法は、専門家でもその有効性に関して評価が分かれており、分析するのは簡単ではありません。

分析が難しい理由は、対象とするデータ期間によって結果が変わってしまったり、確率論の手法が単純には適用できないためです。
参考記事>>ドルコスト平均法の検証が難しい理由

本記事ではこのような困難さを伴うドルコスト平均法に関して、シミュレーションによってその有効性を検証してみたいと思います。

検証の結果、ドルコスト平均法は一括投資に比べてリスク・リターンともに低くなり、また将来時点の損失確率が一括投資よりも大きくなることがわかりました。

 

検証方法

検証には投資シミュレーションプログラムVer2を使用します。

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

投資シミュレーションプログラムVer2は積立投資を行った場合に将来の資産額がどのような分布を描くかをシミュレーションするプログラムです。
シミュレーションはモンテカルロ法という手法を利用しており、確率論に立脚した統計的推論に基づいて将来を予測します。
本記事では、月額1万円のドルコスト平均法による積立投資をした場合の将来の資産分布と、それと同じ総投資額を一括で投資した場合の資産分布を比較し、将来時点のリスクとリターンを比較します。

ドルコスト平均法と一括投資の比較をしたいので、使用する期待リターンとリスクは条件を揃えればなんでもいいのですが、ここでは年金の基本ポートフォリオの期待リターン4.57%と、リスクを示す標準偏差12.8%を使うことにします。レバレッジはかけません。
参考記事>>年金のリスクとリターンを統計プログラミング言語Rで計算してみた

投資期間は、1年・10年・30年・50年とします。

ドルコスト平均法と一括投資の比較

投資シミュレーションプログラムVer2を用いたシミュレーション結果は、以下のとおりです。シミュレーション回数は1万回です。

投資期間1年

投資月数は1年*12ヶ月=12ヶ月、総投資額は12万円です。

ドルコスト平均法

当初投資額0円、月1万円の積立投資をします。

1年後の資産額の期待値12.26万円、中央値12.26万円です。

1年後の資産額を総投資額で割ったトータルリターンは2.21%です。

1年後の資産額の標準偏差を総投資額で割ったトータルリスクは7.09%です。


1年時点で損失を被る確率は39.64%です。

一括投資

当初投資額12万円の一括投資をします。

1年後の資産額の期待値12.57万円、中央値12.50万円です。

1年後の資産額を総投資額で割ったトータルリターンは4.80%です。

1年後の資産額の標準偏差を総投資額で割ったトータルリスクは13.36%です。


1年時点で損失を被る確率は38.11%です。

投資期間10年

投資月数は10年*12ヶ月=120ヶ月、総投資額は120万円です。

ドルコスト平均法

当初投資額0円、月1万円の積立投資をします。

10年後の資産額の期待値151.46万円、中央値146.30万円です。

10年後の資産額を総投資額で割ったトータルリターンは26.22%です。

10年後の資産額の標準偏差を総投資額で割ったトータルリスクは31.63%です。


10年時点で損失を被る確率は20.04%です。

一括投資

当初投資額120万円の一括投資をします。

10年後の資産額の期待値189.57万円、中央値173.92万円です。

10年後の資産額を総投資額で割ったトータルリターンは57.97%です。

10年後の資産額の標準偏差を総投資額で割ったトータルリスクは66.69%です。


10年時点で損失を被る確率は17.58%です。

投資期間30年

投資月数は30年*12ヶ月=360ヶ月、総投資額は360万円です。

ドルコスト平均法

当初投資額0円、月1万円の積立投資をします。

30年後の資産額の期待値765.48万円、中央値673.64万円です。

30年後の資産額を総投資額で割ったトータルリターンは112.63%です。

30年後の資産額の標準偏差を総投資額で割ったトータルリスクは108.04%です。


30年時点で損失を被る確率は7.39%です。

一括投資

当初投資額360万円の一括投資をします。

30年後の資産額の期待値1406.71万円、中央値1099.39万円です。

30年後の資産額を総投資額で割ったトータルリターンは290.75%です。

30年後の資産額の標準偏差を総投資額で割ったトータルリスクは310.57%です。


30年時点で損失を被る確率は5.53%です。

投資期間50年

投資月数は50年*12ヶ月=600ヶ月、総投資額は600万円です。

ドルコスト平均法

当初投資額0円、月1万円の積立投資をします。

50年後の資産額の期待値2286.82万円、中央値1820.05万円です。

50年後の資産額を総投資額で割ったトータルリターンは281.31%です。

50年後の資産額の標準偏差を総投資額で割ったトータルリスクは284.51%です。


50年時点で損失を被る確率は2.75%です。

一括投資

当初投資額600万円の一括投資をします。

50年後の資産額の期待値5794.77万円、中央値3921.94万円です。

50年後の資産額を総投資額で割ったトータルリターンは865.79%です。

50年後の資産額の標準偏差を総投資額で割ったトータルリスクは1072.02%です。


50年時点で損失を被る確率は1.93%です。

考察

ドルコスト平均法と一括投資のトータル・リターンとリスクは以下のようになりました。

この結果から、次のようなことがわかります。

長期になるほどリターン・リスクは上がる

ドルコスト平均法と一括投資のどちらの方法によっても、投資年数が長くなればなるほど、トータルのリターンとリスクは大きくなります。

ときおり「長期投資は安全」という主張を目にしますが、将来時点の資産の変動性をリスクと呼ぶ限りにおいて、長期の投資はリスクを増大させます(その裏でリターンという報酬も大きくなります)。
参考記事>>長期投資は【安全ではない】ことをシミュレーションで証明する

ドルコスト平均法より一括投資の方がハイリスク・ハイリターン

投資期間が同じならば、ドルコスト平均法よりも一括投資の方がリターン・リスクともに高いです。

これは、投資総額が同じであれば、ドルコスト平均法のほうが資金の待機時間が長く、リスクにさらされる期間と金額が小さくなるためです。

投資期間が短ければ、おおよそドルコスト平均法の2倍程度が一括投資のリターン・リスクになりますが、期間が長くなればなるほど複利の効果によって幅が大きくなってきます。

損失確率

損失確率についてまとめたのが以下の表です。

この表からわかることは、①投資が長期になるほど損失確率は小さくなる、②ドルコスト平均法よりも一括投資の方が損失確率が低い、ということです。

投資年数が同じであれば一括投資の方がハイリスク・ハイリターンですが、損失確率という別の「リスク(危険性)」の尺度で考えると、一括投資の方が安全である(損失が生じにくい)ということは驚きに値します。

まとめ

モンテカルロ法を用いた投資シミュレーションプログラムによって、ドルコスト平均法と一括投資の比較を行いました。

結論として

  1. いずれの方法でも長期投資はリスクとリターンを増大させる
  2. ドルコスト平均法より一括投資の方がハイリスク・ハイリターン
  3. ドルコスト平均法より一括投資の方が損失確率が小さい
ことがわかりました。
ドルコスト平均法の有効性に関する研究はあまり知られていないので、引き続き他の視点からも検証してみたいと思います。

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

こんにちは、毛糸です。
先日開発した「投資シミュレーションプログラム」は、年金運用や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])

 

まとめ

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

ビットコインの確率分布について|期待リターン、リスク、ヒストグラム【正規分布じゃない】

こんにちは、毛糸です。

前回、Rライブラリ「crypto」を用いて、仮想通貨の価格が簡単に取得できることを説明しました。
>>仮想通貨の価格ヒストリカルデータを取得する方法|Rライブラリcryptoの使い方

今回は「crypto」を使って取得したBitcoin(BTC)の価格情報を分析します。

BTC価格の時系列データを分析することで、BTCの期待リターン、リスクが極めて高いことがわかりました。

また、ヒストグラムと「正規性の検定」により、BTCのリターンは正規分布に従わないこともわかりました。

cryptoパッケージによるBTC価格の取得とリターンのデータ

cryptoパッケージのcrypto_history()関数を用いて、BTC価格のヒストリカルデータを取得します。
>>仮想通貨の価格ヒストリカルデータを取得する方法|Rライブラリcryptoの使い方

#crypto_history(coin = NULL, limit = NULL, start_date = NULL,
#end_date = NULL, coin_list = NULL, sleep = NULL)
#仮想通貨の価格等情報を取得
#dateはyyyymmdd形式で。NULLとすると最長期間
BTC<-crypto_history(coin = "BTC",
                    start_date = NULL,end_date = NULL)
BTC価格を時系列データとして読み込みます。
BTC_price<-ts(BTC$close,start=BTC$date[1])
plot(BTC_price,type="l")
日次収益率を計算し、プロットしてみましょう。
#日次収益率
BTC_return_daily<-diff(BTC_price,lag=1)/lag(BTC_price,k=-1)
plot(BTC_return_daily,type="l")
以下ではこの日次収益率データを使って、BTCの収益率の統計分析をしていきます。

基本統計量

期待リターン(平均)

日次収益率の平均をとることで、日次期待リターンを推定できます。結果は、日次リターンが0.28%、簡易的に年率換算すると102%となりました。株式のリターンが年率5%ほどと言われていますから、驚異的な水準です。
#日次収益率の平均(期待リターン)(%)
mean(BTC_return_daily)*100
#[1] 0.2808807
#年率換算(%)
mean(BTC_return_daily)*100*365
#[1] 102.5215

リスク(標準偏差)

日次収益率の標準偏差を計算することで、日次収益率のリスクを推定できます。結果は、日次ベースの標準偏差が4.3%、簡易的に年率換算すると82%となりました。株式のリスクが年率25%ほどと言われていますから、とてつもなくハイリスクであることがわかります。
#標準偏差(%)
sd(BTC_return_daily)*100
#[1] 4.333606

#年率換算(%)
sd(BTC_return_daily)*100*365^0.5
#[1] 82.79343

歪度

歪度と尖度の計算には、「moments」ライブラリのskewness()、kurtosis() 関数を用います。
install.packages("moments")
library(moments)

分布の歪み具合を示すのが歪度です。正規分布のように左右対称な分布では、歪度は0になります。

BTC日次収益率の歪度は0.5です。歪度が正であるということは、分布のピークが左側にあり、右側の裾が広い分布であることを意味します。つまり、極端に高いリターンが出やすいと言えます。

#歪度:正規分布は0、正なら右裾が広い
skewness(BTC_return_daily)
#[1] 0.5234792

尖度

尖度は分布の尖り具合を示します。正規分布は尖度3(0とする定義もあり)であり、これより大きければ、分布は平均の周りで尖った、左右に裾野が広い分布になります。

BTC日次収益率の尖度は12であり、正規分布より極端に「尖った」、そして「裾野の広い」分布になります。つまり、極端に高い・低いリターンが出現しやすいことを意味します。

#尖度:正規分布が3
kurtosis(BTC_return_daily)
#[1] 12.9556

BTC収益率(リターン)は正規分布にしたがうか?(正規性の検定)

ファイナンス(金融工学)では、資産のリターンは正規分布に従うと仮定されることが多いです(資産価格が対数正規分布、資産価格が幾何ブラウン運動、も同様の意味です)。
BTC収益率は正規分布に従うのか、確かめてみましょう。
すでに、BTC収益率の歪度が0.5(正規分布なら0)、尖度が12(正規分布なら3)であることは確認しましたので、正規分布ではないような気がしますが、別の視点からも確認します。
本性の内容は下記記事を参考にしています。

ヒストグラム

リターンの実現値が、どの範囲でどのくらいの頻度で出現したかを見るグラフが、ヒストグラムです。

BTC日次収益率のヒストグラムを描いてみます。

正規分布のヒストグラムは左右対称のベルのような形をしていますが、BTC収益率のヒストグラムはやや右に裾野が厚く、かつ裾野が広がっている印象を受けます。

hist(BTC_return_daily,main="BTC算術日次リターンのヒストグラム",xlab="日次リターン",ylab="度数")

Q-Qプロット

Q-Qプロットは、与えられたデータがある確率分布とどれくらい「ずれているか」を図示したものです。データをQ-Qプロットしたとき、データが45度線(y=xのグラフ)に沿って並んでいれば、理論上の分布と近いという根拠になります。Rではqqnorm()関数によって、正規分布を仮定した場合のQ-Qプロットを描画できます。

BTCの日次データをQ-Qプロットしてみると、以下のように曲線を描いており、正規分布に近いとは言えません。

qqnorm(BTC_return_daily,main="BTC算術日次リターンのQ-Qプロット")

シャピロ・ウィルク検定

シャピロ・ウィルク検定は、「データが正規分布に従う」という帰無仮説に関する検定です。したがって、シャピロ・ウィルク検定で計算されたp値が小さければ、帰無仮説を棄却、つまり「データは正規分布に従わない」ということが言えます。Rではshapiro.test()を使います。
検定の結果、p値はほぼ0であり、「BTC日次収益率は正規分布に従わない」と結論付けられます。
> shapiro.test(BTC_return_daily)


 Shapiro-Wilk normality test


data:  BTC_return_daily
W = 0.87881, p-value < 0.00000000000000022

コルモゴロフ・スミルノフ検定

コルモゴロフ・スミルノフ検定は、「データが指定した確率分布に従う」という帰無仮説に関する検定です。したがって、正規分布に関するコルモゴロフ・スミルノフ検定を行ったときにp値が小さければ、帰無仮説を棄却、つまり「データは正規分布に従わない」ということが言えます。Rではks.test()を使います。
検定の結果、p値はほぼ0であり、「BTC日次収益率は正規分布に従わない」と結論付けられます。
> ks.test(BTC_return_daily, "pnorm", mean=mean(BTC_return_daily), sd=sqrt(var(BTC_return_daily)))


 One-sample Kolmogorov-Smirnov test


data:  BTC_return_daily
D = 0.11752, p-value < 0.00000000000000022
alternative hypothesis: two-sided


 警告メッセージ: 
 ks.test(BTC_return_daily, "pnorm", mean = mean(BTC_return_daily),  で: 
   コルモゴロフ・スミノフ検定において、タイは現れるべきではありません
なお、警告メッセージは同一データが存在するときに発生します。連続確率分布では同一の値が実現する確率は0なので、本来生じるべきではないというアラートですが、今回は厳密な議論をしているわけではないので、スルーします。
以上のような検討の結果、いずれの方法でも、BTC日次収益率は正規分布に従わないという結論が得られました。

ビットコインの収益率が正規分布に従わないとなにが困るか

ビットコインの収益率が正規分布に従わないということは、収益率が正規分布に従うと仮定して展開される多くのファイナンス理論の道具が使えないことになります。
たとえば、オプションの価格公式であるブラック・ショールズ式は、資産価格が幾何ブラウン運動に従うこと(つまり収益率が正規分布に従うこと)を仮定しています。
したがって、ビットコインのオプションが組成されたときに、そのオプションの価格をブラック・ショールズ式で評価するのと、意思決定を誤ります。
また、将来の投資運用の成績をシミュレーションする「投資シミュレーションプログラム」も、資産の収益率に正規分布を仮定しているため、仮想通貨投資には利用できません。

このように、確率分布が標準的なファイナンスの仮定と異なることにより、やや慎重な議論が必要になってきます。

投資においては、為替や株式等よりも変動性が大きく、また極端に高いもしくは低いリターンが出やすいという点に気をつける必要があります。

まとめ

Rライブラリ「crypto」を用いて、ビットコインの価格情報を取得し、日次リターンの分析を行ってみました。
ビットコインの収益率は極めてハイリスク・ハイリターンであり、また、ファイナンスで通常仮定される正規分布とは大きく異なる性質を持っています。

ビットコインを始めとする仮想通貨のデータを扱う際には、この分布の特性をよく踏まえる必要があります。

関連記事>>ビットコインはバブルである

参考記事


データ解析その前に: 分布型の確認と正規性の検定 #rstatsj(リンク)
Leihcrev’s memo 入門本編 8章 確率分布(リンク
統計解析フリーソフト R の備忘録頁 ver.3.1 63. 正規性の検定(リンク)
Wikipedia 歪度(リンク
Wikipedia 尖度(リンク

長期投資は【安全ではない】ことをシミュレーションで証明する

こんにちは、毛糸です。

「長期投資は安全」というイメージを抱いていませんか?

全国銀行協会のサイト(リンク)でも、長期投資の安全性に関して以下のように書いてあります。

一時的に価格が下がっても、長い目で見れば価格が上がることもあるため、長く保有すればするほど、リスクを軽減する効果があるといわれています。

しかし、この主張は極めて誤解しやすいもので、実際にはむしろ、投資収益のリスクは長期になればなるほど大きくなります。

本記事では「投資シミュレーションプログラム」を用いて、長期投資がリスクを高めることを証明します。
参考記事:>>「投資シミュレーションプログラム」サマリー

投資の「リスク」の定義

投資におけるリスクとは、投資収益の期待値からのブレを指すのが一般的です。

もう少し踏み込んで言えば、そのブレを測る尺度が、標準偏差や分散という統計量です。

投資において「リスクが高い」とは、将来の(額もしくは率ベースの)投資収益の標準偏差が高い、ということを意味します。

この意味において、投資が長期になればなるほど、リスクは高くなります。

つまり、他の条件を一定とすれば、短期と長期の投資収益は、後者のほうが高い標準偏差を持つということです。

本記事ではこのことを「投資シミュレーションプログラム」を用いて示します。

(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”:”ウォール街のランダムウォーカー株式投資の不滅の真理”,”b”:””,”t”:””,”d”:”https://images-fe.ssl-images-amazon.com”,”c_p”:”/images/I”,”p”:[“/51j3XxuLcML.jpg”,”/51L5VguO16L.jpg”,”/51pXH1cT26L.jpg”,”/51qzhDA8N8L.jpg”,”/516KF7nD4ML.jpg”,”/51RqxJ5YdzL.jpg”,”/41Z4TQLguaL.jpg”,”/41RDCEkVSWL.jpg”,”/51ZC6wiROQL.jpg”,”/416UAK2gjbL.jpg”,”/51COLQfOYZL.jpg”,”/41wAkIpxalL.jpg”,”/517pu9qvoaL.jpg”,”/51Qd00xstPL.jpg”,”/41a6WwcjPUL.jpg”,”/41whOykxo9L.jpg”,”/51ZYk6jqWTL.jpg”,”/51JXyzvOypL.jpg”,”/51Cx1OLwZwL.jpg”],”u”:{“u”:”https://www.amazon.co.jp/%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E8%A1%97%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%BB%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AB%E3%83%BC%E3%80%88%E5%8E%9F%E8%91%97%E7%AC%AC11%E7%89%88%E3%80%89-%E2%80%95%E6%A0%AA%E5%BC%8F%E6%8A%95%E8%B3%87%E3%81%AE%E4%B8%8D%E6%BB%85%E3%81%AE%E7%9C%9F%E7%90%86-%E3%83%90%E3%83%BC%E3%83%88%E3%83%B3%E3%83%BB%E3%83%9E%E3%83%AB%E3%82%AD%E3%83%BC%E3%83%AB/dp/4532356873″,”t”:”amazon”,”r_v”:””},”aid”:{“amazon”:”1251300″,”rakuten”:”1249750″,”yahoo”:”1251299″},”eid”:”azSuX”});

投資シミュレーションプログラム

「投資シミュレーションプログラム」は、確率論に基づくモンテカルロ・シミュレーションという手法を用いて、投資収益の将来予測をするプログラムです。
参考記事:>>「投資シミュレーションプログラム」サマリー

モンテカルロ・シミュレーションとは、コンピュータによって乱数を発生させ、将来を確率的にシミュレートし、大数の法則によって将来の期待値を算定する手法です。

「投資シミュレーションプログラム」を使えば、投資の期待リターンとリスクと投資期間を入力することで、将来の資産額を計算することが出来ます。

長期投資でリスクは低減されない

今回行うシミュレーションは、投資対象をFXとした場合(期待リターン0%、リスク10%と仮定)と、インデックス投信に分散投資した場合(期待リターン4.57%、リスク12.8%)の2つのケースについて、1年・10年・30年の各投資期間で、将来時点で確定する投資収益の期待値とリスクを計算してみます。

インデックス投信に分散投資、といってもアセット・アロケーションは無限にありますが、ここでは日本の年金運用の基本ポートフォリオと同じ資産配分で行うものと仮定します。

シミュレーション結果は以下のとおりです。

FX(期待リターン0%、リスク10%)に投資した場合

1年後

  • リターンの期待値は0%
  • リスク(標準偏差)は10%
  • シャープレシオは0
  • 1年あたりの平均リターンは0%

10年後

  • リターンの期待値は0%
  • リスク(標準偏差)は32%
  • シャープレシオは0
  • 1年あたりの平均リターンは0%

30年後

  • リターンの期待値は1%
  • リスク(標準偏差)は61%
  • シャープレシオは0.02
  • 1年あたりの平均リターンは0%
FX(期待リターン0%、リスク10%)に投資した場合、長期になってもリターンは(ほぼ)増えませんが、リスクは長期になればなるほど大きくなっていることがわかります。

インデックスに分散投資(期待リターン4.57%、リスク12.8%)した場合

1年後

  • リターンの期待値は5%
  • リスク(標準偏差)は12%
  • シャープレシオは0.4
  • 1年あたりの平均リターンは5%

10年後

  • リターンの期待値は56%
  • リスク(標準偏差)は63%
  • シャープレシオは0.8
  • 1年あたりの平均リターンは5%

30年後

  • リターンの期待値は286%
  • リスク(標準偏差)は298%
  • シャープレシオは1
  • 1年あたりの平均リターンは5%
インデックスに分散投資(期待リターン4.57%、リスク12.8%)した場合、長期になればなるほどリターンは大きくなっていますが、それに伴いリスクも大きくなっていることがわかります。ちなみに、投資のリスクとリターンの比率を示すシャープレシオは、投資が長期化するほど高まります。
上記分析に用いたRのコードは以下のとおりです。
#FX
#投資年数(自由入力)
Year<-1
#シミュレーション回数(自由入力、多いほど正確だが時間がかかる)
sample<-10000
#シミュレーション数値を格納する行列
A<-matrix(0,sample,Year+1)
#初期投資額を入力(自由入力)
initial<-100
#シミュレーション数値に初期投資額を入力
A[,1]<-initial
#期待リターン(期待収益率μ、自由入力)
mu<-0/100
#リスク(標準偏差σ、自由入力)
sigma<-10/100
#シミュレーション開始
set.seed(123)
#sampleの計算は明示せずベクトル化
for ( t in 1:Year){
    #今年の資産額=前年の資産額*(1+収益率)
    A[,t+1]<-A[,t]*(1+rnorm(sample,mu,sigma))
}
#シミュレーション結果の期待値を表示
paste(Year,"年後の資産額の平均は",mean(A[,Year+1]),"万円")
paste(Year,"年後の累積リターンの平均は",(mean(A[,Year+1])/initial-1)*100,"%")
paste(Year,"年後の累積リターンの標準偏差は",sd(A[,Year+1])/initial*100,"%")
paste(Year,"年間の1年あたり 平均収益率は",((mean(A[,Year+1])/initial)^(1/Year)-1)*100,"%")
#インデックス
#投資年数(自由入力)
Year<-1
#シミュレーション回数(自由入力、多いほど正確だが時間がかかる)
sample<-10000
#シミュレーション数値を格納する行列
A<-matrix(0,sample,Year+1)
#初期投資額を入力(自由入力)
initial<-100
#シミュレーション数値に初期投資額を入力
A[,1]<-initial
#期待リターン(期待収益率μ、自由入力)
mu<-4.57/100
#リスク(標準偏差σ、自由入力)
sigma<-12.8/100
#シミュレーション開始
set.seed(123)
#sampleの計算は明示せずベクトル化
for ( t in 1:Year){
    #今年の資産額=前年の資産額*(1+収益率)
    A[,t+1]<-A[,t]*(1+rnorm(sample,mu,sigma))
}
#シミュレーション結果の期待値を表示
paste(Year,"年後の資産額の平均は",mean(A[,Year+1]),"万円")
paste(Year,"年後の累積リターンの平均は",(mean(A[,Year+1])/initial-1)*100,"%")
paste(Year,"年後の累積リターンの標準偏差は",sd(A[,Year+1])/initial*100,"%")
paste(Year,"年間の1年あたり 平均収益率は",((mean(A[,Year+1])/initial)^(1/Year)-1)*100,"%")

考察

FXでもインデックス投資でも、投資が長期になればなるほど、リターンもリスクも大きくなることがわかりました。
本記事の主張を再度述べると、「長期投資をしてもリスクは低くならず、むしろ高まる」ということです。
ちなみに、上記インデックス投資のシミュレーションを図示すると以下のようになります。青い線の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”:”GI2A5″});

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

こんにちは、毛糸です。

先日、投資の将来予測を行うための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”});

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

こんにちは、毛糸です。

先日発表された金融審議会市場ワーキング・グループの報告書案「高齢社会における資産形成・管理」(以下「報告書案」、外部リンク)は、老後に年金を頼り生活するという前提を否定するかのような内容と受け取られ、話題になっています。

この報告書案を読まれた方の中には「年金なんてこれからどんどん給付額が減っていくから当てにならない!」と考えている方もいらっしゃるでしょう。

実際に将来の給付額がどうなるかというのは、人口動態や賃金・物価上昇率など、多くの要因に左右されるため、現時点で確定的なことを述べることは出来ません。

しかし、年金積立金の運用という観点から、金融データと確率論に基づき年金ポートフォリオの将来をシミュレーションすることは可能です。

本記事では年金積立金の基本ポートフォリオに関する将来予測を、モンテカルロ・シミュレーションに基づいて行ってみたいと思います。
参考記事:投資シミュレーションプログラムを作ってみた【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”:”YwNTV”});

年金積立金の基本ポートフォリオ

私たちが毎月支払っている年金保険料は、年金積立金管理運用独立行政法人(GPIF)という機関によって運用が行われています。

GPIFは年金支払のための原資を効率的に運用するため、株式や債券などのリスク資産に投資を行っています。

GPIFは年金ポートフォリオとして

  • 国内債券
  • 国内株式
  • 外国債券
  • 外国株式
の4つの資産クラスに投資を行うことを取り決めており、その割合も決まっています。以下はGPIFのサイト「基本ポートフォリオの考え方」(サイト)からの引用です。

この「基本ポートフォリオ」は、賃金上昇率+アルファを確保しつつ、リスクを最小限にして運用されることを目的としており、期待リターンは年4.75%、標準偏差で測ったリスクは年12.8%となっています。
参考記事:年金のリスクとリターンを統計プログラミング言語Rで計算してみた

今回はこのデータをもとに、将来の年金がどのくらいの規模になるのか、損失が出る確率はどのくらいなのかを計算してみたいと思います。

年金ポートフォリオのモンテカルロ・シミュレーション

年金積立金ポートフォリオが将来いくらくらいになるのか予測してみましょう。

年金運用の期待リターンは年4.57%、標準偏差で測ったリスクは年12.8%として、毎年の投資収益率が正規分布に従うと仮定した場合に、将来の年金ポートフォリオの金額を乱数を用いて予測します。

シミュレーションには「投資シミュレーションプログラム」を使います。
参考記事:投資シミュレーションプログラムを作ってみた【Rでプログラミング】

投資年数Yearは、1年、25年、50年、100年を入力し、それぞれの年数経過後の資産額をシミュレーションします。

投資の期待リターンはGPIFの基本ポートフォリオの期待リターン4.57%(4.57/100)を、投資のリスクは基本ポートフォリオのリスク(標準偏差)12.8%(12.8/100)を入力します。

#期待リターン(期待収益率μ、自由入力)
mu<-4.57/100
#リスク(標準偏差σ、自由入力)
sigma<-12.8/100

以下では1年後、25年後、50年後、100年後の将来における年金積立金の期待値と、標準偏差で測ったリスク、当初資金を下回る確率(損失確率)、損失が発生した場合の平均損失額(これを期待ショートフォールとよびます)を計算します。

なお、シミュレーションにあたって分析を単純化するために、運用以外の資金の出入りはないものとし、リバランスは考慮しないものとします。また、当初資金は記事執筆時点直近で報告された運用額である150兆6,630億円(150.6630兆円)とします。

1年後の年金のシミュレーション結果

  • 1年後の年金積立金の期待値は157兆円
  • 標準偏差で測ったリスクは19兆円
  • 損失確率は35%
  • 損失発生時の平均損失額(期待ショートフォール)は13兆円
1年後に損失が発生する確率が35%もあるのは驚きですが、損失が発生してもその期待値は13兆円なので、あまり大きな額ではありません。

25年後の年金のシミュレーション結果

  • 25年後の年金積立金の期待値は467兆円
  • 標準偏差で測ったリスクは313兆円
  • 損失確率は6%
  • 損失発生時の平均損失額(期待ショートフォール)は32兆円

25年後には年金積立金の期待値は現在の倍以上になります。

50年後の年金のシミュレーション結果

  • 50年後の年金積立金の期待値は1,422兆円
  • 標準偏差で測ったリスクは1,476兆円
  • 損失確率は2%
  • 損失発生時の平均損失額(期待ショートフォール)は39兆円
50年後に損失が発生する確率は2%であり、50年に一度と言われるような金融危機が起こらない限りは発生し得ないレベルです。

100年後の年金のシミュレーション結果

  • 100年後の年金積立金の期待値は13,389兆円
  • 標準偏差で測ったリスクは25,865兆円
  • 損失確率は0.2%
  • 損失発生時の平均損失額(期待ショートフォール)は52兆円
100年後に損失を抱える確率はほぼゼロです。

まとめと考察

投資シミュレーションプログラムを用いて、長期の年金運用の成績を予測してみました。
投資年数が長くなるほど将来の資産額の期待値は大きくなることがわかりましたが、一方でリスクも大きくなるようです。
年金運用で損失が出る確率は運用が長期になるほど低くなりますが、来年損失が出る確率は35%もあり、25年程度の運用でも6%の確率の確率で運用損が生じることもわかりました。
年金制度の将来を占うにあたり、今回の分析はやや設定を単純化しすぎていますが、たとえば今後年金運用が損失を出すようなことがあっても「統計的にはまぁ損失もありうるよね」と納得する材料にはなるのではないでしょうか。
年金制度はその存続も含め、今後も議論になるものと思われますが、多角的な視点から考えてみたいと思います。
なお、本記事の分析を行うに際して、下記の書籍を参考にしました。

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

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

こんにちは、毛糸です。

資産運用にはいろいろな手段があり、なかでも外貨預金やFX(外国為替証拠金取引)は有名どころです。

しかし、外貨預金やFX(以下FX等といいます)は、文献によっては「手を出すべきでない」投資商品として紹介されていたりもします。

たとえば『図解・最新 難しいことはわかりませんが、お金の増やし方を教えてください!』には、以下のように説明されています。

『為替が上がるか、下がるか』と、『金利が高いか、安いか』をセットで考えて、取引価格が決まっているから、買う前にどっちの通貨がお得かは言えない

外貨預金をやるのはコイントスで『表』か『裏』にお金をかけるのとほぼ一緒

 

本記事ではこの主張について詳しく掘り下げ、FX等の期待リターンについて考察したあと、それに基づく「億り人になれる確率」と「破産する確率」を投資シミュレーションプログラムを用いて計算してみます。

外貨預金・FXはなぜ魅力的なのか

FX等は、2つの収益機会にあずかれます。

ひとつは海外通貨に対して適用される高い金利収入(インカムゲイン)、もうひとつは通貨高による価値の増加(キャピタルゲイン)です。

外貨預金は通常、高金利通貨建てで設定され、高い金利収入(インカムゲイン)が得られるとされています。

またキャピタルゲインに関しても、例えば米ドル建て外貨預金をするとして、1ドル100円のときに1万ドルを預金し、引き出し時に1ドル110円になっていれば、円建てでは100万円から110万円に増えることになります。

FXも同様に、為替の変動による利益を得つつ、スワップポイントと呼ばれる金利収入が得られます。

このように、インカムゲインとキャピタルゲインが同時に得られるという魅力があるため、FX等は人気の投資となっています。

FXリターン分析の前提①:裁定取引とフォワード・パリティ

FX等の期待リターンについて考察する前に、いくつかテクニカルな前提をおきます。

今後、通貨高が見込めるような通貨があったとしましょう。つまり、キャピタルゲインが見込めそうな通貨です。

為替の世界には、将来の為替レートを現時点で「約束」する契約が存在します(通貨先物や為替予約といいます)。

もし将来、通貨高になりそうな通貨に対して、将来低いレートで買う「約束」をすることができれば、その取引を行う投資家は、将来安いレートで通貨を買い、高い市場レートで売却することで利益が得られそうです。

このような投資家の行動を「裁定」とよび、通貨は投資家の裁定によって「適正水準」に収斂します。

やや数学的な表現をすると、将来の( T)年後のスポット為替レートの期待値\(E[S_T] \)が「約束」されたフォワード為替レート\( F_T\)と異なっていれば、市場の効率性を前提として裁定が行われ、両者は一致するようにレートが変化します。つまり

\[ \begin{split} F_T=E[S_T]\end{split} \]
という等式が成り立つようにフォワード為替レート\( F_T\)が調整されます。

両辺を現在のスポット為替レート\( S_0\)で割ると

\[ \begin{split} \frac{ F_T}{S_0 }=E[\frac{ S_T}{ S_0}]=E[1+s_{0,T}]\Leftrightarrow E[s_{0,T}]=\frac{ F_T}{S_0 }-1\end{split} \]
となります。\(E[s_{0,T}] \)は為替の変化率(純額表示のキャピタルゲイン)です。

この等式をフォワード・パリティとか、為替レートの期待形成条件といいます。

 

FXリターン分析の前提②:カバー付き金利パリティ

さて、FX等で高金利通貨を買うことで、高いインカムゲインが得られ、運が良ければキャピタルゲインにもあずかれます。

しかし、このような目論見はあらゆる市場参加者(個人投資家や、証券会社などの機関投資家)が狙っているものです。

もし高い金利水準にありながら割安な通貨があれば、その通貨にはまたたく間に買いが入り、一瞬で「適正水準」にまで通貨高になります。

そうなれば、将来のキャピタルゲインの幅が縮まって、投資の旨味が小さくなりますので、投資家は早くに将来の為替レートを「約束」しようとします。

こうした取引によって、フォワード為替レートで「約束」した通貨の値上がり益は、最終的には金利差と同じ水準になるよう調整されます。

数式で表すと、スポット為替レートを\( S_0\)、フォワード為替レートを\( F_T\)、売り通貨の金利(国内金利)を\( i_D\)、買い通貨の金利(海外金利)を\( i_F\)としたとき

\[ \begin{split} \frac{ F_T}{S_0 }=\frac{1+i_D}{ 1+i_F}\simeq 1+i_D-i_F \end{split}\]
という関係が成り立ちます(右辺は近似式)。

つまり、フォワード為替レートという「約束」された為替レート(カバーされたレート)で測る通貨のリターンは、内外金利差と一致するということです。

FX等の期待リターンはゼロ

フォワード・パリティとカバー付き金利パリティを組み合わせると、FX等の期待リターンが計算できます。

FX等の期待リターンは、金利差(インカムゲイン\( i_F-i_D\))と通貨高による増分(キャピタルゲイン\( E[s_{0,t}]\))の和を意味します。

フォワード・パリティより

\[ \begin{split}E[s_{0,T}]=\frac{ F_T}{S_0 }-1 \end{split} \]
であり、

カバー付き金利パリティより

\[ \begin{split}\frac{ F_T}{S_0 }-1\simeq i_D-i_F  \end{split} \]
ですから、これらを合わせると
\[ \begin{split}E[s_{0,T}]= i_D-i_F \Leftrightarrow (i_F-i_D)+E[s_{0,T}]=0\end{split} \]
となります。第一項はインカムゲイン、第二項はキャピタルゲインを表しており、これらの和、つまりFX等の期待リターンは0であることが示されました。

以上のことをまとめると、フォワード・パリティとカバー付き金利パリティによって、FX等の期待リターンは、インカムゲインとキャピタルゲインが相殺され0になる、ということです。

以上の内容は、下記書籍により詳しい説明と数式での証明が載っていますので、合わせてご参照ください。

FXで億り人になれる確率、破産する確率

期待リターンが0のFXで十分な資産を築ける確率はどれくらいなのでしょうか。

以下では当初資金1,000万円をドル円(年あたりリスク10%と想定)で運用するとして、10年後に億り人になれる確率と破産する確率を計算します。

FXはレバレッジ取引が可能ですから、レバ1倍、5倍、10倍のそれぞれのケースを考えてみます。

本性の計算は「投資シミュレーションプログラム」を用いています。シミュレーション回数は10000回です。

  1. レバ1倍の場合、10年後の資産の期待値は1,002万円、億り人になれる確率は0%破産する確率は0%
  2. レバ5倍の場合、10年後の資産の期待値は1,018万円、億り人になれる確率は1.5%破産する確率は20%
  3. レバ10倍の場合、10年後の資産の期待値は1,866万円、億り人になれる確率は3.12%破産する確率は83%

考察

期待リターン0のFXでは、レバをかけないと億り人にはなれないことがシミュレーションで明らかになりました。
また、レバを高めることで億り人になれる確率は高まりますが、同時に破産する確率も高くなることがわかりました。

まとめ

フォワード・パリティとカバー付き金利パリティという関係式から、FX・外貨預金は理論上、期待リターンが0であることがわかりました。この前提のもとで投資を行うと、レバレッジをかけないと多大な富を築くことは出来ないことが明らかになりましたが、一方で破産の確率も高まることがわかりました。

本記事の内容は複数の仮定に基づくものであり、実際の投資収益の成否を保証するものではなく、また実際にFX等で成功していらっしゃる方々の成果を否定する意図は全くありません。また、シミュレーションはあくまで確率論に基づいた予測であることをお断りしておきます。

 

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

こんにちは、毛糸です。

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

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

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

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

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

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

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

統計プログラミング言語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を使ってファイナンスや投資の問題を分析するテキストとして、下記が参考になります。

Warning: Trying to access array offset on value of type bool in /home/r1406503/public_html/keito.luxe/wp-content/themes/xeory_base/lib/functions/bzb-functions.php on line 299

Warning: Trying to access array offset on value of type bool in /home/r1406503/public_html/keito.luxe/wp-content/themes/xeory_base/lib/functions/bzb-functions.php on line 301
class="col-md-4" role="complementary" itemscope="itemscope" itemtype="http://schema.org/WPSideBar">