忘れたくないあの時の日記。

日頃の開発で起きたことや大学の話、その他諸々津々浦々に。

これで君も億万長者になれる!?【仮想通貨取引シミュレーターを作ってみた】

この記事はOthloTech Advent Calendar 2017の12日目の記事です。

11日目の記事はito_ur_rightさんの非デザイナーのカラーコードきっちり配色法 でした!

仮想通貨のバブル到来??

ビットコイン、最近すごいですよね。急騰したのが数日前で、一気に120万円から一番高い時には228万円まで値上がりました。
ちなみに僕は5月から仮想通貨に手をつけてました。収益が大分長い間マイナスだったのですが、やっとこさ最近プラスになりました。うれしい!春から秋にかけてXナントカとかいう通貨で爆死したせいだよ

f:id:ni_san2000:20171212230637p:plain
ビットコインのチャート。1週間分

さて、話題の仮想通貨なので、買ってたりトレードしてたりする人も多いかもしれませんが、単刀直入に、儲かってますか?

今回は仮想通貨の値動きを目で追わなくても済むように、自動でデモ取引をするbotを作ってみました!

具体的に何を作るの?

1分間に1度仮想通貨の値動きを監視して、安くなったら購入、高くなって落ち着いたら売却。これだけです。

言語はPythonで、ちゃちゃっと作っちゃいましょう。

値動きの情報を取得しよう

データ元として、海外の仮想通貨の取引所として有名な「Poloniex」を使います。取引手数料が安くていいですね。僕はここで取引してます。

公式でAPIがあるのですが、データの取得ならラッパーがgithubにあるので有能。 github.com

pip install https://github.com/s4w3d0ff/python-poloniex/archive/v0.4.6.zipでいけちゃいます。

ここでは試しにドルでBTCを買うときの値動きを取得してみましょう。データの処理はpandasを使います。

import poloniex
import pandas as pd
import time

polo = poloniex.Poloniex()

chart = polo.returnChartData('USDT_BTC', period=300, start=time.time()-polo.DAY*0.005, end=time.time())
data = pd.DataFrame(chart)

print(data.close[0])

returnChartDataって関数は第1引数が通貨、第2引数が値動きの幅(今回は5分)で、第3第4引数が値動きを取得する期間の、始まりと終わりの時刻です。

これだけで、実行結果は16742.00000011のように実数値が取れます。1BTCが1万6千ドルもするんですね・・・改めて見ると恐ろしや。

シミュレーションをしてみよう

ここまでこればあとは自分の好きなようにコーディングできます。 僕はとりあえず適当ですが、次の条件で売買をするようにしました。

購入

①2連続で値下がりをした後に価格下落が止まった時。

売却

①2連続で値上がりをした後に価格上昇が止まった時。
②購入してから5分以内に2連続で値下がりをした時。

もっといい基準が絶対あるのでそこは試行錯誤。

利益

利益は【売却額】-【購入額】の差額にしました。手数料とかは今回考えてません。
<例> 15000ドルの時に購入して15500ドルの時に売却した
→ 500ドルの利益

まぁつまりは1BTCを買ったときのシミュレートってことですね。

botクラス

class Bot:
    status = 0
    hold = 0
    result = 0
    bought_length = 0

# 変数一覧-------------------------------
    # status = 現在の状況
        # 0 : 購入なし(購入可能)
        # 2 : 購入済み(売却可能)
        # 初期値は0からスタート

    # hold : 購入した値段
        # buy()を行う際に現在のレートが代入され、sell()を行う際に値が0になる
        # 初期値は0からスタート

    # result = 利益
        # 買値と売値の差が、売却のたびに更新される

    # bought_length = 購入してからの経過時間
        # 購入してからの経過時間をカウント
# -------------------------------------

購入・売却

bot = Bot()

def rate(now, prev):
    if now != 0 and prev != 0:
        return round(now/prev * 100 - 100, 4)
    else:
        return 'error (zero divide.)'

def buy(status, now):
    if status == 0:
        bot.hold = now
        bot.status = 2
        print('------------購入--------------')
        print('価格 : {0}'.format(now))
        print('-----------------------------')
    else:
        print('すでに購入済み')

def sell(status, now):
    if status == 2:
        bot.result += now - bot.hold
        print('result = {0}'.format(bot.result))

        bot.hold = 0
        bot.status = 0

        print('------------売却--------------')
        print('価格 : {0}'.format(now))
        print('-----------------------------')
    else:
        print('購入していない')

ソースコード全文githubに上げておきますので、拙いコードですが参考になれば幸いです。

動かしてみた!

さぁ、結果はいかに!かなりログが長いのでハイライトのところだけピックアップして載せておきます。

1回戦 (12/9/ 20:53 〜 12/10/ 10:52)

取引回数:21回 利益:-1175.4929445399976

f:id:ni_san2000:20171213010157p:plain
期間中のpoloniexの値動き。下がって上がって下がった

ありゃ〜めっちゃやられましたね・・・まぁ全体的に値動きが大きく上下してましたがいい感じに波に乗って欲しかったですね!

2回戦 (12/10/ 22:24 〜 12/12/ 23:24)

取引回数:73回 利益:1316.7837217100023

f:id:ni_san2000:20171213010151p:plain
期間中のpoloniexの値動き。グッと上がった後にヨコヨコ

よっしゃ、今度は勝てた!値動きが結構いい感じだったのも相まって、1回戦の負けを入れても総合的にプラスになりました〜これはうれしい。

1回戦、2回戦やって大きなトレンド(流れ)に結果が連動してる感じです。最初でこれはいい感じかもですが、もっと大域的に値動きを見られるように判定基準とかを調整していきたいですね!

まとめ

今回はシミュレーターでしたが、ちゃんと公式APIを使って実際にリアルマネーを突っ込んでやりたいですね!APIキーも発行されているので、そこまで難しくないと思います。

僕個人的には、機械学習でLSTMとか使って値動き予測してみようとか記事もたくさんありますが、結局ランダムウォークで上手くいかなかったりパッとしない。

一流トレーダーの売り買いのタイミングを勝敗のデータ含めて学習させた方が効率よく学習できるのかな?と思ったりします。
あとは強化学習とかもQ学習あたりは状況と判断と結果が分かりやすいのでとっつきやすいのかなーと思ったりもしました。

bot作りはめちゃくちゃ楽しいので、これからもパラメータいじったりして遊んで行こうかと思います!

それではまた次の記事で!