はじめに
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) }