noteのタイトル画像

[Puppeteer] 5秒ローソク足対応 ! python製仮想通貨自動取引bot開発フレームワーク

今回はPuppeteerのwebsocket実装記念(?)として「5秒ローソク足」を実装しましたのでご報告です。

5秒ローソク足

以前、JavaScript+Vue.jsで「”HTMLファイル一つだけシリーズ” bitflyerFX 5秒ローソク足を作成・描画してみる」で5秒間隔のローソク足を作ったので、その応用です。(実装方法は全然違いますが)

websocketによってbitmex取引所から逐次約定履歴が取得できるので、その約定履歴を5秒毎に集計してOHLCVデータとして整形します。

実行結果

---------------------------------
                       open    high     low   close  volume    buy    sell
timestamp                                                                 
2019-05-04 03:27:35  5753.0  5753.0  5752.5  5752.5    2259    759    1500
2019-05-04 03:27:40  5752.5  5753.0  5752.5  5753.0    2285   2285       0
2019-05-04 03:27:45  5753.0  5753.0  5752.5  5752.5   93834  40000   53834
2019-05-04 03:27:50  5752.5  5753.0  5752.5  5753.0   26100    900   25200
2019-05-04 03:27:55  5753.0  5753.0  5751.5  5751.5  240427    100  240327
2019-05-04 03:28:00  5751.5  5752.0  5751.5  5751.5   13545  10115    3430
2019-05-04 03:28:05  5751.5  5751.0  5751.0  5751.0   60600      0   60600
2019-05-04 03:28:10  5751.0  5751.0  5750.5  5750.5   56270      0   56270
2019-05-04 03:28:15  5750.5  5750.5  5750.5  5750.5  300090      0  300090
2019-05-04 03:28:20  5750.5  5750.5  5750.0  5750.0  158000      0  158000
2019-05-04 03:28:25  5750.0  5750.0  5749.0  5749.0   59265   2615   56650
2019-05-04 03:28:30  5749.0  5749.0  5749.0  5749.0  150100      0  150100
2019-05-04 03:28:35  5749.0  5749.0  5749.0  5749.0    1200      0    1200
2019-05-04 03:28:40  5749.0  5749.0  5747.5  5747.5   31442      0   31442
2019-05-04 03:28:45  5747.5  5747.5  5746.0  5746.0   56347    500   55847
2019-05-04 03:28:50  5746.0  5746.0  5743.0  5743.0  596368   3000  593368
2019-05-04 03:28:55  5743.0  5743.5  5741.5  5742.0  455875    145  455730
2019-05-04 03:29:00  5742.0  5742.0  5740.0  5740.0  218030      0  218030
2019-05-04 03:29:05  5740.0  5740.0  5732.0  5732.5   77125   1400   75725
2019-05-04 03:29:10  5732.5  5735.0  5732.5  5734.0  228221      0  228221
2019-05-04 03:29:15  5734.0  5734.5  5734.0  5734.0  373075  25911  347164
---------------------------------
                       open    high     low   close  volume     buy    sell
timestamp                                                                  
2019-05-04 03:27:35  5753.0  5753.0  5752.5  5752.5    2259     759    1500
2019-05-04 03:27:40  5752.5  5753.0  5752.5  5753.0    2285    2285       0
2019-05-04 03:27:45  5753.0  5753.0  5752.5  5752.5   93834   40000   53834
2019-05-04 03:27:50  5752.5  5753.0  5752.5  5753.0   26100     900   25200
2019-05-04 03:27:55  5753.0  5753.0  5751.5  5751.5  240427     100  240327
2019-05-04 03:28:00  5751.5  5752.0  5751.5  5751.5   13545   10115    3430
2019-05-04 03:28:05  5751.5  5751.0  5751.0  5751.0   60600       0   60600
2019-05-04 03:28:10  5751.0  5751.0  5750.5  5750.5   56270       0   56270
2019-05-04 03:28:15  5750.5  5750.5  5750.5  5750.5  300090       0  300090
2019-05-04 03:28:20  5750.5  5750.5  5750.0  5750.0  158000       0  158000
2019-05-04 03:28:25  5750.0  5750.0  5749.0  5749.0   59265    2615   56650
2019-05-04 03:28:30  5749.0  5749.0  5749.0  5749.0  150100       0  150100
2019-05-04 03:28:35  5749.0  5749.0  5749.0  5749.0    1200       0    1200
2019-05-04 03:28:40  5749.0  5749.0  5747.5  5747.5   31442       0   31442
2019-05-04 03:28:45  5747.5  5747.5  5746.0  5746.0   56347     500   55847
2019-05-04 03:28:50  5746.0  5746.0  5743.0  5743.0  596368    3000  593368
2019-05-04 03:28:55  5743.0  5743.5  5741.5  5742.0  455875     145  455730
2019-05-04 03:29:00  5742.0  5742.0  5740.0  5740.0  218030       0  218030
2019-05-04 03:29:05  5740.0  5740.0  5732.0  5732.5   77125    1400   75725
2019-05-04 03:29:10  5732.5  5735.0  5732.5  5734.0  228221       0  228221
2019-05-04 03:29:15  5734.0  5734.5  5734.0  5734.0  373075   25911  347164
2019-05-04 03:29:20  5734.0  5736.5  5734.0  5736.0  224021  213387   10634

