京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R/binancer】バイナンス仮想通貨の上昇傾向銘柄を検出して、Twitterにポストするボット機能を作成してみた件

はじめに

Bot(ボット)あるいはWebボットは、インターネット上で自動化されたタスク(一般に単純な繰り返しのタスク)を実行するアプリケーションのことを指します。

この記事では、仮想通貨・アルトコインの上昇傾向銘柄を探索・可視化して、 ツイッターにポストするボット機能を作成しようかと思っています。

初稿は、可視化のところがメインになってますが・・・

R環境のセットアップ

R言語から利用できる、class="marker-yellow">バイナンスAPI「binancer」とTwitter API「rtweet」のパッケージを使えるように準備します。

まず、関連のRパッケージをセットアップします。

##binancerのインストール
install.packages("binancer")
#rtweetのインストール
install.packages("rtweet")
#lubridateのインストール
install.packages("lubridate")
#ggplot2のインストール
install.packages("ggplot2")

#ロード
library(binancer)
library(rtweet)
library(lubridate)
library(ggplot2)

今回は、ggplot2を使って、作図をしています。

binancerを用いて、バイナンス仮想通貨のシンボル情報を取得する

バイナンスで有効な、コインペアのシンボル名を取得するには、 binance_symbols関数を使います。

ここでは、USDTのコインペアを取得します。USDTはドルと連動したステーブルコインです。

##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月11日現在)
length(binance_symbols()[grepl("USDT$", binance_symbols())])
#[1] 343

#通貨ペアの取得
BCOINS <- binance_symbols()[grepl("USDT$", binance_symbols())]
BCOINS <- BCOINS[!grepl("UPUSDT$", BCOINS)]
BCOINS <- BCOINS[!grepl("DOWNUSDT$", BCOINS)]

#表示
str(BCOINS)
#chr [1:327] "BTCUSDT" "ETHUSDT" "BNBUSDT" "NEOUSDT" "LTCUSDT" "QTUMUSDT" "ADAUSDT" ...

上昇傾向にある、バイナンス仮想通貨・アルトコインの探索と可視化を行うプログラム

このプログラムでは、バイナンス取引所で有効な、仮想通貨銘柄の過去2ヶ月間の日足チャートを参照して、その上昇傾向を解析・探索しています。 上昇傾向の有無は、lm関数の線形回帰に基づいて決定しています。

このプログラムは、CoinPick_v01関数として実装しています。 詳しくは、補足のCoinPick_v01のRコードにまとめています。

#作成した関数のロード from Gist
source("https://gist.githubusercontent.com/kumeS/1df358e5301847b0a8197f903f8c8b40/raw/c0a87a540e906051d36c3745acd6359f348d499d/CoinPick_v01.R")

仮想通貨・ビットコイン・アルトコインについて(1)

まずは、始めの50種類の仮想通貨を対象に、CoinPick_v01関数を実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_1.png"
Symbols <- BCOINS[1:50]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=5)

下記が出力結果です。

 

仮想通貨・アルトコインについて(2)

次の50種類の仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_2.png"
Symbols <- BCOINS[51:100]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=4.05)

下記が出力結果です。

 

仮想通貨・アルトコインについて(3)

次の50種類の仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_3.png"
Symbols <- BCOINS[101:150]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=4.7)

下記が出力結果です。

 

仮想通貨・アルトコインについて(4)

次の50種類の仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_4.png"
Symbols <- BCOINS[151:200]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=5.5)

下記が出力結果です。

 

仮想通貨・アルトコインについて(5)

次の50種類の仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_5.png"
Symbols <- BCOINS[201:250]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=5.7)

下記が出力結果です。

 

仮想通貨・アルトコインについて(6)

次の50種類の仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_6.png"
Symbols <- BCOINS[251:300]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=7.4)

下記が出力結果です。

 

仮想通貨・アルトコインについて(7)

最後に、残りの仮想通貨を対象に実行します。

#ファイル名の定義 & USDTペアシンボルの選択
Filename <- "CoinPlot_7.png"
Symbols <- BCOINS[300:length(BCOINS)]

#実行
CoinPick_v01(Filename=Filename, Symbols=Symbols, Hjust=2.2)

下記が出力結果です。

 

まとめ

いい感じに、バイナンスに上場する、仮想通貨全体を俯瞰できそうです。

改めて、全体を見ると新たな発見もありそうです。

補足

ツイッターにプロット結果を投稿する

実施例として、テキストを付けて、CoinPlot_1.pngの画像をTwitterに投稿します。

#諸設定
Filename <- "CoinPlot_1.png"
txt <- "バイナンス仮想通貨の上昇傾向銘柄をつぶやく。"
Alt <- "#仮想通貨"

#投稿
rtweet::post_tweet(status = txt,
                   media_alt_text = Alt,
                   media = Filename)

実際、この事例は単発投稿ですが、 forループとか、実行タイミングを設定すれば、 Bot化することができます。 具体的には、次回の更新の時に、、

CoinPick_v01のRコード

以下が関数のコードです。使用する際には、関連パッケージのロードをお忘れなく。

CoinPick_v01 <- function(Filename, Symbols, Hjust=5, Term=60){
#パラメータ設定
Dat <-  c()
slopeVal <- 0.001
slope <-  c()
slopeCol <-  c()

#実行
for(N in 1:length(Symbols)){
#価格取得
Dat0 <- binance_klines(Symbols[N], interval = '1d', 
                       start_time = lubridate::today()-lubridate::ddays(Term), 
                       end_time = lubridate::today())

#価格補正
Data <- Dat0[,c("close_time", "close", "symbol")]
Data$close <- Data$close/mean(Data$close)
Dat <- rbind(Dat, Data)

#傾きの計算
slopeCol[N] <- ifelse(coef(with(Data, lm(close ~ c(1:length(close)))))[2] < slopeVal, "#c8c8cb25", sample(colorspace::rainbow_hcl(200), 1))
names(slopeCol)[N] <- Symbols[N]
slope[N] <- round(coef(with(Data, lm(close ~ c(1:length(close)))))[2], 5)
names(slope)[N] <- Symbols[N]
}

#列名の修正
colnames(Dat) <- c("Time", "Relative_price", "Coin_symbol")

#可視化

p <- ggplot2::ggplot(Dat, aes(x = Time, y = Relative_price, color = Coin_symbol)) + 
  geom_line() + 
  scale_color_manual(values = slopeCol) + 
  labs(caption="© 2022 京橋のバイオインフォマティシャンの日常 by skume") +
  theme(plot.caption= element_text(family= "HiraKakuPro-W3", hjust=Hjust, vjust=5, size=10, color="black"))
ggsave(Filename, device = "png", width = 9, height = 5)
return(p)
}

参考文献

skume.net

colorspace.r-forge.r-project.org

heavywatal.github.io

qiita.com

cmdlinetips.com