tidyquantを使った分析メモ ポートフォリオのリターン
tidyquant
を使った分析メモの続き。前回までに個別銘柄のリターンについて計算したので、ポートフォリオのリターンについて出してみます。
PerformanceAnalytics::Returns.portfolio
のラッパー関数であるtq_portfolio
を使えば、tidyなデータを入力として簡単にポートフォリオのリターンを計算できます。
データ
TOPIX100 の銘柄の株価データを取得して、対数リターンを計算します。 ここでは、期間を2017年7月から9月末までを指定しています。
> log_returns # A tibble: 6,138 x 4 # Groups: symbol [99] symbol date close log_return <chr> <date> <dbl> <dbl> 1 YJ1605.T 2017-07-03 1087.0 0.000000000 2 YJ1605.T 2017-07-04 1099.0 0.010979067 3 YJ1605.T 2017-07-05 1086.0 -0.011899454 4 YJ1605.T 2017-07-06 1073.0 -0.012042758 5 YJ1605.T 2017-07-07 1069.0 -0.003734832 6 YJ1605.T 2017-07-10 1067.5 -0.001404166 7 YJ1605.T 2017-07-11 1072.0 0.004206597 8 YJ1605.T 2017-07-12 1073.5 0.001398276 9 YJ1605.T 2017-07-13 1079.5 0.005573633 10 YJ1605.T 2017-07-14 1083.0 0.003236997 # ... with 6,128 more rows
ポートフォリオの銘柄
TOPIX100 に含まれる特定の銘柄を使ってポートフォリオのリターンを計算します。 ここでは、「セブン&アイ・ホールディングス」「楽天」「ファナック」「任天堂」「ファーストリテイリング」「ソフトバンク」の6銘柄を使うことにします。
stocks <- c("YJ3382.T", "YJ4755.T", "YJ6954.T", "YJ7974.T", "YJ9983.T", "YJ9984.T")
それぞれの銘柄の対数リターンの時系列推移を可視化します。
log_returns %>% filter(symbol %in% stocks) %>% ggplot(aes(x = date, y = log_return, colour = symbol)) + geom_line() + theme_tq() + scale_color_tq() + facet_wrap(~ symbol, ncol = 3, scales = "free_y")
それぞれの銘柄の期待リターンとボラティリティを計算します。
> log_returns %>% + filter(symbol %in% targets) %>% + group_by(symbol) %>% + summarise(return = mean(log_return), vol = sd(log_return)) # A tibble: 6 x 3 symbol return vol <chr> <dbl> <dbl> 1 YJ4063.T -1.277554e-04 0.01137096 2 YJ4755.T -1.080331e-03 0.01011779 3 YJ6954.T 8.090697e-04 0.01075738 4 YJ7974.T 1.909432e-03 0.02136985 5 YJ9983.T -1.943404e-03 0.01333176 6 YJ9984.T -4.786856e-05 0.01177579
ファナックと任天堂の期待リターンがプラスであることがわかります。
ポートフォリオのリターン
各銘柄のウェイトを決めた上で、tq_portfolio
でポートフォリオのリターンを計算します。
> weights <- c(rep(0.15, 4), rep(0.2, 2)) > portfolio_returns <- log_returns %>% + filter(symbol %in% stocks) %>% + tq_portfolio(assets_col = symbol, + returns_col = log_return, + weights = weights) %T>% + print # A tibble: 62 x 2 date portfolio.returns <date> <dbl> 1 2017-07-03 0.0000000000 2 2017-07-04 -0.0076961084 3 2017-07-05 -0.0001438849 4 2017-07-06 -0.0048844521 5 2017-07-07 -0.0031134117 6 2017-07-10 0.0087959661 7 2017-07-11 0.0033212960 8 2017-07-12 -0.0052806985 9 2017-07-13 -0.0014577677 10 2017-07-14 -0.0065329481 # ... with 52 more rows
このポートフォリオの期待リターンは以下のようになります。
> portfolio_returns %>% + summarise(return = mean(portfolio.returns), vol = sd(portfolio.returns)) # A tibble: 1 x 2 return vol <dbl> <dbl> 1 -0.0003031948 0.008354069
各銘柄のボラティリティに比べて、ポートフォリオのボラティリティが小さくなっていることがわかります。
ポートフォリオのリターンの推移を可視化します。
portfolio_returns %>% ggplot(aes(x = date, y = portfolio.returns)) + geom_bar(stat = "identity") + theme_tq() + scale_color_tq() + scale_y_continuous(labels = scales::percent)
ということで、あとはポートフォリオのウェイトを最適化して、 ポートフォリオのリターンやボラティリティを詳細に分析していけば良いことがわかります。