- はじめに
- binancerを用いて、仮想通貨の現在価格を取得する
- coin360.comのテーブル情報から、マーケットキャップなどを取得する
- バイナンスから仮想通貨の価格変動を取得して、プロットする
- まとめ
- 補足
- binancer ReadMe 日本語翻訳
- ‘binancer’パッケージ内の関数群
- 参考資料
はじめに
この記事では、R言語から利用できる、バイナンスAPI「binancer」とTwitter API「rtweet」のパッケージを使用して、仮想通貨の価格を秒速で取得して、その結果を可視化しようかと思います。
binancerは、データ取得が結構速いので、使い勝手は良さそうです。。
今後の仮想通貨のBot(ボット)作成に活かしたいと思っています。
さて、始めていきましょう。
バイナンス
バイナンスというのは、世界最大の仮想通貨取引所です。
詳しくは記事後半にて補足しています。
R環境のセットアップ
「binancer」というRパッケージは、暗号通貨、ポートフォリオ管理、取引に関するデータ収集のためのバイナンスPublic Rest APIへのRクライアントとして機能します。
まずは、環境セットアップのために、binancerを含めて、関連パッケージをインストールします。
##binancerのインストール install.packages("binancer") ##quantmodのインストール install.packages("quantmod") #rvestのインストール install.packages("rvest") #lubridateのインストール install.packages("lubridate") #ggplot2のインストール install.packages("ggplot2") #ロード library(binancer) library(quantmod) library(rvest) library(lubridate) library(ggplot2)
今回は、ggplot2を使った作図をしています。
binancerを用いて、仮想通貨の現在価格を取得する
バイナンスで有効な、コイン名やシンボル名を取得するには、 binance_coins関数やbinance_symbols関数を使います。
##Binanceから現在有効なすべてのコイン名を取得する binance_coins() # [1] "1INCH" "1INCHBUSD" "AAVE" "AAVEBUSD" # [5] "ACA" "ACABUSD" "ACH" "ACHBUSD" # [9] "ACM" "ACMBUSD" "ADA" "ADAAUD" # [13] "ADABIDR" "ADABRL" "ADABUSD" "ADADOWN" # [17] "ADAEUR" "ADAGBP" "ADARUB" "ADATRY" #コインの種類(2022年10月5日現在) length(binance_coins()) #[1] 930 ##Binanceから現在有効な全てのシンボル名を取得する binance_symbols() # [1] "ETHBTC" "LTCBTC" "BNBBTC" "NEOBTC" # [5] "QTUMETH" "EOSETH" "SNTETH" "BNTETH" # [9] "GASBTC" "BNBETH" "BTCUSDT" "ETHUSDT" # [13] "WTCBTC" "LRCBTC" "LRCETH" "QTUMBTC" #シンボルの種類(2022年10月5日現在) length(binance_symbols()) #[1] 1446 ##USDTのコインペア取得 binance_symbols()[grepl("USDT$", binance_symbols())] #USDTのコインペアの種類(2022年10月6日現在) length(binance_symbols()[grepl("USDT$", binance_symbols())]) #[1] 344 #通貨名 BCOINS <- sub("USDT$", "", binance_symbols()[grepl("USDT$", binance_symbols())])
現在(2022年10月現在)、バイナンスでは、930種類のコインを扱っていることがわかります。
次に、データが取得できるコインのUSDT価格を表示させてみます。
USDTとは、ドルと連動したステーブルコインと言うやつです。基本、アメリカドルと同じ価値となります。
##Binanceから現在有効なすべてのコイン名をUSDT価格と一緒に取得する binance_coins_prices(unit = "USDT") # symbol usd # 1: ETH 1344.555397 # 2: LTC 54.202810 # 3: BNB 292.083987 # 4: NEO 8.725527 # 5: QTUM 2.840992 # --- #1185: NEBLBUSD NA #1186: PROSBUSD NA #1187: VIBBUSD NA #1188: GMX 53.659978 #1189: GMXBUSD NA
coin360.comのテーブル情報から、マーケットキャップなどを取得する
coin360.comは、暗号通貨および暗号交換のライブデータコレクターです。
Webスクレイピングを使って、coin360.comのテーブル表示から、マーケットキャップや24時間出来高などを含む、マーケットデータを取得します。
#coin360.comのURL定義 coin360 <- "https://coin360.com/coin" #coin360テーブルのWebスクレイピング coin360.h <- coin360 %>% rvest::read_html() %>% rvest::html_table() %>% as.data.frame() #データ修正 colnames(coin360.h) <- c("No", "Symbol", "Name", "Market.Cap.USD", "Price.USD", "Volume.24h", "Circulating.Supply", "Change.24h", "Price.Graph.7d") coin360.h$Market.Cap.USD <- as.numeric(gsub(",", "",coin360.h$Market.Cap.USD)) coin360.h$Price.USD <- as.numeric(gsub(",", "",coin360.h$Price.USD)) coin360.h$Volume.24h <- as.numeric(gsub(",", "",coin360.h$Volume.24h)) coin360.h$Circulating.Supply <- as.numeric(gsub(",", "",coin360.h$Circulating.Supply)) coin360.h$Change.24h <- as.numeric(gsub("%", "",coin360.h$Change.24h)) #ステータスコインを外す coin360.h <- coin360.h[!(coin360.h$Symbol %in% c("USDT","USDC","BUSD")),] #表示 head(coin360.h) # No Symbol Name Market.Cap.USD Price.USD Volume.24h Circulating.Supply #1 1 BTC Bitcoin 387393137156 2.02080e+04 19249403326 19170493 #2 2 ETH Ethereum 167704488992 1.36700e+03 6357594302 122669869 #4 4 BNB Binance Coin 47554606715 2.94753e+02 255731668 161337261 #6 6 XRP Ripple 24646010149 4.94318e-01 1025212085 49858575704 #8 8 ADA Cardano 14829661487 4.32875e-01 233090037 34258550873 #9 9 SOL Solana 12081701906 3.40116e+01 347964522 355222498 # Change.24h Price.Graph.7d #1 -0.06 NA #2 0.98 NA #4 -0.08 NA #6 2.32 NA #8 0.04 NA #9 -0.37 NA #シンボル一覧 coin360.h$Symbol #バイナンスにあるコインで絞る BCOINS2 <- coin360.h$Symbol[coin360.h$Symbol %in% BCOINS]
これで、仮想通貨の時価総額情報、バイナンスに上場されているコインシンボルなどを取得できました。
バイナンスから仮想通貨の価格変動を取得して、プロットする
ここでは、バイナンスから仮想通貨の価格情報を取得して、それをプロットしてみます。
ヤフーから取得するよりも、バイナンスAPIの方がサクッと動くような気がします。
まずは、ビットコイン(BTCUSDT)の2ヶ月間の各日終値をプロットします。うぅ〜ん、レンジですね。
#1日ごとのBTCの価格取得 Dat0 <- binance_klines('BTCUSDT', interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) #データ表示 head(Dat0) # open_time open high low close volume close_time #1: 2022-08-08 09:00:00 23174.39 24245.00 23154.25 23810.00 170958.4 2022-08-09 08:59:59 #2: 2022-08-09 09:00:00 23810.98 23933.25 22865.00 23149.95 143182.5 2022-08-10 08:59:59 #3: 2022-08-10 09:00:00 23151.32 24226.00 22664.69 23954.05 208916.5 2022-08-11 08:59:59 #4: 2022-08-11 09:00:00 23954.05 24918.54 23852.13 23934.39 249759.8 2022-08-12 08:59:59 #5: 2022-08-12 09:00:00 23933.09 24456.50 23583.00 24403.68 174207.6 2022-08-13 08:59:59 #6: 2022-08-13 09:00:00 24401.70 24888.00 24291.22 24441.38 152852.3 2022-08-14 08:59:59 # quote_asset_volume trades taker_buy_base_asset_volume taker_buy_quote_asset_volume #1: 4078052111 5892045 85942.30 2050118384 #2: 3347110919 5105613 70598.78 1650310503 #3: 4918825599 6818207 105046.91 2473680340 #4: 6097813763 8269994 125001.91 3051727584 #5: 4175834602 6134163 87283.32 2092464530 #6: 3751417148 5617859 76352.50 1873989924 # symbol #1: BTCUSDT #2: BTCUSDT #3: BTCUSDT #4: BTCUSDT #5: BTCUSDT #6: BTCUSDT #プロット plot(as.Date(Dat0$close_time), Dat0$close, xlab = "", ylab = "", type = "l", col = "#73CACE", lwd = 2, axes = FALSE) axis(2, at = signif(seq(min(Dat0$close)-abs(diff(range(Dat0$close)))*0.05, max(Dat0$close)+abs(diff(range(Dat0$close)))*0.05, length.out=8), 2)) axis.Date(1, at=seq.Date(as.Date(min(Dat0$close_time)), as.Date(max(Dat0$close_time)), length.out=8), format= "%m/%d") mtext(paste0(lubridate::today()-lubridate::ddays(60), " - ", lubridate::today(), " BTCUSDT"), side = 3, line=1)
下記がプロット結果です。
3つの仮想通貨(BTC, ETH, BNB)の価格を可視化する
次に、ビットコイン(BTCUSDT)、イーサリアム(ETHUSDT)、バイナンスコイン(BNBUSDT)の価格の平均値を計算して、プロットしてみます。
#USDTペアシンボルの作成 Symbols <- paste0(BCOINS2, "USDT")[1:3] Dat <- list() #3つの通貨で、1日ごとの価格取得 for(N in 1:length(Symbols)){ Dat0 <- binance_klines(Symbols[N], interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) Dat[[N]] <- Dat0 names(Dat)[N] <- Symbols[N] } #詳細表示 str(Dat) #データ結合 Dat0 <- c() for(n in 1:length(Dat)){Dat0 <- rbind(Dat0, Dat[[n]][,c("close_time", "close", "symbol")])} #表示 head(Dat0) tail(Dat0) #可視化 ggplot2::ggplot(Dat0, aes(x = close_time, y = close, color = symbol)) + geom_line()
下記がプロット結果です。
あら、3者で金額が違い過ぎて、スケールが合いません。。。ビットコインが高すぎますね。
それでは、価格を補正して、プロットをやり直します。
#価格補正 Dat2 <- c() for(N in 1:length(Symbols)){ Dat0 <- binance_klines(Symbols[N], interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) Dat2a <- Dat0[,c("close_time", "close", "symbol")] Dat2a$close <- Dat2a$close/mean(Dat2a$close) Dat2 <- rbind(Dat2, Dat2a) } #平均値計算 a <- tapply(Dat2$close, factor(Dat2$close_time), mean) b <- names(a) d <- data.frame(close_time=as.POSIXct(b), close=a, symbol="Ave", row.names = 1:length(a)) #結合 Dat2 <- rbind(Dat2, d) #可視化 ggplot2::ggplot(Dat2, aes(x = close_time, y = close, color = symbol)) + geom_line()
下記がプロットの結果です。
アルトコインの価格を眺めて、上昇傾向のコインを探す
アルトコインというのは、Alternative Coinの略で、 一般的に、ビットコイン以外の暗号通貨の総称として使われます。
ここでは、バイナンス上場のアルトコインの値動きを可視化して、 上昇傾向にあるコインだけ色付けしてみました。 上昇傾向は、単純に線形回帰の傾きが正の傾きを持つコインとしています。
まずは、バイナンスの時価総額20位までのアルトコインで計算します。 いちおう、ビットコインも含めています。
#USDTペアシンボルの作成 Symbols <- paste0(BCOINS2, "USDT")[1:20] Dat3 <- c() slope <- c() #価格補正した for(N in 1:length(Symbols)){ Dat0 <- binance_klines(Symbols[N], interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) Dat3a <- Dat0[,c("close_time", "close", "symbol")] Dat3a$close <- Dat3a$close/mean(Dat3a$close) Dat3 <- rbind(Dat3, Dat3a) #傾きの計算 slope[N] <- ifelse(coef(with(Dat3a, lm(close ~ c(1:length(close)))))[2] < 0, "#c8c8cb", sample(hcl.colors(300), 1)) names(slope)[N] <- Symbols[N] } #可視化 ggplot2::ggplot(Dat3, aes(x = close_time, y = close, color = symbol)) + geom_line() + scale_color_manual(values = slope) + geom_smooth(method = 'gam', aes( group = 1 )) ggsave("CoinPlot_1.png", device = "png", width = 8, height = 6)
下記が時価総額20位までの結果です。
次に、21-40位のアルトコインで計算します。
#USDTペアシンボルの作成 Symbols <- paste0(BCOINS2, "USDT")[21:40] Dat4 <- c() slope <- c() #価格補正した for(N in 1:length(Symbols)){ Dat0 <- binance_klines(Symbols[N], interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) Dat4a <- Dat0[,c("close_time", "close", "symbol")] Dat4a$close <- Dat4a$close/mean(Dat4a$close) Dat4 <- rbind(Dat4, Dat4a) #傾きの計算 slope[N] <- ifelse(coef(with(Dat4a, lm(close ~ c(1:length(close)))))[2] < 0, "#c8c8cb", sample(hcl.colors(300), 1)) names(slope)[N] <- Symbols[N] } #可視化 ggplot2::ggplot(Dat4, aes(x = close_time, y = close, color = symbol)) + geom_line() + scale_color_manual(values = slope) + geom_smooth(method = 'gam', aes( group = 1 )) ggsave("CoinPlot_2.png", device = "png", width = 8, height = 6)
下記が21-40位の結果です。
次に、41位以降のアルトコインで計算します。
#USDTペアシンボルの作成 Symbols <- paste0(BCOINS2, "USDT")[41:length(BCOINS2)] Dat4 <- c() slope <- c() #価格補正した for(N in 1:length(Symbols)){ Dat0 <- binance_klines(Symbols[N], interval = '1d', start_time = lubridate::today()-lubridate::ddays(60), end_time = lubridate::today()) Dat4a <- Dat0[,c("close_time", "close", "symbol")] Dat4a$close <- Dat4a$close/mean(Dat4a$close) Dat4 <- rbind(Dat4, Dat4a) #傾きの計算 slope[N] <- ifelse(coef(with(Dat4a, lm(close ~ c(1:length(close)))))[2] < 0, "#c8c8cb", sample(hcl.colors(300), 1)) names(slope)[N] <- Symbols[N] } #可視化 ggplot2::ggplot(Dat4, aes(x = close_time, y = close, color = symbol)) + geom_line() + scale_color_manual(values = slope) + geom_smooth(method = 'gam', aes( group = 1 )) ggsave("CoinPlot_3.png", device = "png", width = 9, height = 6)
下記が40位以降の結果です。
まとめ
bainancerを使った、仮想通貨の価格取得と可視化について概説しました。 bainancerは実行時間が速く、他のパッケージよりも、使い勝手が良いかもです。
2022年の下げ相場の際には、特に、どのコインが勢いあるかと、全体のトレンドを俯瞰するには良いやり方なような気がしました。
補足
仮想通貨取引所 バイナンス/Binance
2017年7月に設立された暗号通貨取引所である、 Binance(バイナンス)は、 2021年4月現在、1日の取引高が3兆円を超える世界最大の暗号資産取引所です。
当初、バイナンス社は中国で設立されましたが、 2017年9月の中国政府によって仮想通貨の規制が強まりサーバーと本社を 中国外に移し、その後、各国を転々としている状況と言われてます。
一時期、日本にも本社機能があったようですが、残念ですね。。
coinmarketcaprパッケージについて
Coin Market Capは、ビットコインをはじめとする、数千ものアルトコインの現在および過去のデータに無料で提供しているウェブサイトです。
Coin Market Capから仮想通貨のマーケットキャップ(時価総額)や価格を取得できる、Rパッケージがあるようです。その名も、coinmarketcaprパッケージです。
まずは、このパッケージの機能を使うには、Coin Market Capでアカウント登録して、API Keyを発行しないといけません。
上画像の「Crypto API」の項目から作成できます。Basicプランなら無料で使用できます。
さて、API Keyが生成できれば、実際に実行していきます。
#coinmarketcaprのインストール install.packages("coinmarketcapr") library(coinmarketcapr) #セットアップ: API keyを定義します setup(api_key="Your API Key") #API情報の表示: セットアップが完了していれば表示される get_api_info() #マーケットデータの取得 MarList <- get_crypto_listings(currency = "USD", limit=200) #表示 head(MarList) # id name symbol slug num_market_pairs date_added #1: 1 Bitcoin BTC bitcoin 9767 2013-04-28 #2: 1027 Ethereum ETH ethereum 6130 2015-08-07 #3: 825 Tether USDT tether 40599 2015-02-25 #4: 3408 USD Coin USDC usd-coin 6462 2018-10-08 #5: 1839 BNB BNB bnb 1123 2017-07-25 #6: 52 XRP XRP xrp 826 2013-08-04 #交換可能な仮想通貨のリスト get_crypto_map(symbol="BTC") #仮想通貨交換所のリスト get_exchange_map()
円換算するための為替の現在価格について
先述の通り、USDTは、アメリカドル通貨に類似する価値を持ちます。
そのため、アメリカドルと日本円の為替が分かれば、 USDTは日本円のレートに近似できます。
近似と言っているのは、USDTとアメリカドルの変動も完全には一致しないためです。
ここでは、getFX関数で、為替のデータを取得します。
#現在の為替を取得する quantmod::getFX("USD/JPY", src='yahooj') #データの最行を表示する USDJPY[nrow(USDJPY),] # USD.JPY #2022-10-04 144.5193 #ベクトル変換 Yen <- as.numeric(USDJPY[nrow(USDJPY),]) Yen #[1] 144.5193
この変数(Yen)の1ドル144.5193円の為替を使って、仮想通貨を円に換算します。
次に、バイナンスから得られるマーケットデータにその為替を掛け算します。
##Binanceから現在有効なすべてのコイン名をUSDT価格と一緒に取得する CoinD <- binance_coins_prices(unit = "USDT") #詳細表示 str(CoinD) #Classes ‘data.table’ and 'data.frame': 1189 obs. of 2 variables: # $ symbol: chr "ETH" "LTC" "BNB" "NEO" ... # $ usd : num 1343.73 54.21 291.85 8.76 2.84 ... # - attr(*, ".internal.selfref")=<externalptr> #変換算 CoinD$CoinYen <- CoinD$usd*Yen #表示 head(CoinD) # symbol usd CoinYen #1: ETH 1343.734774 194195.6506 #2: LTC 54.206032 7833.8195 #3: BNB 291.852351 42178.3066 #4: NEO 8.763007 1266.4239 #5: QTUM 2.839555 410.3706 #6: EOS 1.174525 169.7416
binancer ReadMe 日本語翻訳
以下の内容は、GitHubのbinancerガイドの日本語翻訳です。
binancerは、バイナンスのPublic Rest APIへのRクライアントです。
API ドキュメント: https://github.com/binance/binance-spot-api-docs/blob/master/rest-api.md
早速、binancerの使い方を簡単に紹介します。
まずは、Binanceでサポートされている暗号通貨の最新のUSD価格を取得します。
#パッケージ・ロード library(binancer) #コイン価格の取得 binance_coins_prices() # symbol usd # 1: ETH 1453.1537658 # 2: LTC 49.7377148 # 3: BNB 255.2214529 # 4: NEO 10.3208503 # 5: QTUM 3.1794484 # --- #1160: OP 0.6653655 #1161: OPBUSD NA #1162: OGBUSD NA #1163: KEYBUSD NA #1164: ASRBUSD NA
特定のシンボルペアのデータを取得します(例:直近のBitcoin/USDTの変化)。
(klines <- binance_klines('BTCUSDT', interval = '1m')) # open_time open high low close volume # 1: 2022-06-12 07:00:00 28561.04 28578.08 28550.92 28568.19 22.23649 # 2: 2022-06-12 07:01:00 28568.18 28569.83 28561.60 28569.82 11.13015 # 3: 2022-06-12 07:02:00 28569.83 28574.37 28569.82 28574.37 11.20058 # 4: 2022-06-12 07:03:00 28574.36 28575.21 28545.10 28545.10 24.72200 # 5: 2022-06-12 07:04:00 28545.11 28556.48 28538.14 28556.48 26.57519 # --- #496: 2022-06-12 15:15:00 27415.74 27478.99 27415.73 27462.12 179.02717 #497: 2022-06-12 15:16:00 27462.11 27464.07 27436.16 27450.11 60.90279 #498: 2022-06-12 15:17:00 27450.12 27458.27 27437.23 27453.29 37.54110 #499: 2022-06-12 15:18:00 27453.29 27458.30 27440.00 27441.44 38.58492 #500: 2022-06-12 15:19:00 27441.44 27442.63 27440.01 27440.02 3.45739
この取得データを、例えば、簡単な折れ線グラフで可視化してみます。
#ggplot2のセットアップ #install.packages("ggplot2") library(ggplot2) #可視化 ggplot(klines, aes(close_time, close)) + geom_line()
下記が、出力結果です。
次に、ggplot2のパラメータ調整をしてローソク足チャートにして可視化してみます。
#scalesのセットアップ install.packages("scales") library(scales) #プロット(オリジナルを少し修正) ggplot(klines, aes(open_time)) + geom_linerange(aes(ymin = open, ymax = close, color = close < open), size = 2) + geom_errorbar(aes(ymin = low, ymax = high), size = 0.25) + theme_bw() + theme('legend.position' = 'none') + xlab('') + ggtitle(paste('Last Updated:', Sys.time())) + scale_y_continuous(labels = scales::dollar) + scale_color_manual(values = c('#1a9850', '#d73027'))
下記が、出力結果です。
さらに、この実行を15分間隔で過去24時間の複数のペアに拡張します。
#data.tableのセットアップ install.packages("data.table") library(data.table) #データ取得 klines <- rbindlist(lapply( c('ETHBTC', 'ARKBTC', 'NEOBTC', 'IOTABTC'), binance_klines, interval = '15m', limit = 4*24)) #可視化 ggplot(klines, aes(open_time)) + geom_linerange(aes(ymin = open, ymax = close, color = close < open), size = 2) + geom_errorbar(aes(ymin = low, ymax = high), size = 0.25) + theme_bw() + theme('legend.position' = 'none') + xlab('') + ggtitle(paste('Last Updated:', Sys.time())) + scale_color_manual(values = c('#1a9850', '#d73027')) + facet_wrap(~symbol, scales = 'free', nrow = 2)
下記が、出力結果です。
‘binancer’パッケージ内の関数群
関数名 | 概要 |
---|---|
binance_coins | Binanceから現在有効なコイン名をすべて取得 |
binance_coins_prices | Binanceから現在有効なすべてのコイン名をUSDTと一緒に取得する 価格 |
binance_avg_price | シンボルの現在の平均価格を取得 |
binance_klines | Binanceからkline/candlestickデータを取得 |
binance_symbols | Binanceから現在有効なシンボル名をすべて取得 |
binance_ticker_24hr | 24時間ローリングウィンドウの価格変動統計 |
binance_ticker_all_prices | すべてのシンボルペアで最新のBinanceの変換レートとUSD価格を取得する |
binance_ticker_price | あるシンボルまたはすべてのシンボルの最終価格を取得 |
binance_account | 現在の一般的なBinanceアカウント情報(残高なし)を取得 |
binance_all_orders | Binanceのアカウントから全ての注文を取得 |
binance_balances | 現在のBinanceの残高を表形式で取得 |
binance_cancel_order | Binanceアカウントで注文をキャンセル |
binance_credentials | Binance APIと対話するためのAPIキーとシークレットを設定 |
binance_depth | Binanceからオーダーブックの深さデータを取得 |
binance_exchange_info | Binanceからexchange Infoを取得 |
binance_filters | シンボルに対する現在のフィルタを取得 |
binance_mytrades | Binanceアカウント上の特定のシンボルに対する取引を取得 |
binance_new_order | Binanceアカウントで新規注文を出す |
binance_open_orders | Binanceアカウントから未決済注文を取得 |
binance_ping | Rest APIへの接続をテストする |
binance_query_order | Binanceアカウントで注文を問い合わせる |
binance_ticker_all_books | すべてのシンボルペアで最新のBinanceのビッドとアスクを取得 |
binance_ticker_book | シンボルまたはすべてのシンボルの最後のビッドとアスクを取得 |
binance_ticks | Binanceからティックデータを取得 |
binance_time | Binanceから現在のサーバー時刻を取得 |
binance_trades | Binanceから直近の取引を取得 |