なぜTweetを活用した売買が面白いか
「だれも気づいていない価格に対する変数の発見」は、トレーディングするにあたってのロマン。
そして、インデックスに勝つ方法のひとつです。
そのなか、ソーシャルセンサーともよばれるSNSの情報を変数として活用するのはメジャーな方法で、 トランプ氏のツイートで株自動取引、米企業がAIプログラム開発なんてニュースもありました。
特に暗号通貨界隈では、SNS情報を変数として活用しているbotが少ないようにみえるので、Tweet情報を活用した売買にはカネの臭いを感じています。
今回のスコープ
本来は、仮説を持って変数の収集・時系列分析した上で、モデルを作りバック/フォワードテストをすべきです。
とはいえ、今回はまず参考まで**「Tweet検索の結果に応じて暗号通貨を取引」**するところまで実装してみます。
Python3系で、取引所はオルトコインが豊富なPoloniexを用います。
取引するのは、Rippleという暗号通貨です。投資は自己責任で。
いくで。やるで。リップル買い増しや。
①とりあえずPythonからRippleを買ってみる
しぬほどかんたん。
最初、poloniex-0.0.8だとうまく動かなくて苦戦したけど、普通に最新のライブラリをpipしてればOK
from poloniex import Poloniex
def buy():
# poloniex APIの準備
API_KEY = 'hoge'
SECRET_KEY = 'piyo'
polo = Poloniex(API_KEY, SECRET_KEY)
# マーケット, レート(BTC/XRP)、総量
# とりあえず成り行きで変えるようにレートは高めに設定。総量は最低購入量を超えるくらいに設定
order = polo.buy('BTC_XRP', 0.001, 10)
return order
if __name__ == "__main__":
result = buy()
print(result)
②Tweet検索モジュールをつくる
A.30秒毎に「いくで。やるで。リップル買い増しや」が入ったツイートを直近20件取得する
B. 前回取得分との差分件数分、buy_xrp.pyする
AとBを繰り返す感じにしたい。
とりあえず、Aをするモジュールを作る。
ちなみに、「いくで。〜」は、暗号通貨界隈のネットミームで、100億円PLAYER《絆》(@100OKUENPLAYER)のネタ
import tweepy
import time
import numpy as np
# APIインスタンスを返す
def get_api_instance():
consumer_key = "aaa" #引用符の中にconsumer_keyの情報を記述する
consumer_secret = "bbb" #引用符の中にconsumer_secretの情報を記述する
access_token = "ccc" #引用符の中にaccess_tokenの情報を記述する
access_token_secret = "ddd" #引用符の中にaccess_token_secretの情報を記述する
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
#利用制限にひっかかった時に必要時間待機する
api = tweepy.API(auth, wait_on_rate_limit = True)
return api
# APIインスタンス作って検索する
def get_recent_tweets():
api = get_api_instance()
rate = api.rate_limit_status()
tm = time.localtime(rate['resources']['search']['/search/tweets']['reset'])
# 最大直近100Tweetを取得
keyword = 'いくで。やるで。リップル買い増しや'
result = api.search(q=keyword, lang='ja', count=20)
return result
# search_resultからTweetIDだけを引っ張ってnumpyでリスト化しとく
def make_id_list(search_result):
id_list = []
for f in search_result:
id_list.append(f.id)
return np.array(id_list)
# 前回検索から新たに増えているツイートないかしらべる
# このとき、idは増加しつづけることを利用する
def count_new_tweets(last_ids, this_ids):
last_max_id = np.max(last_ids)
new_ids = np.where(this_ids > last_max_id)
result = new_ids[0].size
return result
# デバッグ用:search_resultのprint
def print_tweets(search_result):
for f in search_result:
print(str(f.id) + " " + f.user.name + " " + f.text)
# print(f)
if __name__ == "__main__":
search_result = get_recent_tweets()
# print_tweets(search_result)
last_ids = make_id_list(search_result)
while True:
search_result = get_recent_tweets()
this_ids = make_id_list(search_result)
n_of_new_tweets = count_new_tweets(last_ids, this_ids)
print(n_of_new_tweets)
time.sleep(30) #30秒毎にAPI叩きすぎると制限かかっちゃうから
③がっちゃんこして完成
A.30秒毎にfind_tweet.pyして
B.その戻り値に基づいた回数buy_xrp.py
を繰り返す実行ファイルをつくる
import time
import find_tweet
import buy_xrp
if __name__ == "__main__":
search_result = find_tweet.get_recent_tweets()
# print_tweets(search_result)
last_ids = find_tweet.make_id_list(search_result)
while True:
search_result = find_tweet.get_recent_tweets()
this_ids = find_tweet.make_id_list(search_result)
n_of_new_tweets = find_tweet.count_new_tweets(last_ids, this_ids)
print(n_of_new_tweets)
for i in range(n_of_new_tweets):
order = buy_xrp.buy()
print(order)
time.sleep(30) #30秒毎にAPI叩きすぎると制限かかっちゃうから
last_ids = this_ids
今後のアイディア
当然これはジョークbotだが、Tweet情報を用いての売買は実現できた。
今後は、Tweet量やそのポジネガを変数として売買判断に用いることで、まだ誰も気づいていない高収益な売買モデルが作れるかもしれない。
いくで。やるで。リップル買い増しや。