エンジニアの頭の中

フリーランスエンジニアが書く技術と投資のブログ

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

はじめに

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について知りたいかたは、過去の記事をご覧ください。 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回の頻度で実行して、資産残高を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によって、非常に簡単に実装することができました。

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

www.hacky.xyz

www.hacky.xyz

Pythonを使ってCryptowatchから仮想通貨のローソク足を取得する

f:id:mitsu3204:20180526205148p:plain

Index

はじめに

ボットを使用して、仮想通貨の自動売買を行うにあたり、多くのストラテジーでは、現在や過去の価格の情報を参考に売買シグナルを探索しています。 仮想通貨の自動売買を行うための第一歩として、Pythonを使って、ローソク足チャートの価格情報を取得する方法を覚えましょう。

今回は、高機能なチャートを提供しているWebサービスであるCryptowatchから、bitflyerビットコインFXのローソク足の情報を取得するコードを記載します。Cryptowatchは無料で使用可能で、APIキーも取得する必要はありません。

cryptowatch.jp

使用するライブラリ

requests

cryptowatchのRest APIを使用して、ohlcの取得を行うため、HTTP通信を行う必要があります。HTTP通信には、requestsrライブラリを使用します。requestsがインストールされていない場合、pipを使用してインストールしてください。

$ pip install requests

bitflyerビットコインFXのローソク足を取得するコード

CryptowatchのOHLC取得用APIを実行して、以下のローソク足を取得します。

OHLCとは OHLCとはローソク足チャートを形成するために必要な、始値(Open)、高値(High)、安値(Low)、終値(Close)の4種の価格のことを表します。これらの頭文字を取って、OHLCと呼ばれています。 また、OHLCの情報に、出来高(Volume)を加えたものをOHLCVと呼びます。

Python コード

from datetime import timedelta
import requests

# 昨日の日付を取得
yesterday = datetime.now() - timedelta(days=1)

# 1時間足のローソク足を1日前の分から取得するためのパラメータ
params = {
    'periods': [3600],
    'after': int(yesterday.timestamp())
}

# CryptowatchのAPIを実行して、bitflyerのbtcfxjpyのohlcを取得
res = requests.get(url='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc', params=params)
print(res.text)

periodsには、ローソク足の長さを秒で指定します(複数指定可)。1時間は、3600秒なので、1時間足のローソク足を取得する場合は、3600を指定します。

afterは、指定した日時以降のローソク足を取得したい場合に指定するパラメータであり、ここでは1日分のローソク足を取得するため、前日のタイムスタンプを指定して実行しています。 削除して未指定のまま実行しても問題ありません。

実行結果

上記のコードを実行すると、CryptowatchのAPIから受け取ったOHLCの情報を標準出力へ出力します。 以下は、インデントを付けて見やすくしています。

{
    "result":{
        "3600":[
            [1527242400,846501,848700,842994,845497,7392.5566,6254209000],
            [1527246000,844792,851900,836334,836334,8428.927,7133342000],
            [1527249600,836334,862999,833858,853150,13270.966,11254503000],

            ... 省略 ...

            [1527332400,862285,862500,860000,860550,1327.6826,1143753100]
        ]
    },
    "allowance":{
        "cost":2156157,
         "remaining":7991468784
    }
}

Cryptowatchのohlcの実行結果の構成は、以下のようになっています。

{
    "result":{
        "<ローソク足の長さ>": [
            [日時、始値、高値、安値、終値、出来高、売買金額],
            [日時、始値、高値、安値、終値、出来高、売買金額],
        ],
        "<ローソク足の長さ>": [
            [日時、始値、高値、安値、終値、出来高、売買金額],
            [日時、始値、高値、安値、終値、出来高、売買金額],
        ]
    },
    "allowance":{
        "cost":<消費したAPIの利用可能時間>,
         "remaining":<残りのAPI利用可能時間>
    }
}

result

トップレベルにresultというキーがありますが、この直下には、ローソク足の時間長さ(5分足、1時間足など)の秒数をキーとして、ローソク足のデータが格納されています。

上記のコードでは1時間足の情報を取得しており、1時間は3600秒なので、resultの中に3600というキーに紐づけられた配列があります。この配列にローソク足一本ごとのデータが格納されています。複数の長さのローソク足をまとめて取得した場合は、3600以外のキーもまとめて返されます。

ローソク足の構成要素について、公式ドキュメントでは、出来高までしか記載がないのですが、実際には売買金額らしきものがあります。該当の数字は、価格、出来高からすると、そのローソク足の期間で取引された金額の総額と見て間違いないと考えています。

allowance