こんな感じに5秒ローソク足を作成します。
時間はUTCタイムで出しています。

特徴

普通のOHLCVとは違って、買いボリュームと売りボリュームもプラスして出力するようにしてみました。(上記のbuy列、sell列がそれぞれのvolumeです)
買い圧力が高いのか、売り圧力が高いのかを判断する材料に使えると思います。

Puppeteerが持っている板情報取得機能を使って、板の厚みもプラスして評価することが可能になるでしょう。

板情報は

orderbook = self._ws.orderbook()
bid = orderbook['bids'][0]['price']
ask = orderbook['asks'][0]['price']

で取得できます。

サンプルプログラム

sample1.py

# -*- coding: utf-8 -*-
# ==========================================
# サンプル Puppet (websocket)
# ==========================================
import datetime

import pandas as pd

from puppeteer import Puppeteer

# ==========================================
# Puppet(傀儡) クラス
#   param:
#       puppeteer: Puppeteerオブジェクト
# ==========================================
class Puppet(Puppeteer):

    # ==========================================================
    # 初期化
    #   param:
    #       puppeteer: Puppeteerオブジェクト
    # ==========================================================
    def __init__(self, Puppeteer):
        self._exchange = Puppeteer._exchange    # 取引所オブジェクト(ccxt.bitmex)
        self._logger = Puppeteer._logger        # logger
        self._config = Puppeteer._config        # 定義ファイル
        self._ws = Puppeteer._ws                # websocket
        self._bitmex = Puppeteer._bitmex        # ccxt.bimexラッパーオブジェクト
        
    # ==========================================================
    # 売買実行
    #   param:
    #       ticker: Tick情報
    #       orderbook: 板情報
    #       position: ポジション情報
    #       balance: 資産情報
    #       candle: ローソク足
    # ==========================================================
    def run(self, ticker, orderbook, position, balance, candle):
        # データ数が少ない時は統計量を出すと処理が異常になるので、一定の量がたまるまで処理を延期
        if len(self._ws.candle()) < int(30/self._ws.CANDLE_RANGE):
            return None 
        df = pd.DataFrame(self._ws.candle()[-self._ws.MAX_CANDLE_LEN:],
                  columns=['timestamp', 'open', 'high', 'low', 'close', 'volume', 'buy', 'sell'])
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
        df = df.set_index('timestamp')
        df.index = df.index.tz_localize(None)
        print('---------------------------------')
        print(df)

sample1.json

{
    "//" : "===============================================",
    "//" : " システムで利用",
    "//" : "===============================================",
    "//" : "取引所のapiKey, secretを設定します",
    "APIKEY" : "",
    "SECRET" : "",

    "//" : "bitmex取引所で対応する通貨ペア等を記述",
    "SYMBOL" : "BTC/USD",
    "INFO_SYMBOL" : "XBTUSD",
    "COIN_BASE" : "BTC",
    "COIN_QUOTE" : "USD",
    "//" : "bitmex取引所の価格の最小幅(0.5ドル)",
    "PRICE_UNIT" : 0.5,

    "//" : "TestNetを使うか?(使う: true, 使わない: false)",
    "USE_TESTNET" : false,

    "//" : "ticker, orderbook, position, balance, candle のどれを利用するかを指定する。Falseを指定した場合はそのデータは取得しない",
    "USE" : {
        "TICKER" : false,
        "ORDERBOOK" : false,
        "POSITION" : false,
        "BALANCE" : false,
        "CANDLE" : false
    },

    "//" : "ローソク足の収集定義。",
    "CANDLE" : {
        "//" : "ローソク足の足幅を設定する。設定値= 1m, 5m, 1h, 1d",
        "TIMEFRAME" : "1m",
        "//" : "データ取得開始時刻(UNIXTIME:1ミリ秒)、使用しない場合 もしくは自動の場合は null(None) を指定",
        "SINCE" : null,
        "//" : "取得件数(未指定:100、MAX:500)",
        "LIMIT" : null,
        "//" : "True(New->Old)、False(Old->New) 未指定時はFlase",
        "REVERSE" : false,
        "//" : "True(最新の未確定足を含む)、False(含まない) 未指定はTrue",
        "PARTIAL" : false
    },

    "//" : "板情報の収集定義。",
    "ORDERBOOK" : {
        "//" : "取得件数(未指定:25、MAX:取引所による?)",
        "LIMIT" : null
    },

    "//" : "websocketを使用するかどうかを指定",
    "USE_WEBSOCKET" : true,

    "//" : "ログレベルを指定。('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG')",
    "LOG_LEVEL" : "INFO",

    "//" : "インターバル(botの実行周期)を秒で設定",
    "INTERVAL" :5,

    "//" : "discord通知用URL",
    "DISCORD_WEBHOOK_URL" : "",

    "//" : "===============================================",
    "//" : " ユーザで自由に定義",
    "//" : "===============================================",
    "//" : "売買するサイズ",
    "LOT_SIZE" :50
}

実行方法はコンソールから

python3 puppeteer.py puppets/sample1/sample1.py puppets/sample1/sample1.json 

で実行します。

Puppeteer(傀儡師) bot開発フレームワーク

以下のgitlabより誰でも自由にダウンロードして使用できます。

楽しいbotライフを!

ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。