イーロン・マスクのTwitterアカウントを監視して仮想通貨を自動購入するbotの作り方

イーロンマスクのツイートでビットコインの価格が激変する光景はもはや見慣れたものとなりました。
イーロンマスクが何か言うたびに暗号資産価格が10%以上変動するのも珍しくありません。

かくいう僕もビットコインをショートしていた所に、イーロン・マスクがビットコインにポジティブなツイートをぶっ込んできて痛い思いをしたばかりです(怒)。
実際にイーロン・マスクやテスラも仮想通貨の売買をしていることを考慮すると、もはや相場操縦といっても良いかもしれません笑

この状況の中、僕は常々こう考えていました。
イーロン・マスク個人のツイートが相場を動かしているのであれば、それを逆手にとって稼ぐことは出来ないだろうか、と。

真っ先に考えられるのは、「イーロンマスクの Twitter アカウントに張り付いておいて、ツイートされた瞬間に仮想通貨の売買を行う」という方法ですね。
しかし人力でイーロンマスクのアカウントを監視するのはなかなか面倒です。
我々は暇ではありませんし、そもそもアメリカ人であるイーロン・マスクがツイートするのは日本の深夜以降が多いですからね。

そこでプログラムの出番です。
この記事では、イーロン・マスクのツイートをプログラムで監視して、ビットコインに対してポジティブな発言があれば即座に買い注文を入れるbotを作成してみたいと思います。

マスクのツイート内容を分析してBTC売買するbotを作ろう

まずは今回の目標であるbotプログラムの概要を説明します。
おおよそ以下のような動作を行います。
今回のbotの動き
・5秒ごとにイーロンマスクの最新ツイートを確認する

・最新ツイートの内容がビットコインに関するものであるか確認する

・ビットコインに関係するツイートであればその内容がポジティブかネガティブか判定する

・内容がポジティブであればビットコインの買い注文を入れる

以上です。
実装はPythonで行います。

bot作成に必要なもの

次にbot作成に必要なものを準備します。

Python

今回はPythonでの実装なのでPythonをインストールしておいてください(既に入っている人はスルーで)。
インストール方法はこちらを参照するとわかりやすいです。

Pythonのインストール方法

各種ライブラリ

次に必要なライブラリをインストールしておきましょう。
と言ってもインストールが難しいものはありません。
必要ライブラリ一覧
・twint …… Twitter からツイートを取得するのに必要

・nltk …… 取得したツイートのセンチメント分析を行うのに必要

・coincheck …… コインチェックで買い注文を出すのに必要

各ライブラリのインストール方法は下のコマンドで OK です。
まだ入っていないものがあれば、順次インストールしておいてください。
pip3 install twint
pip3 install nltk
pip3 install coincheck

コインチェック口座とAPIキー

最後の注文を出す部分で今回はコインチェック口座を使用します。
まだ持っていない人は下のリンクからメールアドレスとパスワードを設定して口座を開設しておくと良いでしょう。(既に持っている人はスルーでOKです)

>>無料でコインチェック口座を開設する

口座開設が済んだら、入金とAPIキー発行済ませます。
今回のコードでは、イーロン・マスクツイートがビットコインに関連していて、かつポジティブな内容だと判断される時に0.005BTCの買い注文を行います(値は変更可)。

当然、口座に該当量のビットコインを買えるだけの日本円が入金されていない場合はエラーになります。

※APIキーの発行方法は下の記事で紹介している手順と全く同じです。
画像付きで紹介しているので、参考にしてみてください。

【コピペOK】仮想通貨をPythonで自動売買する方法を初心者向けに解説

2020年12月7日

VPSサーバー(本格稼働時のみ)

また、このプログラムや類似プログラムを本格稼働させたいならVPSサーバーもあると便利です。
自宅のパソコンでずっとプログラムを起動しておくと、不意に電源が落ちてプログラムが停止したり、PCファンの音がうるさかったり、他の作業がやり辛くなったりします。

そういうデメリットを回避する簡単な方法は、VPSサーバーをレンタルすることです。
VPSサーバを使ってみたい人は、下記記事も参考になると思います。

【初心者向け】FX・仮想通貨の自動売買用のVPSサーバーのオススメはコレ!

2021年3月20日

実装手順

さてそれでは実装に入りましょう。
各ステップの概要を簡単に説明しながら進んでいきます。
(完成したコードは最後に掲載してあります)

イーロン・マスクのツイートを取得

まずはイーロン・マスクのツイートを取得する方法です。
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
このようなコードでマスクのツイートをpandasのデータフレームとして取得することができます。
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)
test_textは僕が適当に作りました。
この結果は以下のようなものです。
{‘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))
なお、今回掲載するコード例では API 関連の情報はコード内に直接書かずにinput関数でその都度入力する仕様にしてあります。
これはセキュリティ上その方が好ましいからです。

実際のコード例

以上ですべてのパーツが揃いましたね。
ということでここまでの内容を組み合わせて、ひとつのプログラムにまとめたのが以下です。
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)
今回のコードでは、都合上簡略化した部分が多くあります。

今後はビットコインにツイート内容が関係するかどうかを判定する部分やセンチメント分析の部分をディープラーニングなどのより高度な手法に置き換えてみたり、色々いじってみると良いでしょう。

【2時間で完成】為替(FX)を予想する深層学習AIをPythonで無料作成

2021年3月14日

【コピペOK】深層学習AIを使った仮想通貨の自動売買を初心者向けに解説

2021年2月21日
スポンサーリンク

SNSシェアお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA