はじめに
この記事では、R言語から利用できる、バイナンスAPI「binancer」とTwitter API「rtweet」のパッケージ を使用して、仮想通貨の価格を秒速で取得して、その結果を可視化しようかと思います。
binancerは、データ取得が結構速いので、使い勝手は良さそうです。。
今後の仮想通貨のBot(ボット)作成に活かしたいと思っています。
さて、始めていきましょう。
バイナンス
バイナンスというのは、世界最大の仮想通貨取引所です。
詳しくは記事後半にて補足しています。
R環境のセットアップ
「binancer」というRパッケージは、暗号通貨、ポートフォリオ管理、取引に関するデータ収集のためのバイナンスPublic Rest APIへのRクライアントとして機能します。
まずは、環境セットアップのために、binancerを含めて、関連パッケージをインストールします。
install.packages ( "binancer" )
install.packages ( "quantmod" )
install.packages ( "rvest" )
install.packages ( "lubridate" )
install.packages ( "ggplot2" )
library ( binancer)
library ( quantmod)
library ( rvest)
library ( lubridate)
library ( ggplot2)
今回は、ggplot2を使った作図をしています。
binancerを用いて、仮想通貨の現在価格を取得する
バイナンスで有効な、コイン名やシンボル名を取得するには、
binance_coins関数やbinance_symbols関数を使います。
binance_coins ()
length ( binance_coins ())
binance_symbols ()
length ( binance_symbols ())
binance_symbols ()[ grepl ( "USDT$" , binance_symbols ())]
length ( binance_symbols ()[ grepl ( "USDT$" , binance_symbols ())])
BCOINS <- sub ( "USDT$" , "" , binance_symbols ()[ grepl ( "USDT$" , binance_symbols ())])
現在(2022年10月現在)、バイナンスでは、930種類のコインを扱っていることがわかります。
次に、データが取得できるコインのUSDT価格を表示させてみます。
USDTとは、ドルと連動したステーブルコインと言うやつです。基本、アメリカドルと同じ価値となります。
binance_coins_prices ( unit = "USDT" )
coin360.comのテーブル情報から、マーケットキャップなどを取得する
coin360.com は、暗号通貨および暗号交換のライブデータコレクターです。
Webスクレイピングを使って、coin360.comのテーブル表示から、マーケットキャップや24時間出来高などを含む、マーケットデータを取得します。
coin360 <- "https://coin360.com/coin"
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)
coin360.h$ Symbol
BCOINS2 <- coin360.h$ Symbol[ coin360.h$ Symbol %in% BCOINS]
これで、仮想通貨の時価総額情報、バイナンスに上場されているコインシンボルなどを取得できました。
バイナンスから仮想通貨の価格変動を取得して、プロットする
ここでは、バイナンスから仮想通貨の価格情報を取得して、それをプロットしてみます。
ヤフーから取得するよりも、バイナンスAPIの方がサクッと動くような気がします。
まずは、ビットコイン(BTCUSDT)の2ヶ月間の各日終値をプロットします。うぅ〜ん、レンジですね。
Dat0 <- binance_klines ( 'BTCUSDT' , interval = '1d' ,
start_time = lubridate:: today () - lubridate:: ddays ( 60 ),
end_time = lubridate:: today ())
head ( Dat0)
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)の価格の平均値を計算して、プロットしてみます。
Symbols <- paste0 ( BCOINS2, "USDT" )[ 1 : 3 ]
Dat <- list ()
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位までのアルトコインで計算します。
いちおう、ビットコインも含めています。
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位のアルトコインで計算します。
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位以降のアルトコインで計算します。
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年の下げ相場の際には、特に、どのコインが勢いあるかと、全体のトレンドを俯瞰するには良いやり方なような気がしました。
補足
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が生成できれば、実際に実行していきます。
install.packages ( "coinmarketcapr" )
library ( coinmarketcapr)
setup ( api_key= "Your API Key" )
get_api_info ()
MarList <- get_crypto_listings ( currency = "USD" , limit= 200 )
head ( MarList)
get_crypto_map ( symbol= "BTC" )
get_exchange_map ()
github.com
円換算するための為替の現在価格について
先述の通り、USDTは、アメリカドル通貨に類似する価値を持ちます。
そのため、アメリカドルと日本円の為替が分かれば、
USDTは日本円のレートに近似できます。
近似と言っているのは、USDTとアメリカドルの変動も完全には一致しないためです。
ここでは、getFX関数で、為替のデータを取得します。
quantmod:: getFX ( "USD/JPY" , src= 'yahooj' )
USDJPY[ nrow ( USDJPY),]
Yen <- as.numeric ( USDJPY[ nrow ( USDJPY),])
Yen
この変数(Yen)の1ドル144.5193円の為替を使って、仮想通貨を円に換算します。
次に、バイナンスから得られるマーケットデータにその為替を掛け算します。
CoinD <- binance_coins_prices ( unit = "USDT" )
str ( CoinD)
CoinD$ CoinYen <- CoinD$ usd* Yen
head ( CoinD)
binancer ReadMe 日本語翻訳
以下の内容は、GitHubのbinancerガイドの日本語翻訳です。
github.com
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 ()
特定のシンボルペアのデータを取得します(例:直近のBitcoin/USDTの変化)。
( klines <- binance_klines ( 'BTCUSDT' , interval = '1m' ))
この取得データを、例えば、簡単な折れ線グラフで可視化してみます。
library ( ggplot2)
ggplot ( klines, aes ( close_time, close)) + geom_line ()
下記が、出力結果です。
次に、ggplot2のパラメータ調整をしてローソク足チャートにして可視化してみます。
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時間の複数のペアに拡張します。
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 )
下記が、出力結果です。
関数名
概要
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から直近の取引を取得
参考資料
daroczig.github.io
fx0quants.blogspot.com
colorspace.r-forge.r-project.org