CryptocurrencyPython

【Python|ccxt】bitbank(ビットバンク)でビットコイン自動取引ツールの作成方法【実装編】

Cryptocurrency

[PR]

どうも、月見(@Suzuka14144156)です。

解決するお悩み
  • ビットコイン自動取引したいけどやり方がわからない
  • 簡単な方法で、自動取引したいけど、やり方がわからない
  • プログラミングが苦手

ビットコイン自動取引ツールの概要

暗号資産取引所から、APIを使って、データを取得し、注文をします。

特徴

  • チャート分析には、BinanceのBTC/USDTチャートを用いる
  • そのチャートをもとにbitbankで売買する

理由は、Binanceの方がbitbankより取引量が多く、信頼性が高いデータのためです。

以下比較すると明らかにBinanceの方がチャートがきれいになっています。

Binance

BITFLYER

月見
月見
  • なので、Binanceのデータを分析し、bitbankで取引するように設計する

ビットコイン自動取引ツールのフローチャート

今回実装するコードのフローチャートは、以下です。

  • 今回は、1分ごとにチャート分析することとした

なるべく短い時間で、検証したかったので、1分足のチャートを用いることにしました

買いサイン

現在価格が、ボリンジャーバンドの2σ下限以下になったら購入とします。

売りサイン

現在価格が、ボリンジャーバンドの2σ上限以上になったら売却とします。

もしくは、購入価格より5%下落した場合は、売却とします。(損切)

ビットコイン自動取引ツールの作成方法 ~準備~

bitbankの口座開設

今回の記事では、bitbankの口座開設の必要があります。

もし、口座をお持ちでない方は、口座開設ください。

Pythonの準備

そもそもPythonをインストールできていない方は、以下の記事を参考にしてまずは、インストールください。

ccxtのインストール

  • 「検索」から「コマンドプロンプト」起動

コマンドプロンプトにて、以下を入力し、エンターを押す。

pip install ccxt

Successfully installed ccxt-2.1.25 cryptography-38.0.3 setuptools-65.5.1と表示されればインストール成功です。

TA-Libのインストール

TA-Libとは?
  • テクニカル指標を得るためのライブラリ

これを使うことで、移動平均線やボリンジャーバンドなどの値を簡単に入手できます。

月見
月見
  • 早速インストール方法を解説します。

pythonのバージョンを調べる

コマンドプロンプトで以下を入力する。

python -V

PowerShellCopy

すると、インストールされているPythonの情報が表示されます。

Python 3.8.8

この場合は、バージョン3.8のPythonであることがわかります。

TA-Libのwhlファイルをダウンロード

次に,以下のダウンロードサイトからTA-Libのwhlファイルをダウンロードします.
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

ダウンロードするファイルは、以下のようになります。

  • Python 3.9,Windows 64bitの場合:「TA_Lib‑0.4.19‑cp39‑cp39‑win_amd64.whl」
  • Python 3.9,Windows 32bitの場合:「TA_Lib‑0.4.19‑cp39‑cp39‑win32.whl」
  • Python 3.8,Windows 64bitの場合:「TA_Lib‑0.4.19‑cp38‑cp38‑win_amd64.whl」
  • Python 3.8,Windows 32bitの場合:「TA_Lib‑0.4.19‑cp38‑cp38‑win32.whl」

TA-Libをインストール

ダウンロードしたwhlファイルを保存したディレクトリを開く。

アドレスを入力するところに「cmd」と入力し、エンターを押す。

開いたコマンドプロンプトにて、以下を入力。

pip install whlファイル名

PowerShellCopy

以下は、例です。

pip install TA_Lib‑0.4.19‑cp38‑cp38‑win64.whl
月見
月見
  • これで完了です。

インスタンス化

取引所に接続して取引を開始するには、ccxt ライブラリから取引所クラスをインスタンス化する必要があります。

import ccxt
print (ccxt.exchanges)

これを実行すると、様々な取引所の名前が表示されるはず。

これができていれば、これまでの環境設定が上手くいっている証拠です。

bitbankでビットコイン自動取引ツールの作成準備

bitbankからAPIキーを取得

  • 「人間」のマークをクリック
  • 「API」をクリック
  • 「APIキーの発行」をクリック
  • 必要項目を入力し、「確認する」をクリック

  • アクセスキーとシークレットアクセスキーが発行されます

シークレットアクセスキーは他人に教えないように!

bitbankでビットコイン自動取引ツールの作成方法のコード全文

import time
import ccxt
import datetime
import calendar
import pandas as pd
import talib
import numpy as np

