今週も特にありません

進捗どうですか?

tidyquantでビットコインの取引データを取得する

2017年は何かと仮想通貨の価格が高騰(or 暴落)が騒がれた一年でした。

仮想通貨が法定通貨と同様に決済手段金融商品の一つとして定着するようになった際には、今以上に様々な分析が行われると思います。

その前に、tidyverseな世界観でのデータ取得から可視化まではどうやるの?は、世の中的に少し需要があるのではないかと思ったため調べてみました。

今回はデータ取得部分を中心にメモとして書いておきます。

データソース

まず、tidyquant::tq_getで指定できるビットコインに関するコードを探したところ、Quandl にいくつかそれに該当するものが見つかりました。

www.quandl.com

日本では、日本円とビットコインの取引レート BTC/JPY が興味の対象があると思われるため、大手の仮想通貨取引所の価格と取引高のデータが分析対象としては最適化と思われます。

データ取得

データを取得できる期間が不明なため、bitFlyerZaifcoincheck の取引所のデータを取得します。

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

f:id:masaqol:20171222181725p:plain

どうやら 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を使うことでできます。