今週も特にありません

進捗どうですか?

tidyquantを使った分析メモ データの取得と可視化

R-bloggersでも度々登場して気になっていたtidyquantを使った分析メモになります。

github.com

基本的な使い方は、Vignettesが充実しています。 また、日本語での資料としてはtidyquantの使い方があります。 また、Exploratoryと組み合わせて分析した記事もあります。 qiita.com

ここでは、日本の株式銘柄をそれなりに大量取得して、データを可視化するところまでやってみます。

銘柄コード一覧を作成

まず、株価データを取得する際に必要な銘柄コード一覧を作成します。 ここでは、TOPIX100構成銘柄をまとめて取得することを考えます。

銘柄の入れ替え等があった場合に適宜更新を行ってくれると思われる 松井証券さんのページを信用できる情報として、 rvestでスクレイプして作成します。

library(tidyverse)
library(tidyquant)
library(rvest)

url <- "http://www.matsui.co.jp/service/stock/trade/rule_topix100/"
html <- read_html(url, encoding = "UTF-8")

stock_name_df <- html %>% 
  html_node("table.m-tbl") %>%
  html_table

htmlの中からm-tblクラスのtable部分をdata.frameとして取得しています。

> stock_name_df
    銘柄コード                                        銘柄名
1         1605                              国際石油開発帝石
2         1878                                      大東建託
3         1925                                大和ハウス工業
4         1928                                    積水ハウス
5         2502                アサヒグループホールディングス
6         2503                        キリンホールディングス
7         2802                                        味の素
8         2914                                日本たばこ産業
9         3382                 セブン&アイ・ホールディングス
10        3402                                          東レ
11        3407                                        旭化成
...

データ取得で必要なのは銘柄コードのみのため、これだけを切り出せば完了です。

stock_code <- stock_name_df %>%
  select(`銘柄コード`)

データを確認します。

> stock_code
    銘柄コード
1         1605
2         1878
3         1925
4         1928
5         2502
6         2503
7         2802
8         2914
9         3382
10        3402
11        3407
...

株価データの取得

銘柄コード一覧が作成できたら、それをもとに株価データを取得します。 ここでは、tq_get()get = "stock.prices.japan"を指定して、ヤフーファイナンスからデータを取得することにします。

この際に銘柄コードは、"YJ9984.T"のようにして問い合わせれば、データを取得できます。 (取得に時間がかかるために、3ヶ月分としています。)

TOPIX100 <- stock_code %>%
  unlist %>%
  as.character %>%
  paste0("YJ", ., ".T") %>%
  tq_get(get = "stock.prices.japan",
         from = "2017-01-01",
         to = "2017-03-31")

データを確認します。

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

データの可視化

取得したデータを可視化します。全ての銘柄をプロットすると見にくいため、 銘柄コードが7000番台の銘柄のみの株価推移を可視化します。

TOPIX100 %>% 
  filter(grepl("^YJ7", symbol)) %>%
  ggplot(aes(x = date, y = close, colour = symbol)) +
    geom_line() + 
    theme_tq() +
    scale_color_tq() +
    facet_wrap(~ symbol, ncol = 3, scales = "free_y")

f:id:masaqol:20170521123132p:plain