今週も特にありません

進捗どうですか?

tidyquantを使った分析メモ ポートフォリオのリターン

tidyquantを使った分析メモの続き。前回までに個別銘柄のリターンについて計算したので、ポートフォリオのリターンについて出してみます。 PerformanceAnalytics::Returns.portfolioのラッパー関数であるtq_portfolioを使えば、tidyなデータを入力として簡単にポートフォリオのリターンを計算できます。

github.com

masaqol.hatenablog.com

masaqol.hatenablog.com

データ

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")

f:id:masaqol:20171001162821p:plain

それぞれの銘柄の期待リターンとボラティリティを計算します。

> 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)

f:id:masaqol:20171001162832p:plain

ということで、あとはポートフォリオのウェイトを最適化して、 ポートフォリオのリターンやボラティリティを詳細に分析していけば良いことがわかります。