tidyquantでビットコインの取引データを取得する
2017年は何かと仮想通貨の価格が高騰(or 暴落)が騒がれた一年でした。
仮想通貨が法定通貨と同様に決済手段や金融商品の一つとして定着するようになった際には、今以上に様々な分析が行われると思います。
その前に、tidyverse
な世界観でのデータ取得から可視化まではどうやるの?は、世の中的に少し需要があるのではないかと思ったため調べてみました。
今回はデータ取得部分を中心にメモとして書いておきます。
データソース
まず、tidyquant::tq_get
で指定できるビットコインに関するコードを探したところ、Quandl にいくつかそれに該当するものが見つかりました。
日本では、日本円とビットコインの取引レート BTC/JPY が興味の対象があると思われるため、大手の仮想通貨取引所の価格と取引高のデータが分析対象としては最適化と思われます。
データ取得
データを取得できる期間が不明なため、bitFlyer、Zaif、coincheck の取引所のデータを取得します。
library(tidyverse) library(tidyquant) codes <- c("BCHARTS/BITFLYERJPY", "BCHARTS/ZAIFJPY", "BCHARTS/COINCHECKJPY") btc_data <- tq_get(x = codes, get = "quandl", from = "2017-01-01", to = "2017-12-21")
取得したデータを確認します。
> btc_data # A tibble: 684 x 9 symbol date open high low close volume.btc. volume.currency. weighted.price <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 BCHARTS/BITFLYERJPY 2017-07-04 296127 297040 287072 292501 6401.075 1871425686 292361.2 2 BCHARTS/BITFLYERJPY 2017-07-05 292501 295800 286220 292127 9259.952 2689073855 290398.3 3 BCHARTS/BITFLYERJPY 2017-07-06 292252 294710 290650 293850 7480.301 2193005651 293170.8 4 BCHARTS/BITFLYERJPY 2017-07-07 293900 294350 285432 288084 8908.557 2580602677 289676.9 5 BCHARTS/BITFLYERJPY 2017-07-08 288121 291988 285693 291821 5627.901 1625558830 288839.3 6 BCHARTS/BITFLYERJPY 2017-07-09 291943 293333 288500 288855 4854.138 1411796907 290844.0 7 BCHARTS/BITFLYERJPY 2017-07-10 288855 289750 267370 273753 15486.759 4352953461 281075.8 8 BCHARTS/BITFLYERJPY 2017-07-11 273751 277930 265850 266592 14649.179 3972753107 271192.9 9 BCHARTS/BITFLYERJPY 2017-07-12 266770 274839 258888 272350 13183.987 3508777924 266139.4 10 BCHARTS/BITFLYERJPY 2017-07-13 272360 276799 264489 267990 9524.230 2578378059 270717.8 # ... with 674 more rows
データ自体は取得できていそうですが、bitFlyerのデータが7月の初めくらいからしか取得できていなさそうです。
データ可視化
全体を確認するために close の値を可視化します。
btc_data %>% select(symbol, date, close) %>% ggplot(aes(x = date, y = close, colour = symbol)) + geom_line(size = 1) + theme_tq() + scale_color_tq()
どうやら coincheck 以外は、7月以降のデータしか取得できないようです。 加えて、データが欠損(値が0になっている)ところがあるようです。
長期間のデータを使いたい場合は coincheck を選択すれば良さそうです。
欠損値への対応
bitFlyer のデータを使いたい場合は欠損値(この場合は0)を処理する必要があります。 どう欠損値を処理すれば良いかはその時の状況にもよりますが、とりあえず、欠損している部分を削除してしまう場合は、以下のようにすれば良さそうです。
dplyr::if_else
を使う場合は、double型に対応させて0をNA_real_
に置き換えてna.omit
でその行のデータを取り除きます。
bitflyer_btc_data <- btc_data %>% filter(symbol == "BCHARTS/BITFLYERJPY") %>% mutate_if(is.numeric, funs(if_else(. == 0, NA_real_, .))) %>% drop_na
NA値を削除せずに直前のデータで埋める場合には、tidyr::fill
を使うことでできます。