【STAM/eMAXIS/CMAM】インデックスファンド Part8

このエントリーをはてなブックマークに追加
310242
逃げ切り計算(リスク資産バージョン)について、
とりあえず、期待リターンゼロ、ボラティリティゼロの資産での破産確率が、
うまく出るようになったので(0.2〜0.3%程度の誤差はあります)再度公開します。

興味のある方はどうぞ。
311242:2010/11/06(土) 02:02:47 ID:mX4Mb6S40
***ここからRのソースリスト前半***
# パラメータ指定
Periods=100 # シミュレーション期間
Frequency=300000 # 試行回数
ReturnByPeriod=.05 # 年率期待リターン
Volatility=.20 # 年率ボラティリティ

Age=40 # シミュレーション開始年齢
AssetOfBegin=2000 # シミュレーション開始時資産
LengthBeforeRetire=8 # 退職までの年数
StartPension=65 # 年金支給開始年齢
IncomeByPeriod=200 # 退職前の年間貯蓄額
ConsumptionByPeriod=(730*8*22*12-177400)/10000 # 退職後の年間支出額
PensionByPeriod=792100/10000 # 年金額(AgeがStartPensionを超える場合は無視されます)
RetirementAllowance=200 # 退職金額(LengthBeforeRetire=0の場合は無視されます)

# 収支定義用関数
# 引数説明(上記パラメータを無視して、収入支出を指定する場合に使用します)
# money :各期の収入額(支出の場合は負の数を指定)
# from :収入(支出)開始の期
# to :収入(支出)最後の期
# length:(支出)収入期間
# type :期首の収入ならば1、期末の収入ならば0を指定
# from、toのどちらか一方は必ず指定しなければならない
# 他の引数は省略可能
# from、to、lengthの全てを指定してはならない
GenerateInvestCycle <- function(money=0,from=NULL,to=NULL,length=NULL,type=1) {
InvestCycle=array(0,Periods)
if(is.null(to)&&is.null(length)) to=Periods
if(is.null(from)&&is.null(length)) from=1
if(is.null(from)&&is.null(to)) length=NULL
if(is.null(from)) InvestCycle=c(rep(0,to-length),rep(money,length),rep(0,Periods-to))
if(is.null(to)) InvestCycle=c(rep(0,from-1),rep(money,length),rep(0,Periods-from-length+1))
if(is.null(length)) InvestCycle=c(rep(0,from-1),rep(money,to-from+1),rep(0,Periods-to))
if(type!=1){
return(c(0,InvestCycle[-Periods]))
}else{
return(InvestCycle)
}
}
***ここまでRのソースリスト前半***
312242:2010/11/06(土) 02:03:31 ID:mX4Mb6S40
***ここからRのソースリスト後半***

# 各試行の余命(要生命表)
Seimei=read.csv("C:/seimei.csv",header=T,row.names=1)
TableOfRemainsLife=Seimei[as.character(Age:(nrow(Seimei)-1)),"ndx"]
RemainsLife=sample(1:(length(TableOfRemainsLife)),Frequency,replace=TRUE,prob=TableOfRemainsLife/sum(TableOfRemainsLife))

# 証券価格推移
RandomNumbers=array(rnorm(Periods*Frequency,ReturnByPeriod,Volatility),c(Periods,Frequency))
SecurityValue=matrix(0,Periods+1,Frequency)
SecurityValue[1,] = 1
for(i in 1:Periods){
SecurityValue[i+1,] = (1+RandomNumbers[i,])*(SecurityValue[i,])
}
rm(RandomNumbers)

# 収支定義(パラメーターと収支定義用関数を使用)
# 当初資産
InvestCycle=GenerateInvestCycle(money=AssetOfBegin,from=1,length=1,type=1)
# 定期所得(給料、期末に加算)
InvestCycle=InvestCycle+GenerateInvestCycle(money=IncomeByPeriod,from=1,length=LengthBeforeRetire,type=0)
# 一時収入(退職金、期末に加算)
if(LengthBeforeRetire>=1) InvestCycle=InvestCycle+GenerateInvestCycle(money=RetirementAllowance,from=LengthBeforeRetire,length=1,type=0)
# 終身収入(年金、期首に加算)
if(StartPension>=Age) InvestCycle=InvestCycle+GenerateInvestCycle(money=PensionByPeriod,from=StartPension-Age+1,type=1)
# 終身支出(引退後の生活費、期首に減算)
InvestCycle=InvestCycle+GenerateInvestCycle(money=-ConsumptionByPeriod,from=LengthBeforeRetire+1,type=1)

# 各試行の資産取り崩し可能年数
InvestMoney=matrix(InvestCycle,Periods,Frequency)
GottenSecurity=InvestMoney/SecurityValue[-nrow(SecurityValue),]
TriMatrix=matrix(1,Periods,Periods)
TriMatrix[upper.tri(TriMatrix)]=0
CumlativeSecurity=TriMatrix %*% GottenSecurity
CumlativeSecurityLife=apply(CumlativeSecurity>=0,2,sum)

# 結果表示
# 投資計画表示
InvestCycle
# 破産確率
1-sum(CumlativeSecurityLife>=RemainsLife)/Frequency
***ここまでRのソースリスト後半***
313242:2010/11/06(土) 02:04:23 ID:mX4Mb6S40
●フリーの統計解析ツールR
http://www.okada.jp.org/RWiki/?RjpWiki
インストールする必要がある。

●完全生命表
http://www.mhlw.go.jp/toukei/saikin/hw/life/20th/xls/seimei.xls
をダウンロードして以下のようなCSV形式に変換して、
"C:\seimei.csv"に保存する必要がある。

***ここからC:\seimei.csvの中身***
x,ndx
0,298
1,45
2,32
3,22
4,16
5,14
6,14
7,14
以下続く
***ここまでC:\seimei.csvの中身***

●パラメーターの説明は、ソース中のコメント文に書きました。