tidyquantを使った分析メモ 期待リターンとボラティリティ
tidyquant
を使った分析メモの続き。今回は対数リターンの計算とその可視化までをやってみます。
対数リターンの計算
TOPIX100構成銘柄の株価データを取得したい場合、銘柄コードを用意して、tidyquant
のtq_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" ...
対数リターンの計算は、quantmod
のperiodReturn
を利用します。
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")
対数リターンの分布を確認します。(銘柄コードが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")
期待リターンとボラティリティ
最後に各銘柄の期待リターンとボラティリティを計算し、高い銘柄を確認します。
> 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