今週も特にありません

進捗どうですか?

tidyquantを使った分析メモ 期待リターンとボラティリティ

tidyquantを使った分析メモの続き。今回は対数リターンの計算とその可視化までをやってみます。

github.com

masaqol.hatenablog.com

対数リターンの計算

TOPIX100構成銘柄の株価データを取得したい場合、銘柄コードを用意して、tidyquanttq_getを使うことで簡単に取得することができるところまで前回確認しました。

> TOPIX100
# A tibble: 6,100 × 8
     symbol       date   open   high    low  close  volume
      <chr>     <date>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
1  YJ1605.T 2017-01-04 1182.5 1201.0 1180.0 1190.0 5927100
2  YJ1605.T 2017-01-05 1186.0 1187.0 1148.5 1168.0 8302500
3  YJ1605.T 2017-01-06 1139.0 1158.5 1131.0 1153.5 7737100
4  YJ1605.T 2017-01-10 1141.5 1153.0 1136.0 1136.0 4807700
5  YJ1605.T 2017-01-11 1140.5 1156.5 1133.5 1151.5 5587400
6  YJ1605.T 2017-01-12 1143.0 1156.5 1134.5 1145.5 4831300
7  YJ1605.T 2017-01-13 1130.5 1152.5 1130.5 1150.5 5257000
8  YJ1605.T 2017-01-16 1144.5 1150.0 1127.0 1131.5 3200200
9  YJ1605.T 2017-01-17 1136.0 1138.0 1117.0 1122.0 3625500
10 YJ1605.T 2017-01-18 1116.0 1146.5 1112.0 1143.0 5458900
# ... with 6,090 more rows, and 1 more variables: adjusted <dbl>

株価そのままのデータでは、銘柄ごとの比較などが行いにくいために、対数リターンを計算します。

tidyquantは複数のファイナンス関係のパッケージの便利なラッパーとして機能します。 対数リターンなどの基本的な計算は、元のパッケージの便利な関数を使うことでtidyなデータに対して処理を行えます。

tq_mutateによって、新しい変数として対数リターンを追加します。 適用できる関数の一覧はtq_mutate_fun_optionsによって確認できます。

> tq_mutate_fun_options()
$zoo
 [1] "rollapply"          "rollapplyr"        
 [3] "rollmax"            "rollmax.default"   
 [5] "rollmaxr"           "rollmean"          
 [7] "rollmean.default"   "rollmeanr"         
 [9] "rollmedian"         "rollmedian.default"
[11] "rollmedianr"        "rollsum"           
[13] "rollsum.default"    "rollsumr"          

$xts
 [1] "apply.daily"     "apply.monthly"   "apply.quarterly"
 [4] "apply.weekly"    "apply.yearly"    "diff.xts"       
 [7] "lag.xts"         "period.apply"    "period.max"     
[10] "period.min"      "period.prod"     "period.sum"     
[13] "periodicity"     "to_period"       "to.daily"       
[16] "to.hourly"       "to.minutes"      "to.minutes10" 
...

対数リターンの計算は、quantmodperiodReturnを利用します。

log_returns <- TOPIX100 %>%
  group_by(symbol) %>%
  tq_mutate(
    select = close, 
    mutate_fun = periodReturn,
    period = "daily",
    type = "log",
    col_rename = "log_return"
  ) %>%
  select(symbol, date, close, log_return)

計算したものを確認します。

> log_returns
Source: local data frame [6,100 x 4]
Groups: symbol [100]

     symbol       date  close   log_return
      <chr>     <date>  <dbl>        <dbl>
1  YJ1605.T 2017-01-04 1190.0  0.000000000
2  YJ1605.T 2017-01-05 1168.0 -0.018660423
3  YJ1605.T 2017-01-06 1153.5 -0.012492086
4  YJ1605.T 2017-01-10 1136.0 -0.015287478
5  YJ1605.T 2017-01-11 1151.5  0.013552120
6  YJ1605.T 2017-01-12 1145.5 -0.005224217
7  YJ1605.T 2017-01-13 1150.5  0.004355408
8  YJ1605.T 2017-01-16 1131.5 -0.016652444
9  YJ1605.T 2017-01-17 1122.0 -0.008431379
10 YJ1605.T 2017-01-18 1143.0  0.018543578
# ... with 6,090 more rows

データの可視化

対数リターンを時系列で可視化します。(銘柄コードが7000番台の銘柄のみ)

log_returns %>% 
  filter(grepl("^YJ7", symbol)) %>%
  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:20170722111530p:plain

対数リターンの分布を確認します。(銘柄コードが7000番台の銘柄のみ)

log_returns %>% 
  filter(grepl("^YJ7", symbol)) %>%
  ggplot(aes(x = log_return, fill = symbol)) +
    geom_histogram(binwidth = 0.005) +
    theme_tq() +
    scale_color_tq() +
    facet_wrap(~ symbol, ncol = 3, scales = "free_y")

f:id:masaqol:20170722111649p:plain

期待リターンとボラティリティ

最後に各銘柄の期待リターンとボラティリティを計算し、高い銘柄を確認します。

> return_vol <- log_returns %>%
+   group_by(symbol) %>%
+   summarise(return = mean(log_return), vol = sd(log_return))
>
> return_vol %>%
+   arrange(desc(return)) %>% 
+   head(10)
# A tibble: 10 × 3
     symbol      return         vol
      <chr>       <dbl>       <dbl>
1  YJ6273.T 0.002274630 0.016555097
2  YJ2502.T 0.002011907 0.012576164
3  YJ6758.T 0.002002305 0.013206705
4  YJ6954.T 0.001991144 0.013172032
5  YJ4452.T 0.001708134 0.010844302
6  YJ6861.T 0.001573498 0.009784067
7  YJ4188.T 0.001551808 0.016332976
8  YJ2503.T 0.001353853 0.011863891
9  YJ7741.T 0.001352014 0.011299796
10 YJ8035.T 0.001253836 0.014759141
> 
> return_vol %>%
+   arrange(desc(vol)) %>% 
+   head(10)
# A tibble: 10 × 3
     symbol        return        vol
      <chr>         <dbl>      <dbl>
1  YJ6502.T -2.278774e-03 0.05451714
2  YJ8795.T -8.095544e-05 0.02178426
3  YJ7186.T -2.028825e-03 0.02028579
4  YJ8750.T -1.430680e-04 0.01997049
5  YJ4755.T -7.893335e-04 0.01927645
6  YJ9064.T -7.722044e-04 0.01899148
7  YJ7974.T  8.831755e-04 0.01850704
8  YJ4578.T -1.365315e-04 0.01812934
9  YJ8630.T  8.039943e-06 0.01787958
10 YJ9983.T -3.522327e-03 0.01776665

期待リターントップは、6273のSMC。ボラティリティトップは6502の東芝ということがわかりました。