見出し画像

機械学習ビットコイン自動売買ボット - richmanbtcさんチュートリアル版

こんばんは。ビットコインはついに大気圏を飛び出してしまい億り人が大量発生してしまいました。アルトコインなどで儲かった人も多いのではないでしょうか。

この中、超強ボッターのrichmanbtcさんが公開している機械学習ボットのチュートリアルは機械学習ボットを実現するための救世主になりました。

ただ肝心の実運用するためのモデル読み込みとポジションの判定部分の処理と動かせるボットがありませんでした。

このnoteではモデル読み込みとポジションの判定部分の処理のJupyter Notebookのコード例を掲載します。
チュートリアルで作成した機械学習のモデルを利用した、直近の売買判定を確認することができます。具体的にはGMOコインが用意しているAPIからOHLCVを取得し、そこから機械学習(LightGBM)のモデルを利用して売買判定を出力します。

有料欄には上記のポジションの判定処理を利用した自動売買ボットの作成例GMOコイン用BitFlyer用、Byibt用の3つを掲載しています。
自動売買ボットの作成例では実際に取引所で機械学習をチュートリアルのモデル用いたビットコインの自動売買を行うことができます。Dockerを利用しているので比較的容易に動作確認ができると思います。
また本ボットを動かすためにはrichmanbtcさんのチュートリアルの環境構築と実行の確認を自力できることDocker,Linuxによる基本的な操作ができることが前提となっています。


またJupyter Notebookのコード例のprivate gistのURLについても以下3つについても掲載しています。
・mlbotの初心者向けチュートリアル (売買判定とOputunaによる最適化例)
・mlbotの初心者向けチュートリアルのBitFlyer版(2021/12/29追加)
・mlbotの初心者向けチュートリアルのBybit版(2024/3/22追加)

2022年1月時点ではこの自動売買ボットをベースとして作成したボットで運用し利益がでることを確認しています。



Jupyter Notebookのコード例

ここではrichmanbtcさんのチュートリアルの環境構築と実行の確認ができた後のコードを記載しています。このためdocker-composeやjupyter labによる環境構築をおこないチュートリアル実行確認ができていることが前提となります。

現在、ccxtのバージョンが古いという原因によりnotebookが動作しない場合がある現象を確認しています。以下に修正したものを配置しています。https://github.com/amdapsi/mlbot_tutorial

richmanbtcさんのチュートリアルでは買い予想の数値(y_pred_buy)が0以上であれば買い、売り予想の数値(y_pred_sell)が0以上であれば売りと判断しています。
このためポジションの出力では買い予想の数値(y_pred_buy)のみが0以上の時に買い、売り予想の数値(y_pred_sell)のみが0以上の時に売りと判断しています。

from datetime import datetime, timedelta
import requests

#日付からGMOのOHLCV情報を取得
def get_gmo_ohlcv(day):
   endPoint = 'https://api.coin.z.com/public'
   path     = '/v1/klines?symbol=BTC_JPY&interval=15min&date='+day
   response = requests.get(endPoint + path)
   df = pd.DataFrame(response.json()["data"])
   df.rename(columns={'openTime':'timestamp','open':'op','high':'hi','low':'lo','close':'cl'},inplace=True)
   df["op"]=df["op"].astype(float)
   df["hi"]=df["hi"].astype(float)
   df["lo"]=df["lo"].astype(float)
   df["cl"]=df["cl"].astype(float)
   df["volume"]=df["volume"].astype(float)
   df['timestamp'] = pd.to_datetime(df['timestamp'] , unit='ms')
   df.set_index("timestamp",inplace=True)
   return df

#買いポジションの判定
def calc_position_buy(x):
   buy = x["predict_y_buy"]
   if buy > 0:
       return "buy"
   else:
       return "none"
   
#売りポジションの判定
def calc_position_sell(x):
   buy = x["predict_y_sell"]
   if buy > 0:
       return "sell"
   else:
       return "none"

#メンテナンス時間外(15:00-16:00)の場合に動作
if datetime.now().hour != 6:

   #今日と昨日のklineを取得してマージ
   today = datetime.today()
   yesterday = today - timedelta(days=1)

   today = today.strftime('%Y%m%d')
   yesterday = yesterday.strftime('%Y%m%d')

   df_today = get_gmo_ohlcv(today)
   df_yesterday = get_gmo_ohlcv(yesterday)
   df = pd.concat([df_today, df_yesterday[~df_yesterday.index.isin(df_today.index)]]).sort_index()

   #特徴量の計算
   df_features = calc_features(df)

   #モデルの読み込み
   model_y_buy = joblib.load('./model_y_buy.xz')
   model_y_sell = joblib.load('./model_y_sell.xz')

   #推論
   df_features["predict_y_buy"] = model_y_buy.predict(df_features[features])
   df_features["predict_y_sell"] = model_y_sell.predict(df_features[features])
     
   #ポジションの判定
   df_features["position_buy"] = df_features.apply(calc_position_buy,axis=1)
   df_features["position_sell"] = df_features.apply(calc_position_sell,axis=1)

   display(df_features)
   
   #ポジション出力
   position_buy = df_features["position_buy"].iloc[-1]
   position_sell = df_features["position_sell"].iloc[-1]

   if position_buy == "buy" and position_sell == "none":
       print("Buy Bitcoin")
   if position_sell == "sell" and position_buy == "none":
       print("Sell Bitcoin")

有料部分には上記のプライベートgistのURL(Optunaによる最適化例も追記)自動売買ボットの作成例を配置しています。

有料部分に掲載する内容は将来の利益を保証するものではありません。ご自身の判断と責任の上で、本書ご購入および活用ください。また有料部分については他者との共有や転売、転載などは一切これを禁止します。

ここから先は

2,539字 / 3ファイル

¥ 5,081

この記事が気に入ったらチップで応援してみませんか?