エンジニアの頭の中

トレードbotエンジニアが書く技術と投資のブログ

PythonとCCXTを使用してbitFlyer Lightningの資産残高を取得する

f:id:mitsu3204:20180815152222j:plain

はじめに

bitFlyer Lightningのみでトレードしているうちは、bitFlyer LightningのWEBシステムにログインすれば、現在の資産残高や損益の推移は見ることができるため、今まではそこの情報の取得について、特に自動化は行っていなかったのですが、最近は複数の取引所を利用するようになってきたこともあり、資産残高を自動で取得して、自前のDBに保管するというニーズが出てきました。

そこで、PythonとCCXTを使って、bitFlyer Lightningの現在の資産残高を取得するプログラムを書いてみます。

APIを実行して証拠金の状態を取得してみる

bitFlyerAPIには、getbalanceというものがあり、ドキュメントに「資産残高を取得」を説明がありますが、これは現物口座の情報のみを取得するAPIのようで、bitFlyer Lightning FXの証拠金の情報は取得できません。

bitFlyer Lightning FXの証拠金の情報は、getcollateralというAPIを使って取得します。

このbitFlyergetcollateralAPIを、ccxtを介して実行して、受け取ったレスポンスを出力してみます。

ccxtというのは、仮想通貨の自動売買用ライブラリです。

ccxtの使い方を詳しく知りたいかたは、こちらの記事をご覧ください。 www.hacky.xyz

ソースコード

import ccxt

# ccxtを初期化
bf = ccxt.bitflyer({
    'apiKey': 'APIキー',
    'secret': 'APIシークレット'
})

# bitflyerのAPIを実行
result = bf.fetch2(path='getcollateral', api='private', method='GET')

# APIの実行結果を標準出力へ出力
print(result)

実行結果

APIの実行結果であるresultは以下のようなJSON形式の文字列となっています。(見やすさのために改行とインデントを付けています)

{
    'collateral': 810514.0,
    'open_position_pnl': -3200.0,
    'require_collateral': 55266.666666666664,
    'keep_rate': 14.60761158021713
}

内訳は以下の通りです。

  • collateral: 証拠金の金額(81万514円)
  • open_position_pnl: 現在のポジションの損益(マイナス3200円)
  • require_collateral: 現在のポジションに必要な証拠金の額(5万5266円)
  • keep_rate: 現在のポジションに必要な証拠金に対する証拠金の(14倍)

ポジションの含み損益を反映した資産残高を計算する

ポジションの含み損、含み益を考慮した現在の資産残高(時価)を知るには、上記のAPIの実行結果のうち、証拠金の金額であるcollateralopen_position_pnlを足せば、数値を得ることができます。

balance = int(result['collateral']) + int(result['open_position_pnl'])

実運用ではどのように実行しているのか?

これから似たようなことをやる人にとって、参考になるかもしれないので、実際にどのような方法で上記のAPIを実行しているかについて、述べておきます。

私の場合、Jenkinsを使用して、上記のAPIを1日1回の頻度で実行しています。取得した資産残高は、MySQL(DB)に記録しています。

取引所ごとに、Pythonを一回起動するようにしていて、Python実行時のオプションで、$ <スクリプト名> -e bitflyer$ <スクリプト名> -e bitmexのように、資産残高取得対象の取引所名を指定していて、スクリプト内ではオプションで指定されたargs.exchangeの内容に応じて、取引所ごとの資産残高取得を行っています。

つまり、資産残高取得対象の取引所の数の分、Jenkinsのジョブを仕掛けています。

私が使っているソースコードを一部載せておきます。DBの登録処理やbitFlyer以外のところは、本記事の本質とは異なるため、省略しています。

#! /usr/bin/env python
# encoding: utf-8

import configparser
from argparse import ArgumentParser
import ccxt


if __name__ == ‘__main__’:

    # オプションを解析
    parser = ArgumentParser()
    parser.add_argument(‘-e’, ‘—exchange’,
                        required=True,
                        action=‘store’,
                        dest=‘exchange’,
                        help=‘Exchange name.’)
    args = parser.parse_args()

    # APIキーファイルを読み込み
    keys = configparser.ConfigParser().read(‘conf/keys.conf’)
    auth = {
        ‘apiKey’: keys[args.exchange][‘api_key’],
        ‘secret’: keys[args.exchange][‘api_secret’]
    }

    if args.exchange == ‘bitflyer’:

        # bitflyerの証拠金残高を取得
        result = ccxt.bitflyer(auth).fetch2(path=‘getcollateral’,
                                            api=‘private’,
                                            method=‘GET’)
        balance = int(result[‘collateral’]) + int(result[‘open_position_pnl’])

    elif args.exchange == ‘bitmex’:
        pass # bitmex向けの処理(省略)

    # DBへ登録する(省略)

以上になります。ccxtによって、非常に簡単に実装することができました。

以下は、仮想通貨の自動売買関連の記事です。気になるかたは合わせてお読みください。

CryptowatchのAPIローソク足の情報を取得する方法です。 www.hacky.xyz

BitMEXのWebSocket APIを使ったリアルタイムトレードbotの作成方法です。多少慣れてきたら、こちらにチャレンジすると面白いと思います。 www.hacky.xyz