'''
Binanceの板情報に基づいて、bitbankで取引する
'''

# ビットコイン自動売買初期設定
symbol = "BTC/JPY"   # 購入通貨
amount = 0.0001       # 購入数量[BTC]
sleep_time = 60 #秒
loss_line = 0.95 #損切ライン(5%の下落で損切)

# API情報
API_KEY     = "API_KEYを入力"
SECRET_KEY  = "SECRET_KEYを入力" 

#bitbank
bb = ccxt.bitbank({
    'apiKey': API_KEY ,
    'secret': SECRET_KEY ,
})

#Binance
binance = ccxt.binance()

#価格リスト
btc_price_list = []

#初期セット
def get_ini_price(ticker='BTC/USDT', timeframe='1h',minute = sleep_time*60*20):
    # 現在時刻のUTC naiveオブジェクト
    now = datetime.datetime.utcnow()
    # UTC naiveオブジェクト -> UnixTime
    unixtime = calendar.timegm(now.utctimetuple())

    # 1200分前のUnixTime(ミリ秒)
    
    since = (unixtime - 60 * minute) * 1000
    ohlcvs = binance.fetch_ohlcv(symbol=ticker, timeframe=timeframe, since=since)
    #df化
    df = pd.DataFrame(ohlcvs, columns=['Time','Open','High','Low','Close','Vol'])
    df ['Time'] = pd.to_datetime(df ['Time'],unit='ms')
    df ['Time'] = df ['Time'] + datetime.timedelta(hours=+9) #日本時間に変更
    df.index = df ['Time'] 
    return df

#新しい価格の取得
def get_new_price(ticker='BTC/USDT', timeframe='1h',minute = sleep_time*60*20):
    # 現在時刻のUTC naiveオブジェクト
    now = datetime.datetime.utcnow()
    # UTC naiveオブジェクト -> UnixTime
    unixtime = calendar.timegm(now.utctimetuple())

    # UnixTime(ミリ秒)
    since = (unixtime - 60 * minute) * 1000
    ohlcvs = binance.fetch_ohlcv(symbol=ticker, timeframe=timeframe, since=since)
    #df化
    df = pd.DataFrame(ohlcvs, columns=['Time','Open','High','Low','Close','Vol'])
    df ['Time'] = pd.to_datetime(df ['Time'],unit='ms')
    df ['Time'] = df ['Time'] + datetime.timedelta(hours=+9) #日本時間に変更
    df.index = df ['Time'] 
    return df.iloc[-1]

# 日本円残高情報を取得
def balance_jpy():
    JPY = float(bb.fetch_balance()['info']['data']['assets'][0]['free_amount'])
    return JPY

#日本円残高チェック
def check_jpy():
    # 初期残高
    initial_balance = balance_jpy()

    # 日本円残高が今回購入予定のビットコイン価格×数量を上回っているか確認
    balance_dif = int(initial_balance - (float(bb.fetch_ticker(symbol="BTC/JPY")["last"]) * amount))
    print("残高",initial_balance)

    # 残高判定
    if balance_dif > 0:
        message = "ビットコイン購入可能"
    
        
    else:
        message = "ビットコイン購入不可"
        
    return message   

# ビットコイン売買
def order(buy_sell,amount):
    order = bb.create_order(
                    symbol = "BTC/JPY",     # 取引通貨
                    type   = "market",      # 成行注文
                    side   = buy_sell,      # 購入 or 売却
                    amount = amount,        # 取引数量
                    )
    return order

# 購入条件
def bb_band_buy(btc_price_list):

    # ボリンジャーバンド引数情報
    period  = 20  # データ取得期間
    bbup    = 2   # upper-band:標準偏差
    bbdwn   = 2   # down-band:標準偏差
    ma_type = 0   # 移動平均の種類(0:単純移動平均)
    
    # ボリンジャーバンド指標獲得
    bb_up, bb_middle, bb_down = talib.BBANDS(pd.Series(btc_price_list),  # 価格データ
                                             timeperiod=period,          # データ取得期間
                                             nbdevup=bbup,               # upper-band:標準偏差 
                                             nbdevdn=bbdwn,              # down-band:標準偏差
                                             matype=ma_type)             # 移動平均の種類(0:単純移動平均)

    # 買いサインの検出
    # ビットコイン価格 < -2σを満たす時とする
    if btc_price_list[len(btc_price_list)-1] < bb_down[len(bb_down)-1]:
        result = "購入サイン検知"
    else:
        result = "チャート分析中"

    print(result)
    return result

