投資信託「eMAXIS」のデータを分析する−2(簡単な分析編)

前回の記事:投資信託「eMAXIS」のデータを分析する−1(データ取得関数作成編) - My Life as a Mock Quant

前回書いたeMAXISのデータ取得関数をもうちょっと使いやすいように書き換えた。そしてついでにPerformanceAnalyticsパッケージの使い方を覚えたかったのでこのデータを分析してみたという内容。以下のサンプルコードでは

  • xts
  • PerformanceAnalytics

パッケージを使用するので、それは別途インストールしておく必要がある。まずはデータ取得関数

library(xts)
library(PerformanceAnalytics)
#eMAXISのファンドデータを取得
GeteMAXIS <- function(){
  #各資産の列名(英語),順に以下のものの略
  #基準日:Date
  #基準価額 : Constant value
  #基準価額(分配金再投資):Gross Constant value
  #分配金(税引前):Profit distribution
  #純資産(億円):Net Asset Value
  COL.NAMES <- c("DATE", "CV", "GCV", "PD", "NAV")
  #データの取得
  url.data <- "http://maxis.muam.jp/e/fund/download/"
  eMAXIS <- read.table(url.data, sep=",", stringsAsFactor = FALSE)
  #全資産クラス数(1行目に文字が入ってる数だけ資産クラスが存在しているとして処理)
  num.assets <- sum(eMAXIS[1,] != "")
  #各資産ごとにデータをlistで区切る。
  size <- ncol(eMAXIS) / num.assets
  eMAXIS <- lapply(1:num.assets, function(i){
      x <- eMAXIS[, (size*(i - 1) + 1) : (size*(i - 1) + size)]
      colnames(x) <- COL.NAMES	
      return(x)
    })
  #リストの要素をファンド名に
  names(eMAXIS) <- sapply(eMAXIS, function(x)x[1,1])
  #型変換、データあるとこだけ抽出
  eMAXIS <- lapply(eMAXIS, function(x){
      warn.old <- getOption("warn")
      options(warn = -1)
      x$CV   <- as.numeric(x$CV)
      options(warn = warn.old)
      x      <- na.omit(x)
      x$GCV  <- as.numeric(x$GCV)
      x$PD   <- as.numeric(x$PD)
      x$NAV  <- as.numeric(x$NAV)
      x$DATE <- as.Date(x$DATE)
      return(as.xts(read.zoo(x)))
    })
  return(eMAXIS)
}
#全資産の特定列(基準価額・基準価額(分配金込み)・ 分配金・純資産額)をxtsオブジェクトで取得
GetSpecificColumn <- function(eMAXIS, name.column = c("CV", "GCV", "PD", "NAV"), all = TRUE)
{
  name.column<- match.arg(name.column)
  x <- lapply(eMAXIS, function(x)x[, name.column])
  x <- Reduce(function(y,z)merge(y, z, all = all), x)
  colnames(x) <- names(eMAXIS)
  return(x)
}

要するに

  1. GeteMAXIS関数でeMAXISの全データ取得
  2. GetSpecificColumn関数で特定の項目を抽出

というように使用する。ここでは基準価額(分配金込み)だけを使って分析。まずはeMAXISデータを取得してそれから基準価額(分配金込み)をリターンに倒して分析用のデータとする。

eMAXIS.return <- CalculateReturns(GetSpecificColumn(GeteMAXIS(), "GCV"))

PerformanceAnalyticsパッケージを使って資産クラス間の相関・リターン分布がどうなっているのか見たければ

chart.Correlation(eMAXIS.return, histogram=TRUE, pch="+")

と関数を呼んでやればいい。結果は

こんな感じで可視化される。日経平均TOPIXの相関が高いのはいいとして、世界株式と先進国株式の相関が1になってる。分散効かねー。パフォーマンスのグラフも再掲しておくと

charts.PerformanceSummary(eMAXIS.return, main = "パフォーマンスサマリー")


個別の資産クラスごとのリターン分布を見たい時はchart.Histogram関数を使う。オプションで指定できる値は以下のような意味合いを持ってる。

  • "add.density":頻度分布から作った経験密度分布関数追加
  • "add.normal":正規分布での近似グラフ追加
  • "add.rug":ヒストグラムの下にでる密度っぽいやつ。(正式名称しらん・・・)
  • "add.risk":VaR,CVaRの表示
chart.Histogram(eMAXIS.return[,1], methods = c("add.density", "add.normal", "add.rug", "add.risk") )


結構綺麗に表示されるなぁ。

ヒストリカル・リスクの推移が見たければ以下のように書く。ここでは直近30日間で計測したリターンの標準偏差(年率)を持ってリスクとしている。

chart.RollingPerformance(eMAXIS.return["2010-11-30::"], width = 30,legend.loc = "topleft", 
	main = "Rolling 30 days Risk",ylab = "Annualized Standard Deviation", FUN = StdDev.annualized)


やはり311を境に激しくリスクが跳ねてるように見える一方、円債だけはふつーに推移してるな。