resultの次にallowanceというキーがありますが、このキーには、APIを利用した時間と、残りのAPI利用可能な時間が格納されています。(単位はナノ秒

CryptowatchのAPIは無料で利用可能ですが、利用制限があります。CryptowatchのAPIサーバのCPU利用時間で制限されており、1時間の間に、利用可能なAPIサーバのCPU時間は、8,000,000,000ナノ秒(=8秒)までとなっています。制限を超えて、APIから正常応答が得られなくなった場合でも、最悪1時間後にまた利用可能になります。CPU時間の8秒は決して短くないため、よっぽど頻繁にAPIの呼び出しを繰り返さない限り、リミットに到達することはないと思います。

まとめ

APIを使うことで、簡単にローソク足を取得することができました。 Cryptowatchには、今回使用したもの以外にもAPIはあるので、きになるかたは、公式ドキュメント(英語)をご覧ください。

Public Market REST API - Cryptowatch

今回は、価格の取得に限定して記載しましたが、仮想通貨の自動売買を行うためのライブラリであるccxtを使った注文の出し方などについても、以前の記事で説明しています。こちらもご覧ください。

www.hacky.xyz

また、上記の記事では記載していませんが、次回は、ccxtを使ったローソク足の情報の取得方法についても、記事にしたいと思います。

Python3とCCXTを使用して仮想通貨の自動売買プログラムを作る

f:id:mitsu3204:20180318200600j:plain

目次

  • はじめに
    • CCXTとは何か
  • CCXTを使用するための準備
    • CCXTをインストールする
    • 対応する仮想通貨の取引所を確認する
  • CCXTの使い方
    • 取引所オブジェクトを作成する
    • Public API
      • fetch_markets - 取扱い通貨情報の取得
      • fetch_order_book - 注文情報の取得
      • fetch_trades - 取引履歴の取得
    • Private API
      • fetch_balance - 残高取得
      • create_order - 新規注文
      • cancel_order - 注文のキャンセル
      • fetch_orders - 注文状況一覧の取得

はじめに

Python 3と仮想通貨の自動売買ライブラリであるCCXTを使用して、ビットコインなどの仮想通貨の自動売買プログラムを作成するため、CCXTの使用方法を学びます。 Pythonのバージョンは、3.6.2を使用しましたが、3系なら問題ないと思います。

CCXTとは何か

ビットコインなどの仮想通貨の売買を自動化するためのライブラリであり、言語は、JavaScriptPythonPHPのいずれかで利用することができます。 CCXTというのは「CryptoCurrency eXchange Trading Library」の略です。

github.com

主な特徴は以下のとおりです。

  • 仮想通貨の価格や取引情報の取得、注文の発行が可能。
  • 通貨の交換、分析、裁定取引をサポートしている。
  • 多くの仮想通貨取引所の公開API、非公開APIの両方に対応していて、今後も対応する仮想通貨取引所は増えていく予定。
  • Node 7.6以上、Python 2及び3、PHP 5.3以上、WEBブラウザで機能する。 ※ccxt.asyncの機能を使用する場合は、Pythonのバージョンが3.5.3以上である必要があります。

CCXTを使用するための準備

CCXTをインストールする

まずは、CCXTのインストールを行います。CCXTは、pipでインストールできます。記事執筆時点(2018/3/18)では、1.11.x系が最新バージョンです。

$ pip search ccxt
ccxt (1.11.62)  - A JavaScript / Python / PHP cryptocurrency trading library with support for 90+ exchanges
$ pip install ccxt

対応する仮想通貨の取引所を確認する

CCXTが対応する取引所は、ccxtモジュールのexchangesに定義されています。 CCXTが、自分が自動売買に使用したい取引所のAPIに対応しているかどうは、以下のようにして確認できます。

コード
import ccxt
print(ccxt.exchanges)
実行結果
['_1broker', '_1btcxe', 'acx', 'allcoin', 'anxpro', 'bibox', 'binance', 'bit2c', 'bitbay', 'bitcoincoid', 'bitfinex', 'bitfinex2', 'bitflyer', 'bithumb', 'bitlish', 'bitmarket', 'bitmex', 'bitso', 'bitstamp', 'bitstamp1', 'bittrex', 'bitz', 'bl3p', 'bleutrade', 'braziliex', 'btcbox', 'btcchina', 'btcexchange', 'btcmarkets', 'btctradeim', 'btctradeua', 'btcturk', 'btcx', 'bxinth', 'ccex', 'cex', 'chbtc', 'chilebit', 'cobinhood', 'coincheck', 'coinegg', 'coinexchange', 'coinfloor', 'coingi', 'coinmarketcap', 'coinmate', 'coinsecure', 'coinspot', 'coolcoin', 'cryptopia', 'dsx', 'exmo', 'flowbtc', 'foxbit', 'fybse', 'fybsg', 'gatecoin', 'gateio', 'gdax', 'gemini', 'getbtc', 'hitbtc', 'hitbtc2', 'huobi', 'huobicny', 'huobipro', 'independentreserve', 'itbit', 'jubi', 'kraken', 'kucoin', 'kuna', 'lakebtc', 'liqui', 'livecoin', 'luno', 'lykke', 'mercado', 'mixcoins', 'nova', 'okcoincny', 'okcoinusd', 'okex', 'paymium', 'poloniex', 'qryptos', 'quadrigacx', 'quoinex', 'southxchange', 'surbitcoin', 'therock', 'tidex', 'urdubit', 'vaultoro', 'vbtc', 'virwox', 'wex', 'xbtce', 'yobit', 'yunbi', 'zaif', 'zb']

戻り値はリスト型で、対応している取引所の名前が要素として格納されています。 この記事では、bitflyerAPIを使用していきます。

なお、CCXTが対応している取引所は、ccxt/README.md at master · ccxt/ccxt · GitHubからでも確認できます。

取引所のAPIキーを取得する

取引所のAPIを使用するには、APIキーが必要となる場合があります。Public API の場合、APIキーがなくても利用できるものもありますが、自分の口座残高や取引履歴などは、Private APIとなり、APIキー無しでAPIを利用することはできません。

APIキーの取得方法については、取引所のヘルプや、他のブログなどをご確認ください。

CCXTの使い方

では、CCXTの使い方を解説していきます。

取引所オブジェクトを作成する

使用したい取引所のAPIに応じて、ccxtモジュールから、対応するクラスのオブジェクトを作成します。ここで作成したオブジェクトから、各APIを使用するためのメソッドを呼び出すことによって、APIの呼び出しが可能です。

bitflyerAPIを呼び出すためのオブジェクトは以下のように作成します。引数に指定しているapiKeysecretは、公開APIを使用する分には空文字で構いません。自分の口座の情報や、注文の発行などを行うPrivate APIを使用する際は、認証が必要になるため、ご自分のAPIキーとAPIシークレット情報を指定してください。

bf = ccxt.bitflyer({
    'apiKey': '<APIキー>',
    'secret': '<APIシークレット>'
})

例えば、bitflyerでなくコインチェックAPIを利用したい場合であれば、以下のようにcoincheckを呼び出します。

cc = ccxt.coincheck({
    'apiKey': '<APIキー>',
    'secret': '<APIシークレット>'
})

このような感じで各取引所に応じたクラスのオブジェクトを作成します。 取引所オブジェクトを作成したら、あとは、取引所ごとのAPI仕様の差異に関わらず、共通の操作(メソッド)が可能です。

ただし、共通のメソッドで操作が可能といっても、結局のところ、取引所ごとにAPIの仕様は異なるため、同じメソッドを使用していても、取引所が変われば、戻り値の内容も異なってきます。
 CCXTの各メソッドは、取引所のAPIを呼び出して受け取った戻り値は、CCXTとして共通の戻り値の形へのマッピングされます。メソッドによっては、取引所から受け取ったままの独自の戻り値も返ってきますが、詳細は後述します。

Public API

Public APIから見ていきましょう。Public APIというのは、名前のとおり公開されたAPIで、口座残高などの個人に紐づく情報を操作することはできません。 価格情報、取引量、板情報などの取得が可能です。自動売買をするにあたり、発注の判断に必要な情報を取得するのに使用します。

各メソッドの戻り値は、基本的にJSON形式で受け取ったAPIの実行結果を、辞書形式にして返されます。戻り値の内容を読みやすくするため、jsonモジュールを使用して、辞書をJSON形式のテキストに変換し、インデントを整えたうえで出力していきます。 具体的には、以下のコードで戻り値を出力します。

import json
print(json.dumps(<CCXTのメソッドの戻り値>, indent=True))

fetch_markets - 取扱い通貨情報の取得

取引所が扱う通貨の情報を取得します。 BTC/JPYETH/USDなど、その取引所で利用可能な通貨ペアの情報を取得することができます。通貨の情報は、辞書(dict)で返されます。取引所が複数の通貨を扱っている場合は、通貨の情報が格納された辞書を要素とするリスト(list)で返されます。

コード
result = bf.fetch_markets()
print(json.dumps(result, indent=True))
引数
  • なし
戻り値
  • dict または list
実行結果
[
 {
  "id": "BTC_JPY",
  "symbol": "BTC/JPY",
  "base": "BTC",
  "quote": "JPY",
  "info": {
   "product_code": "BTC_JPY"
  }
 },
 {
  "id": "FX_BTC_JPY",
  "symbol": "FX_BTC_JPY",
  "base": "BTC",
  "quote": "JPY",
  "info": {
   "product_code": "FX_BTC_JPY"
  }
 },
 {
  "id": "ETH_BTC",
  "symbol": "ETH/BTC",
  "base": "ETH",
  "quote": "BTC",
  "info": {
   "product_code": "ETH_BTC"
  }
 },
 {
  "id": "BCH_BTC",
  "symbol": "BCH/BTC",
  "base": "BCH",
  "quote": "BTC",
  "info": {
   "product_code": "BCH_BTC"
  }
 },
 {
  "id": "BTCJPY16MAR2018",
  "symbol": "BTCJPY16MAR2018",
  "base": "BTC",
  "quote": "JPY",
  "info": {
   "product_code": "BTCJPY16MAR2018",
   "alias": "BTCJPY_MAT1WK"
  }
 },
 {
  "id": "BTCJPY23MAR2018",
  "symbol": "BTCJPY23MAR2018",
  "base": "BTC",
  "quote": "JPY",
  "info": {
   "product_code": "BTCJPY23MAR2018",
   "alias": "BTCJPY_MAT2WK"
  }
 },
 {
  "id": "BTC_USD",
  "symbol": "BTC/USD",
  "base": "BTC",
  "quote": "USD",
  "info": {
   "product_code": "BTC_USD"
  }
 },
 {
  "id": "BTC_EUR",
  "symbol": "BTC/EUR",
  "base": "BTC",
  "quote": "EUR",
  "info": {
   "product_code": "BTC_EUR"
  }
 }
]

戻り値の辞書オブジェクトには、infoというキーにさらに辞書オブジェクトが紐づけられていますが、このinfoの中身は、取引所のAPIの戻り値をそのまま格納しています。

CCXTは取引所間のAPIの差分を吸収するためのライブラリであるため、どの取引所のAPIを呼び出しても、共通の戻り値の形を返すよう、CCXTのメソッド内で戻り値の加工を行いますが、取引所のAPIが返した未加工の状態を、infoに辞書で格納しています。これは、他のメソッドも同様です。

fetch_ticker - 価格情報の取得

指定した通貨ペアの現在の価格情報を取得します。 引数に、価格情報を取得したい通貨ペアを指定します。指定可能な値は、fetch_marketsの戻り値のsymbolの値から確認できます。('BTC/JPY’'BTC/USD'など)

取引所固有の項目は、infoというキーで辞書がネストされています。詳細は実行結果をご覧ください。

引数
  • symbol: 通貨ペア
  • params: 取引所固有のパラメータ。必要であれば指定する。
戻り値
  • dict
コード

例として、ビットコイン(BTC)と日本円のペアの情報を取得しています。

result = bf.fetch_ticker(symbol='BTC/JPY')
print(json.dumps(result, indent=True))

paramsという引数が指定できますが、これは取引所のAPIが独自受け取るパラメータを指定したい場合に、辞書形式でパラメータ名と値を指定するようにします。

fetch_ticker(symbol='BTC/JPY', params={'<パラメータ名>': '<値>'})

このparamsという引数は、fetch_tickerに限らず、他のメソッドでも同様の引数を受け取れるようになっています。

bitflyerの場合は、tickerのAPIが受け取るパラメータは、product_codeというtickerの取得対象の通貨を指定するパラメータのみであり、引数symbolで指定した通貨ペアが、CCXTのメソッド内で、このproduct_codeに置き換えられるため、paramsで指定するパラメータは一切ありません。

取引所固有のパラメータを指定する必要があるかどうかは、利用する取引所のAPIドキュメントを確認してください。

実行結果
{
 "symbol": "BTC/JPY",
 "timestamp": 1520679230028,
 "datetime": "2018-03-10T10:53:50.280Z",
 "high": null,
 "low": null,
 "bid": 1003227.0,
 "ask": 1003990.0,
 "vwap": null,
 "open": null,
 "close": null,
 "first": null,
 "last": 1003227.0,
 "change": null,
 "percentage": null,
 "average": null,
 "baseVolume": 23628.09562113,
 "quoteVolume": null,
 "info": {
  "product_code": "BTC_JPY",
  "timestamp": "2018-03-10T10:53:50.28",
  "tick_id": 2042739,
  "best_bid": 1003227.0,
  "best_ask": 1003990.0,
  "best_bid_size": 0.1981,
  "best_ask_size": 0.01,
  "total_bid_depth": 2419.19038488,
  "total_ask_depth": 3312.40865674,
  "ltp": 1003227.0,
  "volume": 247012.0705073,
  "volume_by_product": 23628.09562113
 }
}

fetch_order_book - 注文情報の取得

現在の注文情報(板)を取得します。 戻り値の辞書には、買い注文、売り注文それぞれの情報が格納されており、買い注文はasks、売り注文はbidsというキーで、配列で価格と数量の情報を持っています。

引数
  • symbol: 通貨ペア
  • limit: 最大取得件数を指定するために用意されている引数かと思われますが、bitflyercoincheckzaifなどの主要な取引所のソースコードを確認した限りでは、この引数は使用されていないようです。

戻り値
  • dict
コード

ここでも、ビットコイン(BTC)と日本円のペアの注文情報(板)を取得してみます。

result = bf.fetch_order_book(symbol='BTC/JPY')
print(json.dumps(result, indent=True))
実行結果
{
 "bids": [
  [
   1006100.0, # 価格
   0.95       # 数量
  ],
  [
   1006000.0,
   2.31520001
  ],
  [
   1005840.0,
   1.4
  ],

... 長いため省略 

 "asks": [
  [
   1006299.0,
   0.38228109
  ],
  [
   1006300.0,
   0.86
  ],

... 長いため省略 

  [
   2500000.0,
   0.06
  ]
 ],
 "timestamp": 1520679590015,
 "datetime": "2018-03-10T10:59:50.150Z"
}

板情報のリストがとても長いため、間は省略しましたが、価格と注文量のセットが大量に連なっています。

fetch_trades - 取引履歴の取得

直近の成立した取引の履歴を取得します。

引数
  • symbol: 通貨ペア
  • limit: 最大取得数。取引所によって取得可能な最大取引数が異なるため、取引所の許容可能な最大値よりも大きい値をlimitに指定した場合は、その取引所の取得可能な最大値までしか取引情報は返されません。また、limitに0を指定した場合は、取得可能な取引が全て返されます。負の値を指定した場合は、取得可能な取引数から指定した負の数分だけ、差し引かれた取引数が返されます。
戻り値
  • list
コード
result = bf.fetch_trades(symbol='BTC/JPY', limit=2)
print(json.dumps(result, indent=True))
実行結果
[
 {
  "id": "174800818",
  "info": {
   "id": 174800818,
   "side": "BUY",
   "price": 816683.0,
   "size": 0.03,
   "exec_date": "2018-03-18T05:39:53.9",
   "buy_child_order_acceptance_id": "JRF20180318-053953-470298",
   "sell_child_order_acceptance_id": "JRF20180318-053953-330497"
  },
  "timestamp": 1521351593009,
  "datetime": "2018-03-18T05:39:53.900Z",
  "symbol": "BTC/JPY",
  "order": "JRF20180318-053953-470298",
  "type": null,
  "side": "buy",
  "price": 816683.0,
  "amount": 0.03
 },
 {
  "id": "174800807",
  "info": {
   "id": 174800807,
   "side": "SELL",
   "price": 816594.0,
   "size": 0.5988,
   "exec_date": "2018-03-18T05:39:53.15",
   "buy_child_order_acceptance_id": "JRF20180318-143942-701747",
   "sell_child_order_acceptance_id": "JRF20180318-053952-003651"
  },
  "timestamp": 1521351593015,
  "datetime": "2018-03-18T05:39:53.150Z",
  "symbol": "BTC/JPY",
  "order": "JRF20180318-053952-003651",
  "type": null,
  "side": "sell",
  "price": 816594.0,
  "amount": 0.5988
 }
]

このメソッドの戻り値も、CCXTが加工する前の取引所APIの戻り値は、infoというキーに紐づけて、辞書形式で格納されています。

Private API

続いて、Private APIの使用方法を見ていきます。Private APIは、個人の口座残高、取引履歴など、Public APIでは取得できない個人の情報にアクセスすることができます。また、購入、売却などの発注を行うのもPrivate APIの操作が必要となります。 Private APIを使用するには、APIキーとAPIシークレットによる認証が必須となります。また、APIにもよるかと思いますが、APIでの実行を許可する操作を取引所のAPI管理画面から操作可能だと思います。Private APIを試してみる前に、目的の操作を許可しておいてください。

fetch_balance - 残高取得

APIキーに紐づく口座の残高の情報を取得します。

引数
  • params: 必須ではありません。取引所のAPIに渡すパラメータを渡す必要があれば、辞書形式で指定します。bitflyerの場合、残高取得APIが受け取るパラメータはありません。
コード
result = bf.fetch_balance()
print(json.dumps(result, indent=True))
実行結果
{
 "info": [
  {
   "currency_code": "JPY",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "BTC",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "BCH",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "ETH",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "ETC",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "LTC",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "MONA",
   "amount": 0.0,
   "available": 0.0
  },
  {
   "currency_code": "LSK",
   "amount": 0.0,
   "available": 0.0
  }
 ],
 "BCH": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "BTC": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "ETH": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "EUR": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "JPY": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "USD": {
  "free": 0.0,
  "used": 0.0,
  "total": 0.0
 },
 "free": {
  "BCH": 0.0,
  "BTC": 0.0,
  "ETH": 0.0,
  "EUR": 0.0,
  "JPY": 0.0,
  "USD": 0.0
 },
 "used": {
  "BCH": 0.0,
  "BTC": 0.0,
  "ETH": 0.0,
  "EUR": 0.0,
  "JPY": 0.0,
  "USD": 0.0
 },
 "total": {
  "BCH": 0.0,
  "BTC": 0.0,
  "ETH": 0.0,
  "EUR": 0.0,
  "JPY": 0.0,
  "USD": 0.0
 }
}

他のメソッドの戻り値と同様で、infoキーに紐づくオブジェクトは、取引所APIの戻り値がそのまま格納されています。

CCXT共通の項目としては、各通貨名称をキーとして、freeusedtotalという3つのキーを持つ辞書と、freeusedtotalをそれぞれキーとして、各通貨をメンバとして持つ辞書となります。 freeusedtotalの意味は、以下のとおりです。

  • total … 合計残高
  • free … 使用可能な残高(売却注文中の分などは除かれると思われる)
  • used … total - free

create_order - 新規注文

「買い」または「売り」の注文を新規発行します。 本番環境に不意に注文を行なってしまわないように注意しましょう。テスト環境がある取引所の場合は、テスト環境を使用しましょう。

引数
  • symbol: 通貨ペア
  • type: 指値ならlimit、成行ならmarket
  • side: 買い注文の場合はBUY、売り注文の場合はSELL
  • amount: 通貨の量
  • price: 価格
  • params: 取引所のパラメータ
コード

通貨はBTC/JPY、量が0.001、価格に50万l円を指定して指値で買い注文を行なっています。

result = bf.create_order(symbol='BTC/JPY', type='limit', side='BUY', amount=0.001, price=1)
print(json.dumps(result, indent=True))
実行結果
{
 "info": {
  "child_order_acceptance_id": "JRF20180321-122844-950096"
 },
 "id": "JRF20180321-122844-950096"
}

id というキーに文字列が設定されていますが、これがbitflyerに発行した注文のIDとなります。注文のキャンセルなどを行う場合は、このIDを使用します。

cancel_order - 注文のキャンセル

未約定の注文をキャンセルします。

引数
  • id: キャンセルしたい注文のIDを指定します。
  • symbol: 通貨ペアを指定します。
戻り値

なし(bitflyerの場合)

コード

先ほど、create_orderで発行した注文のIDを指定して、この注文を取り消してみます。

result = bf.cancel_order(id='JRF20180321-122844-950096', symbol='BTC/JPY')
print(json.dumps(result, indent=True))
実行結果

戻り値は空っぽで返ってきました。bitflyerAPIドキュメントによると、注文のキャンセルに成功した場合は、HTTPステータスの200のみ返して、ボディは何も返さない仕様のようです。取引所によっては、ボディを返してくるAPIもあると思うので、自分が使用するAPのドキュメントは確認しましょう。

fetch_orders - 注文状況一覧の取得

発注済みで未約定の注文の一覧を取得します。

引数
  • symbol: 通貨ペアを指定します。
  • since: 注文の取得対象とする起点となる日時を指定します。指定した日時以降の注文のみを取得したい場合に使用します。
  • limit: 取得する注文の最大件数を指定します。 sinceやlimitは、取得する注文の量を制限するものですが、APIリクエストのパラメータとして指定されているわけではありません。あくまでもbitflyerから取得した結果を、これらの引数で指定された内容に従ってフィルタリングしているに過ぎません。
戻り値

list

コード
result = bf.fetch_orders(symbol='BTC/JPY')
print(json.dumps(result, indent=True))
実行結果
[
 {
  "id": "JRF20180321-125325-324617",
  "info": {
   "id": 0,
   "child_order_id": "JOR20180321-125325-640119",
   "product_code": "BTC_JPY",
   "side": "BUY",
   "child_order_type": "LIMIT",
   "price": 500000.0,
   "average_price": 0.0,
   "size": 0.001,
   "child_order_state": "ACTIVE",
   "expire_date": "2018-04-20T12:53:25",
   "child_order_date": "2018-03-21T12:53:25",
   "child_order_acceptance_id": "JRF20180321-125325-324617",
   "outstanding_size": 0.001,
   "cancel_size": 0.0,
   "executed_size": 0.0,
   "total_commission": 7e-07
  },
  "timestamp": 1521636805000,
  "datetime": "2018-03-21T12:53:25.000Z",
  "status": "open",
  "symbol": "BTC/JPY",
  "type": "limit",
  "side": "buy",
  "price": 500000.0,
  "cost": 0.0,
  "amount": 0.001,
  "filled": 0.0,
  "remaining": 0.001,
  "fee": {
   "cost": 7e-07,
   "currency": null,
   "rate": null
  }
 }
]

ここでは、1件のみととなっていますが、複数の注文を行なっていれば、それらがリストの要素として返されます。 返される内容としては、注文のID、発注日時、通貨や価格、注文の状態など、注文の内容に関する一通りの情報が返されるようです。ただし、これも取引所のAPI次第で、内容が異なると思われます。おそらく取引所のAPIが対応していない項目については、Noneとなっていると思います。

以上となります。

今回は、仮想通貨の自動売買プログラムを作成するために必要となるCCXTの基本的なAPIの使用方法のみを説明しました。 また機会があれば、CCXTを使用して、実際にマーケットの情報を取得して、売買の判断と発注を行うプログラムについての記事も書いてみようと思います。

以下は、仮想通貨の自動売買に関連する記事です。

www.hacky.xyz

www.hacky.xyz

仮想通貨を取引所で管理するのはやめよう!MONEROウォレットの導入方法

f:id:mitsu3204:20180128162953p:plain

目次

 

インチェックの不正送金事件をうけて

2018年1月26日コインチェックが、XEMを不正に送金される被害に遭いましたね。

私はいくつかの取引所を利用していますが、コインチェックも利用しています。

インチェックでは、XEMは持っていませんでしたが、他のアルトコインが売買も送金もできない状態となっています。

 

また、ジェネシスマイニングでマイニングしたXMR(Monero)の送金先をコインチェックのアドレスにしており(面倒くさがって)、2018/1/28 14:00時点ではコインチェックは入金も受け付けていないですし、今後もこういった事件が起きる可能性はあるため、マイニングしたXMR(Monero)は、自分のPCのウォレットに保管しようと思いました。

ウォレットを作成するまでの手順を残しておきます。

 

Monero公式ウォレットのインストール手順

公式のウォレットを導入します。今回インストールするのは、Mac OS X向けのGUI版です。(CUI版のウォレットもあります)

 

ウォレットアプリをダウンロードする

まずは、Moneroの公式サイトのウォレットのダウンロートページに、ブラウザでアクセスします。

getmonero.org

 

Macのリンクをクリックします。

f:id:mitsu3204:20180128153808p:plain

 

以下のように表示されるので、Mac OS X, 64-bit のGUI版のリンクをクリックします。クリックするとウォレットの圧縮ファイルのダウンロードが始まります。

f:id:mitsu3204:20180128153712p:plain

 

ダウンロードしたファイルを展開する

ファイル(monero-gui-mac-x64-v0.11.1.0.tar.bz2)のダウンロードが完了したら、 同ファイルをダブルクリックして、ファイルを展開します。

 展開すると、Moneroのウォレットであるmonero-gui.appが現れます。このファイルの置き場所はどこでも良いですが、私はアプリケーションディレクトリに移動しておきました。

ウォレットを起動する

インターネットからダウンロードしたアプリのため、ウォレットは右クリックしてから、「開く」を選択してアプリを起動します。

f:id:mitsu3204:20180128154518j:plain

 

アプリを起動して良いか確認のためのダイアログが表示されるので「開く/Open」を選択します。

f:id:mitsu3204:20180128154658p:plain

 

ウォレットの初期設定を行う

使用する言語を選択します。

f:id:mitsu3204:20180128154811p:plain

 

「新しくウォレットを作る」を選択します。

f:id:mitsu3204:20180128154845p:plain

 

次に、ウォレット名と、ウォレットの保存先ディレクトリを入力します。私はデフォルトのままにしました。

すぐ下に「けんげん けつい・・・」と、謎の呪文のような文字列が表示されていますが、これはウォレットのバックアップと復元に必要になるとのことなので、しっかり保管しておきましょう。

f:id:mitsu3204:20180128155244j:plain

 

ウォレットのパスワードを指定します。入力欄が二つありますが、確認のために再度入力するためのものです。

f:id:mitsu3204:20180128155503p:plain

 

これで初期設定は完了です。「モネロを使う」をクリックして、ウォレットを開きます。

f:id:mitsu3204:20180128163715j:plain

 

ウォレットをブロックチェーンと同期する

ウォレットが起動したら、今度はウォレットがMoneroのブロックチェーンと同期する必要があります。初回起動時は、結構時間がかかりますので、しばらく放置しておきましょう。私の場合は、およそ9時間後くらいに完了していました。

同期の進捗状況は、ウォレットの左下に表示される残りブロック数で把握することができます。

f:id:mitsu3204:20180128155830p:plain

次回以降の起動時には、同期が必要なのは、差分のデータのみとなるため、瞬時に完了するようになります。

 

ウォレットにXMRを送金する

同期が完了したら、ウォレットにXMRを送金します。ウォレットの左側のメニューから「受け取る」を選択すると、このウォレットのアドレスが表示されます。

f:id:mitsu3204:20180128160750j:plain

取引所などの管理画面から、このアドレスに対して、XMRを送金すれば、無事に完了です。

 

まとめ

ウォレットの導入は至って簡単です。短期間で仮想通貨の売買を行うのでなければ、安全のため、取引所のウォレットでは管理せず、このようにウォレットを導入して自分で管理することをオススメします。ちなみに、このウォレットアプリでマイニングもできます。

Ledger Nano S が、Moneroも対応したら嬉しいんですけどね。

 

Ledger Nano S (レジャー・ナノS) ビットコイン&イーサリアムハードウェアウォレット

 

Trello見ると、ロードマップ上にはありますね。Moneroの特性上、他の通貨より対応が難しいみたいですが、今後に期待です。

trello.com

 

ジェネシスマイニング(Genesis Mining)がEthereumのマイニングの先行販売を開始

クラウドマイニング大手のジェネシスマイニング(Genesis Mining)が、Ethereumのマイニングの新年先行販売を始めたようです。

 

そもそも、ジェネシスマイニング(Genesis Mining)、クラウドマイニングって何?というかたは、以下の記事を読んでみてください。

www.hacky.xyz

www.hacky.xyz

 

プランは小中大の3つとカスタムプランの計4つ

2018年1月28日時点で、以下のプランが販売されています。

f:id:mitsu3204:20180128123340p:plain

 

過去の実績からすると、数日で売り切れになる可能性が高いですね。

 

マイニング開始時期に注意

先行販売であって、今回の販売分のマイニングの開始時期は、2018/4/30です。マイニングを開始できるまで多少期間が空くようですね。

 

契約プランごとの収益の目安

販売されているプランは4つあり、契約期間は、どれも24ヶ月間となりますが、それぞれハッシュパワーと値段が異なります。

以下のcryptocompare.comを利用して、各プランのハッシュパワー、現在のETHの価格から、どの程度の収益になるのか確認してみました。

www.cryptocompare.com

 

このサイトは、仮想通貨とハッシュパワーを入力すると、日、週、月などの単位で、どの程度の収益を得られるかの予想を提示してくれるサービスです。

f:id:mitsu3204:20180128130346p:plain

 

プランごとの月の予想収益 (2018/1/28 時点)

プラン ハッシュパワー 料金 ETH予想採掘量 予想収益
小(スターター) 40MH/s $1,520 (¥165,056) 0.1137 $113.09 (¥12,280)
中(ベストバイ) 120MH/s $4,440 (¥482,139) 0.3410 $363.46 (¥39,468)
大(最大の利益) 360MH/s $12,960 (¥1,407,326) 1.02 $1,114.57 (¥121,031)

cryptocompare.comによる収益予想は、USDでの表示となるので、ドル/円は、2018/1/27のレート¥108.59/$1で計算して、日本円での収益を算出しています。 

 

まとめ

どのプランも、約12ヶ月前後で、初期コストが回収できる計算となりますので、残り1年間でマイニングした分が、純粋に利益となります。

また、ETHは仮想通貨の中でも今後の値上がりが期待できる通貨なので、今後の相場次第では、上記の予想の2倍、3倍の収益を得られる可能性もあると思います。

 

ジェネシスマイニング(Genesis Mining)でクラウドマイニングを始めようというかたは、以下からどうぞ。契約する際は、0t86ilのプロモーションコードを入力すると、契約料金が3%割引になります。

www.genesis-mining.com

 

 

クラウドマイニングでXMR(Monero)を1ヶ月掘ってみた結果

f:id:mitsu3204:20180127153143j:plain

目次

 

はじめに

2017年12月に、新たな収入源を一つ増やすために、Genesis Miningを利用して、仮想通貨のクラウドマイニングを始めました。始めてから1ヶ月が経過したので、実績を公開しておきます。

以下は、クラウドマイニングを始めた際に書いた記事です。

www.hacky.xyz

 

マイニングしたのは主にXMR(Monero)

私が、主にマイニングしていたのは、匿名性の高い通貨であるMonero(XMR)です。

別に特別Moneroを掘りたかったわけではないのですが、私が始めようとした際には、Genesis Mining の在庫として、Moneroのマイニング以外は売り切れの状態だったため、Moneroのハッシュパワーの契約をしました。

契約した内容(ハッシュパワーの量)は、Monero 3000 H/s を24ヶ月間です。

 

ハッシュパワーの割り当てについて

ジェネシスマイニングでは、ハッシュパワーをいくつかのコインに割り当てることができます。割り当て可能なコインは、契約によって異なりますが、私の場合は、Moneroで契約しているため、以下のようなラインナップでした。

  • XMR (Monero)
  • BTC (Bitcoin)
  • LTC (Litecoin)
  • DASH
  • ZEC (Z-Cash)
  • BTG (Bitcoin Gold)

以下のような画面で、ハッシュパワーをどのコインのマイニングにどの程度割り当てるかを変更できます。

 

f:id:mitsu3204:20180127145744p:plain

 

Genesis Mining を利用し始めて、最初の数日間は、使い方がよくわかっていなかったため、BitcoinとMoneroに対して、50%ずつハッシュパワーを割いていましたが、途中からは、契約した 3000 H/sの100%をMoneroに割り当てるようにしました。

 

初めてから1ヶ月間はコインは支払われない

前回の記事でも書きましたが、契約代金をクレジットカードで支払っている場合、この支払いの確認に1ヶ月かかるため、その間、マイニングはできるものの、支払いは保留され続けます。

 

保留中も1日ごとに支払いのレコードが作成されていくので、日々のマイニングの状況は確認することができます。

また、支払い保留中のコインの残高は、以下のようにGenesis Miningの画面上で確認できます。

f:id:mitsu3204:20180127150558p:plain

1ヶ月経過後は、1日1回の頻度でマイニングしたコインが支払われるようになります。(予め登録しておいたアドレスに対して、送金されます)

XMR(Monero)を1ヶ月間マイニングした結果

で、結局、1ヶ月間XMR(Monero)をマイニングした結果はというと・・・

f:id:mitsu3204:20180127151231p:plain

 

XMR 0.6 コインでした!支払われた日のXMR/JPYのレートだと、2万円ちょっとといったところです。

マイニングした量が特別少なかったわけではないのですが、つい先日、軒並み仮想通貨が暴落した影響で、XMRの価格も下がっており、マイニング開始時に計算した見込みより一万円くらい少ない収益となりました。

 

このペースだと、最初に投じた$2,400の元を取るためには、約一年かかります。ハッシュパワーの契約月数は24ヶ月なので、利益は十分だせますが、仮想通貨は価格変動が激しいので、あまり予想は意味がなさそうですね。

Monero自体は、今後も期待できる仮想通貨だと思っています。

 

ジェネシスマイニングでクラウドマイニングを始めたいかたは、以下のリンクからどうぞ。(申し込みの際に0t86il のプロモーションコードを使用すると3%割引となります)

www.genesis-mining.com

 

以上です。

 

仮想通貨のクラウドマイニングで日々の収入を得る

f:id:mitsu3204:20171223204400p:plain

目次

 

はじめに

収入のチャンネルを新たに一つ増やすため、仮想通貨のクラウドマイニングを始めてみました。 

私が始めた時の記録を残しておきますので、これから始めようと思っている人がいれば参考にしてみてください。

 

クラウドマイニングとは

一般的なマイニングというのは、マイニング用の機器を用意して、それらを稼働させ、電気代を払って行うものですが、クラウドマイニングは、機器の購入や、メンテナンス、電気代などは一切気にせず、サービスを展開する業者にお任せするというものです。

利用者としては、リソースの使用量に応じた代金を支払うだけでよく、ハードウェアなどに詳しくない初心者でも簡単にマイニングを始めることができます。

 

マイニング大手Genesis Mining に申し込む

クラウドマイニングのサービスを展開している企業は、いくつか存在するようですが、倒産してしまったり、契約金だけ受け取って、サービスを終了させるような詐欺まがいの企業も実際にいたようで、実績がある信頼できるサービスを利用した方が良いでしょう。 

ということで、 クラウドマイニングの大手であるGenesis Mining を利用してみることにしました。

www.genesis-mining.com

 

Genesis Miningは、クラウドマイニング業者の中では、HashFlareと並ぶ大手です。

 

マイニング可能なコインとして、BITCOIN(ビットコイン)、DASH(ダッシュ)、ETHEREUM(イーサリアム)、MONERO(モネロ)、ZCash(ジーキャッシュ)などを取り扱っています。


Moneroマイニング 3000H/s のハッシュパワーを契約

仮想通貨のブームに伴い、クラウドマイニングも好評なようで、現時点(2017/12/23)では、Moneroマイニング以外は全て売り切れでした。

 

f:id:mitsu3204:20171223201538p:plain

 

なので、私は、Monero マイニングの3000 H/s (2年間)をクレジットカードで購入しました。

f:id:mitsu3204:20171223200811p:plain


料金は、2年契約で $2,460 ですが、プロモーションコード(アフィリエイト)を入力することによって、3%割引となり、$2,385.23(約27万円)でした。 

f:id:mitsu3204:20171223200953p:plain

契約時は、0t86il のプロモーションコードを使用すれば、同じように3%割引となります。もし、よかったら使ってください。

 

赤字にならないためにはいくら稼げれば良いのか?

そもそも、いくらくらい稼げば赤字にならないのでしょうか?

契約金額は、2年間の契約で、$2,385.23(約27万円)ですから、1日あたりだと以下のコストがかかっていることになります。

 

$3.26743836 = 2,385.23 ÷ 730日

 

$3.26なので、現在の日本円だと、約370円ほどになります。

 

また、利益を得るには、掘って得られる仮想通貨の量だけでなく、仮想通貨の価格も重要になってくるわけです。仮想通貨の価格次第では、掘っても掘っても儲けにならない可能性はあります。

 

契約したハッシュパワーでどれくらい稼げるのか?

以下のサイトで、得られる報酬を計算できます。(Monero以外も計算できます) 

 

Mining Calculator Bitcoin, Ethereum, Litecoin, Dash and Monero

https://www.cryptocompare.com/mining/calculator/xmr?HashingPower=3000&HashingUnit=H%2Fs&PowerConsumption=0&CostPerkWh=0

 

使い方

  1. タブから目的の仮想通貨を選択する。
  2. Hashing Power にハッシュパワーを入力する。(単位はH/Sを選択)
  3. クラウドマイニングでは電気代のコストの考慮は不要なので、Power consumption (w) と、Cost per KW/h ($) には、0を入力する。

入力が完了したら、予測報酬が表示されています。PROFIT PER MONTH、一月で得られる報酬です。

 

f:id:mitsu3204:20171223200322p:plain

 

Porfit per day (1日の儲け)を見ると、$9.41となるので、1日あたりのコストに対して3倍弱の報酬となるわけです。一月で、$282(約32000円)なので、9ヶ月で元が取れる計算となります。

また、契約期間である24ヶ月の総額だと、$6,774(約77万円)となります。

 

この数値を見る限り、そこそこ魅力的なリターンだとは思いますが、仮想通貨は、価格の変動が激しいため、このとおりにはいかないでしょう。


初回の報酬時期について注意

通常、マイニングによる報酬は毎日支払われるとのことですが、初回契約時は、クレジットカードの支払い情報の確認のため、1ヶ月間は報酬は支払われず、プールされた状態となるようです。

 

マイニング初日の報酬

日々のマイニングの状況は、注文状況の画面から確認できるようです。

契約してから2日後に該当の画面を確認したところ、Bitcoinと、Moneroの欄の残高が増えていました。

 

BTC 0.00020390

XMR 0.01572720

 

f:id:mitsu3204:20171225220424p:plain

 

契約したのは、Moneroなのですが、Bitcoinの残高も増えていました。

 

おそらくですが、マイニングの割当を行う画面で、何のマイニングにどれだけのハッシュパワーを割り当てるかを設定できるのですが、BTCなどの契約した通貨以外に割当を行ってみても正常に設定を保存できていたので、そのせいだと思います。

 

で、この1日で得た分を日本円で計算してみた結果

 

Bitcoin 338.8818円

Monero 639.7975440995円

 

となりました。

 

以上になります。

 

こうやって始めてみると、興味が湧いてきてしまいました。マイニングに関する本でも読んでみようかな。。

 

マイニングの教科書

超簡単マイニング

モナーコイン採掘レポート①準備編

 

まだ契約したばかりのため、実績データが溜まったらまた公開しようと思います。