# 売却条件
def bb_band_sell(btc_price_list,buy_btc_price):

    # ボリンジャーバンド引数情報
    period  = 20  # データ取得期間
    bbup    = 2   # upper-band:標準偏差
    bbdwn   = 2   # down-band:標準偏差
    ma_type = 0   # 移動平均の種類(0:単純移動平均)
    
    # ボリンジャーバンド指標獲得
    bb_up, bb_middle, bb_down = talib.BBANDS(pd.Series(btc_price_list),  # 価格データ
                                             timeperiod=period,          # データ取得期間
                                             nbdevup=bbup,               # upper-band:標準偏差 
                                             nbdevdn=bbdwn,              # down-band:標準偏差
                                             matype=ma_type)             # 移動平均の種類(0:単純移動平均)

    # ビットコイン価格 < 2σを満たす時とする
    if btc_price_list[len(btc_price_list)-1] > bb_up[len(bb_down)-1]:
        result = "売却サイン検知"
    
    elif buy_btc_price * loss_line > btc_price_list[len(btc_price_list)-1]:
        result = "売却サイン検知"
        print('損切')
    else:
        result = "チャート分析中"

    print(result)
    return result

#初期の処理
balance_check = check_jpy()
if balance_check =="ビットコイン購入不可":
    print ("ビットコイン購入不可")
    #quit()

btc_price_list_df  = get_ini_price(ticker='BTC/USDT', timeframe='1m',minute = 20)
btc_price_list = btc_price_list_df['Close']
trigger = bb_band_buy(btc_price_list)
if trigger ==  "購入サイン検知":
    print("購入")
    order('buy',amount)
    buy_btc_price = binance.fetch_ticker(symbol="BTC/USDT")["ask"]
    jpy_buy_btc_price = bb.fetch_ticker(symbol="BTC/JPY")["ask"]
    print('購入価格',jpy_buy_btc_price)

    
#2回目以降の処理(購入)
while trigger ==  "チャート分析中":
    time.sleep(sleep_time)
    new_btc_price_list_df = get_new_price(ticker='BTC/USDT', timeframe='1m',minute = 1)
    btc_price_list_df.loc[new_btc_price_list_df['Time']] = new_btc_price_list_df
    btc_price_list = btc_price_list_df['Close']
    trigger = bb_band_buy(btc_price_list)
    if trigger ==  "購入サイン検知":
        print("購入")
        order('buy',amount)
        buy_btc_price = binance.fetch_ticker(symbol="BTC/USDT")["ask"]
        jpy_buy_btc_price = bb.fetch_ticker(symbol="BTC/JPY")["ask"]
        print('購入価格',jpy_buy_btc_price)
    btc_price_list_df.loc[new_btc_price_list_df['Time']] = new_btc_price_list_df

trigger =  "チャート分析中"

#2回目以降の処理(売却)
while trigger ==  "チャート分析中":
    time.sleep(sleep_time)
    new_btc_price_list_df = get_new_price(ticker='BTC/USDT', timeframe='1m',minute = 1)
    btc_price_list_df.loc[new_btc_price_list_df['Time']] = new_btc_price_list_df
    btc_price_list = btc_price_list_df['Close']
    trigger = bb_band_sell(btc_price_list,buy_btc_price)
    if trigger ==  "売却サイン検知":
        print("売却")
        order('sell',amount)
        sell_btc_price = binance.fetch_ticker(symbol="BTC/USDT")["ask"]
        jpy_sell_btc_price = bb.fetch_ticker(symbol="BTC/JPY")["ask"]
        print('売却価格',jpy_sell_btc_price)
    btc_price_list_df.loc[new_btc_price_list_df['Time']] = new_btc_price_list_df

#print(btc_price_list_df)
print("FIN")

ビットコイン自動取引ツールの運用結果

試しに、少額(0.0001btc)でテストしました。

結果以下です。

結果

  • 0.5円の損失

内訳

  • 利益:0.2441円
  • 手数料:0.7494円

生データは以下です。

3120474円でビットコインを0.0001btc購入し、3122915円で全額売却。

月見
月見
  • 取引自体は、プラスなんだけど、手数料でマイナス・・・。
  • プラスの収益にできなかったことから、まだまだ改善点はある
  • 今回、成行での購入のため、「テイカー」手数料になっているのが、マイナス点
  • うまくアルゴを組み、「メイカー」取引になるように調整するのが良いかも

まとめ

bitbankでビットコイン自動取引ツールの作成方法について解説しました。

Pythonでcctxというライブライを使う方法が様々な取引所に対応できてオススメです。

今回の記事は、以上です。

最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました