見出し画像

機械学習を使って価格予測をしてBitMEX自動売買を行うサンプルプログラム

今回ローソク足(ohlc)のデータと機械学習(ディープラーニング)を利用して価格予測をするプログラムについて書きます。

ちょっと難しそうですが、今回もコードを短く200行ちょっとで作れるように工夫してみました。

4/23 いただいたコメントを元にプログラム全文に記載のソースコードを修正しました。

まず、KerasはPythonで使えるオープンソースのニューラルネットワークライブラリとなります。

公式サイトが日本語で解説があり、何より他の同関連ライブラリも理解しやすいです。

利用も簡単で

pip install Keras

でインストールは完了します。

今回はKeras以外にもKerasのインタフェースで利用するためのpandasやnumpy、sklearnと実際に動作させるために

をtensorflowインストールします。

pip install pandas
pip install numpy
pip install sklearn
pip install tensorflow

あとBitMEXのAPIを利用するにあたってccxtも入れておきましょう

pip install ccxt

今まで機械学習について興味はあってもなかなか難しそうで、自動売買でどう扱ったら良いかわからない方も多いと思います。

今回は価格の予測から実際に売買を行うところまでを参考プログラムとして記載したいと思います。

実際に動かすと以下のような画面になり、機械学習が始まります。

完了すると学習した結果を元に予測値価格が表示されます。

機械学習はサンプルとなるデータと、学習する回数を設定して実行しますが、

このサンプルデータと学習回数が多いほど予測の誤差が少なくなります。

今回のプログラムでは過去2000本(近く)分のロウソクとデフォルトの学習回数を50と設定しています。

どちらもさらに増やすことができますが、学習回数においては1回の計算で5秒近くかかり、

ロウソク足の取得はAPIの実行回数制限により弾かれてしまう可能性があるのでそこを加味して設定すると良いです。

また、計算に時間がかかるため、短い期間での分析もあまり向いていません。

※:本稿は利益・損失を保証、確定するものではありません。
 当該提供情報にていかなる損害を被ったとしても著者は一切の責任を負いませんので了承ください。

ではまず導入部となる処理について記載します。

import datetime
import time
import ccxt
import sys
import requests
import pandas as pd
import numpy as np 
import math
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
CCXT    = None
SYMBOL = 'BTC/USD'
API_KEY = "API KEY"
API_SEC = "API SECRET"
# 設定値
CANDLE_TERM    = "1h" # 分析に使用するローソク足の期間1m, 5m, 1h, 1d
ORDER_BORDER   = 50   # 注文を入れる閾値(デフォルト:$50)※予測結果と現在価格の差がこれ以上ある場合に注文を実行
LIMIT_LOSS     = 150  # 損切り値(足の期間が短い場合は少なくする)
ORDER_SIZE     = 100  # 注文サイズ
SLEEP_TIME     = 60   # ループ待機時間
ERR_SLEEP_TIME = 60   # エラー時ループ待機時間
TRAINING_TIME  = 50   # 機械学習トレーニング回数 ※この回数を増やすほど予測値の精度が上がる
def run():
    global CCXT
    CCXT = ccxt.bitmex({'apiKey': API_KEY,'secret': API_SEC,})
    position_close_price = 0
    position_loss_price = 0
    position_amo = 0
    while True:
        try:
            # ORDER取得及びオーダーキャンセル
            orders = CCXT.fetch_open_orders()
            if orders is not None:
                # for order in orders: CCXT.cancel_order(order['id'])
                pass
            # POSITION取得及び決済注文
            position = CCXT.private_get_position()
            if position is not None:
                if len(position) > 0:
                   position_amo = position[0]['currentQty']
                   close_side   = "sell" if position[0]['currentQty'] > 0 else "buy"
                   close_amo    = (position_amo * -1)
               else:
                   position_amo = 0

               if position_amo != 0:
                   # 決済注文(毎回予測価格になるまで毎回のループでキャンセルされる)
                   # order = CCXT.create_order(SYMBOL, type='Limit', side=close_side, amount=close_amo, price=position_close_price)
                   # order = CCXT.create_order(SYMBOL, type='Limit', side=close_side, amount=close_amo, price=position_loss_price)
            else:
                position_amo = 0
            # ポジションがある場合は注文を行わないため、スリープしてループを最初から再開
            if position_amo != 0: 
                time.sleep(SLEEP_TIME)
                continue
            # チャート取得
            chart    = getOhlcvLong(CANDLE_TERM)
            # チャートから機械学習を行い、次の予想価格を取得
            learning = getlearningData(chart)
            # 最終価格を取得
            tick     = getTicker()
            # 現在の最終価格取得
            last_price    = tick["last"]
            # 次の予想価格
            predict_price = learning["last"]
            print("last price: {0}, predict price: {1}".format(last_price, predict_price) )
            # 注文判定
            if abs(last_price - predict_price) > ORDER_BORDER:
                # 売買方向を決定する
                side = "buy" if last_price < predict_price else "sell"
                # ストップリミットはORDER_BORDERの額
                stop = last_price - LIMIT_LOSS if side == "buy" else last_price + LIMIT_LOSS
                # クローズ価格を設定
                position_close_price = predict_price
                position_loss_price  = stop
                # order = CCXT.create_order(SYMBOL, type='Limit', side=side, amount=ORDER_SIZE, price=last_price)
        except Exception as e:
            print(e)
            time.sleep(ERR_SLEEP_TIME)
        else:
            pass
    time.sleep(SLEEP_TIME)

流れとしては

・必要なライブラリのimport

・CCXT/BitMEXの設定

・プログラム全体の設定

・メイン処理

となっています。

各プログラムの設定にコメントを入れていますが、

TRAINING_TIMEが機械学習の回数を設定する変数となります、

メイン処理のループでやっている内容は基本的な自動売買botと同じです。

機械学習のサンプルデータとなるohlcのデータは通常ccxtでは一回の呼び出しでmax500本分の情報しか取れないので

独自関数(getOhlcvLong)を作成し、多く取れるようにしています。

機械学習の処理はgetlearningDataと言う関数で関数化し、

戻り値はlearning["last"]で現在のロウソク足の最終価格予測、

learning["next"]で一つ先のロウソク足の予測を取得するようにしています。

残りの処理は以下のとおりとなります。

ここから先は

11,322字

¥ 2,500

プログラムのことに関しては言語問わず対応できます。主にこれからプログラムを覚えていきたい+仮想通貨で自動売買をしたい人向けに記事を書いていきます。