かくいう僕もビットコインをショートしていた所に、イーロン・マスクがビットコインにポジティブなツイートをぶっ込んできて痛い思いをしたばかりです(怒)。
実際にイーロン・マスクやテスラも仮想通貨の売買をしていることを考慮すると、もはや相場操縦といっても良いかもしれません笑
この状況の中、僕は常々こう考えていました。
イーロン・マスク個人のツイートが相場を動かしているのであれば、それを逆手にとって稼ぐことは出来ないだろうか、と。
真っ先に考えられるのは、「イーロンマスクの Twitter アカウントに張り付いておいて、ツイートされた瞬間に仮想通貨の売買を行う」という方法ですね。
しかし人力でイーロンマスクのアカウントを監視するのはなかなか面倒です。
我々は暇ではありませんし、そもそもアメリカ人であるイーロン・マスクがツイートするのは日本の深夜以降が多いですからね。
そこでプログラムの出番です。
この記事では、イーロン・マスクのツイートをプログラムで監視して、ビットコインに対してポジティブな発言があれば即座に買い注文を入れるbotを作成してみたいと思います。
目次
マスクのツイート内容を分析してBTC売買するbotを作ろう
まずは今回の目標であるbotプログラムの概要を説明します。おおよそ以下のような動作を行います。
今回のbotの動き
・5秒ごとにイーロンマスクの最新ツイートを確認する・最新ツイートの内容がビットコインに関するものであるか確認する
・ビットコインに関係するツイートであればその内容がポジティブかネガティブか判定する
・内容がポジティブであればビットコインの買い注文を入れる
実装はPythonで行います。
bot作成に必要なもの
次にbot作成に必要なものを準備します。Python
今回はPythonでの実装なのでPythonをインストールしておいてください(既に入っている人はスルーで)。インストール方法はこちらを参照するとわかりやすいです。
Pythonのインストール方法
各種ライブラリ
次に必要なライブラリをインストールしておきましょう。と言ってもインストールが難しいものはありません。
必要ライブラリ一覧
・twint …… Twitter からツイートを取得するのに必要・nltk …… 取得したツイートのセンチメント分析を行うのに必要
・coincheck …… コインチェックで買い注文を出すのに必要
まだ入っていないものがあれば、順次インストールしておいてください。
pip3 install twint
pip3 install nltk
pip3 install coincheck
コインチェック口座とAPIキー
最後の注文を出す部分で今回はコインチェック口座を使用します。まだ持っていない人は下のリンクからメールアドレスとパスワードを設定して口座を開設しておくと良いでしょう。(既に持っている人はスルーでOKです)
>>無料でコインチェック口座を開設する
口座開設が済んだら、入金とAPIキー発行済ませます。
今回のコードでは、イーロン・マスクツイートがビットコインに関連していて、かつポジティブな内容だと判断される時に0.005BTCの買い注文を行います(値は変更可)。
※APIキーの発行方法は下の記事で紹介している手順と全く同じです。 当然、口座に該当量のビットコインを買えるだけの日本円が入金されていない場合はエラーになります。
画像付きで紹介しているので、参考にしてみてください。
VPSサーバー(本格稼働時のみ)
また、このプログラムや類似プログラムを本格稼働させたいならVPSサーバーもあると便利です。自宅のパソコンでずっとプログラムを起動しておくと、不意に電源が落ちてプログラムが停止したり、PCファンの音がうるさかったり、他の作業がやり辛くなったりします。
そういうデメリットを回避する簡単な方法は、VPSサーバーをレンタルすることです。
VPSサーバを使ってみたい人は、下記記事も参考になると思います。
実装手順
さてそれでは実装に入りましょう。各ステップの概要を簡単に説明しながら進んでいきます。
(完成したコードは最後に掲載してあります)
イーロン・マスクのツイートを取得
まずはイーロン・マスクのツイートを取得する方法です。import twint
#tweet取得の設定
c = twint.Config()
c.Username = "elonmusk"
#1にしても100件取得してしまう(最新1件だけ取得する方法は不明)
c.Limit = 1
c.Hide_output = True
c.Pandas = True
twint.run.Search(c)
Tweets_df = twint.storage.panda.Tweets_df
c.Username の部分を変更すると他のアカウントのツイートも取得可能です。
今回必要な情報である
・ツイート日時
・ツイート本文
が取得できるのはもちろんのこと、 ツイートに含まれる URL や画像リンクの情報なども取得することができます。・ツイート本文
なお今回はpandas データフレーム型として取得していますが、jsonなどの形式でもデータを取得可能です。
ツイート内容を分析
次にツイート内容の分析です。最新のツイートが取得できたら、次の2点を確認する必要がありますね。
・そもそも仮想通貨やビットコインに関連したツイートなのか
今回は単純に、ツイート本文にbtc,bitcoinなどのワードが含まれている場合のみ仮想通貨に関連したツイートだとみなします。・内容はポジティブかネガティブのどちらなのか
当然これらが含まれていなくても暗示的にビットコインのことが言及されている可能性はありますが、その場合は見送りましょう。
ツイートの内容がビットコインに関連するものだと判断できたら、次はその内容がポジティブなのかネガティブなのかを判定します。
いわゆるセンチメント分析というやつです。
ここで最初にインストールしておいたnltkというライブラリが役に立ちます。
nltkでは指定した文章にどれくらいネガティブな単語とポジティブの単語が含まれているのかを分析できます。
nltkを使って以下のようなコードでその文章がポジティブな内容なのかネガティブな内容なのか判定できます。
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
test_text ="Bitcoin is very useful and I would buy more. Those who follow me will be happy!"
sentiment_analyzer = SentimentIntensityAnalyzer()
sentiment_dict = sentiment_analyzer.polarity_scores(test_textq)
print(sentiment_dict)
この結果は以下のようなものです。
{‘neg’: 0.0, ‘neu’: 0.644, ‘pos’: 0.356, ‘compound’: 0.8012}
中立的かもしくはポジティブな内容であるという判断になっています。どちらかと言うとポジティブな内容を意識して書いたのでこの結果はまずまずでしょう。
なお、compoundというのは文章中の複合語に関する指標だと理解しています(間違ってたらすみません)。
ちなみにtest_textを
All cryptoes including bitcoin are fraud. No one should have them anymore.
{‘neg’: 0.375, ‘neu’: 0.625, ‘pos’: 0.0, ‘compound’: -0.7184}
に変わりました。 ちゃんと内容がネガティブに寄ったことが反映されていますね。
ツイートがポジティブなら買い注文を出す
さてあとは、ツイート内容がポジティブだと判断できた時にコインチェックで買い注文を出すだけです。マーケットの価格の取得や買い注文の送信は以下のように実行可能です。
from coincheck import market,order,account
access_key="APIのアクセスキー"
secret_key="APIのシークレットキー"
m1=market.Market()
o1 = order.Order(secret_key=secret_key,access_key=access_key)
#市場価格を取得
last_btc_price = m1.ticker()["last"]
#買い注文を出す
print(o1.buy_btc_jpy(rate=str(4444455),amount=0.005))
これはセキュリティ上その方が好ましいからです。
実際のコード例
以上ですべてのパーツが揃いましたね。ということでここまでの内容を組み合わせて、ひとつのプログラムにまとめたのが以下です。
import twint
import time
from datetime import datetime, timedelta, timezone
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import sys
from coincheck import market,order,account
#ツイートの結果次第では、0.005BTCの買い注文を入れるとする
amount = 0.005
#最後の買い注文に必要
access_key=input("APIのアクセスキーを入力してください")
secret_key=input("APIのシークレットキーを入力してください")
#極性判定のため、初回のみダウンロードが必要
nltk.download('vader_lexicon')
sentiment_analyzer = SentimentIntensityAnalyzer()
#tweet取得の設定
c = twint.Config()
c.Username = "elonmusk"
#1にしても100件取得してしまう(最新1件だけ取得する方法は不明)
c.Limit = 1
c.Hide_output = True
c.Pandas = True
#取得したツイートがビットコインと関連するかを判定
#単純にビットコイン関連のワードが含まれているかだけ見る
def does_contain_btc(tweet):
btc_related_words = ["btc",
"BTC",
"bitcoin",
"BITCOIN",
"crypto",
"crypto currency",
"Bitcoin",
"bitCoin",
"Bit coin",
"bit coin"]
for i in btc_related_words:
if i in tweet:
#BTC関連のツイートだと判定
return True
# BTC関連のツイートだと判定されない
return False
while True:
# ツイート取得を実行
twint.run.Search(c)
Tweets_df = twint.storage.panda.Tweets_df
print("5秒ごとにイーロン・マスクのツイートを取得しています。")
# tweeted_at = datetime.strptime(Tweets_df["created_at"].iloc[0], '%Y-%m-%d %H:%M:%S')
tweeted_at = datetime.strptime(Tweets_df["date"].iloc[0]+'+0900', '%Y-%m-%d %H:%M:%S%z')
# タイムゾーンの生成
JST = timezone(timedelta(hours=+9), 'JST')
# 現在時刻(日本時間)
now = datetime.now(JST)
if ((tweeted_at + timedelta(minutes=1))>=now) and does_contain_btc(Tweets_df["tweet"].iloc[0]):
print("最新のBTC関連のツイートがありました。ツイート内容を分析します。")
sentiment_dict = sentiment_analyzer.polarity_scores(Tweets_df["tweet"].iloc[0])
pos = sentiment_dict["pos"]
neg = sentiment_dict["neg"]
neu = sentiment_dict["neu"]
compound = sentiment_dict["compound"]
#posスコアが最大でcompoundスコアが0.2以上なら買い
if (pos > max((neg,neu)))and compound > 0.2:
print("ツイートがポジティブなものだと判定しました。")
print("コインチェックでビットコインの買い注文を行います。")
m1=market.Market()
o1 = order.Order(secret_key=secret_key,access_key=access_key)
last_btc_price = m1.ticker()["last"]
#買い注文を出す
#最新終値の1.1倍で指値注文を出して、成行きの代わりとする(即座の約定を狙う)
print(o1.buy_btc_jpy(rate=str(last_btc_price*1.1),amount=amount))
print("プログラムを終了します。")
sys.exit()
time.sleep(5)
今後はビットコインにツイート内容が関係するかどうかを判定する部分やセンチメント分析の部分をディープラーニングなどのより高度な手法に置き換えてみたり、色々いじってみると良いでしょう。
コメントを残す