テクノロジーであそぼ!

プログラミング(Python)や投資、仮想通貨についての情報サイト。

Zaifの自動トレードプログラム書いたら10%利益出たからそのプログラムを載せてみる

f:id:kichie_com:20171030092337p:plain

Python × ZaifAPI 取引時間をハックするプログラム【資産情報取得編】
Python × ZaifAPI 取引時間をハックするプログラム【取引編】
Python × ZaifAPI 取引時間をハックするプログラム【価格取得編】


以前の続きです。

前回までの三回を組み合わせて取引

以下のサイトを参考に、アレンジを加えてプログラムを書いてみました。
初心者が一攫千金を目指してBitcoin自動取引botを作るよ! その3【ローカルBot】

①前回の取引額を渡す(この金額が判断の基準となる)
②Bitcoinを持っていて(0.001以上)かつ0.25%値上がりした場合、売る!(そして、前回取引額を更新する)
③Bitcoinを持っていない(0.001以下)かつ0.1%値下がりした場合、買う!(そして、前回取引額を更新する)
④取引が処理されない場合、1分待って、待っても処理されない場合、キャンセルする(そして、前回取引額を元に戻す)
【参考】
・取引後のResponseの「order_id」が0でない(order_idが発行されている)場合、取引が保留となっている。
・売買タイミングとして、インベスターzの10%利食いと5%損切りの考え方を採用してみました。
また、今回は人ではなくプログラムで行うため、高速で取引ができるという利点があります。

それゆえに、かなり少ない値にすれば、良い結果が出るのではないかと考え、0.25%で利食い、0.1%で損切りという値を設定しました。

実装

参考サイトにのっとりまして、KEYとSECRETをjsonファイルとして管理をすることにします。
今回より、keyとsecretをjsonにして別ファイルで保管するように変えました。
[]・・・フォルダ
[zaif]
 |- zaif_trade.py
 |- [config] - zaifkeys.json
 |- ...<略>

import json
import time
from zaifapi import ZaifPublicApi
from zaifapi import ZaifTradeApi
from decimal import (Decimal)

zaif_keys_json = open('config/zaifkeys.json', 'r')
zaif_keys = json.load(zaif_keys_json)

KEY = zaif_keys["key"]
SECRET = zaif_keys["secret"]

if __name__=='__main__':
    # get environ ver
    zaif_public = ZaifPublicApi()
    zaif_trade = ZaifTradeApi(KEY,SECRET)
    
    CANCEL_FLUG = False
    
    Last_trade_price = int(zaif_public.last_price('btc_jpy')["last_price"])
    
    
    while(True):
        print("■ 現在の情報です")
        funds_btc = zaif_trade.get_info2()['funds']['btc']
        funds_jpy = zaif_trade.get_info2()['funds']['jpy']
        last_price = int(zaif_public.last_price('btc_jpy')["last_price"])
        print("市場取引価格:"+str(last_price))
        print("btc資産:"+str(funds_btc))
        print("jpy資産:"+str(funds_jpy))
        print("最終取引価格:"+str(Last_trade_price))
        
        
        #btcを持っていて0.25%値上がり
        if(funds_btc >= 0.001 and int(Last_trade_price*1.0025)< last_price):
            #売却
            bid_amount = Decimal(funds_btc).quantize(Decimal('0.0001'))
            trade_result = zaif_trade.trade(currency_pair="btc_jpy", action="ask", price=last_price, amount=bid_amount)
            print('■ Bitcoinの売却申請を行いました。')
            print(trade_result)
            print("売却注文価格:"+str(last_price))
            print("売却注文量 :"+str(bid_amount))
            Last_trade_price_pre = Last_trade_price
            Last_trade_price = last_price
            
            if(trade_result["order_id"] != 0):
                CANCEL_FLUG = True
                order_id = trade_result["order_id"]
            else:
                print("■ 取引が完了しました。")
        #btcを持っていて0.1%値下がり
        elif(funds_btc >= 0.001 and int(Last_trade_price*0.999) > last_price):
            #売却
            bid_amount = Decimal(funds_btc).quantize(Decimal('0.0001'))
            trade_result = zaif_trade.trade(currency_pair="btc_jpy", action="ask", price=last_price, amount=bid_amount)

            print('■ Bitcoinの売却申請を行いました。')
            print(trade_result)
            print("売却注文価格:"+str(last_price))
            print("売却注文量 :"+str(bid_amount))
            Last_trade_price_pre = Last_trade_price
            Last_trade_price = last_price
            
            if(trade_result["order_id"] != 0):
                CANCEL_FLUG = True
                order_id = trade_result["order_id"]
            else:
                print("■ 取引が完了しました。")
        #btcを持っていないでlastpriceより値下がりしたら買い
        elif(funds_btc < 0.001 and last_price < Last_trade_price):
            ask_amount = (Decimal(funds_jpy*0.5)/last_price).quantize(Decimal('0.0001'))
            trade_result = zaif_trade.trade(currency_pair="btc_jpy", action="bid", price=last_price, amount=ask_amount)
            print('■ Bitcoinの購入申請を行いました')
            print(trade_result)
            print("購入注文価格:"+str(last_price))
            print("購入注文量 :"+str(ask_amount))
            Last_trade_price_pre = Last_trade_price
            Last_trade_price = last_price
            
            if trade_result["order_id"] != 0:
                CANCEL_FLUG = True
                order_id = trade_result["order_id"]
            else:
                print('■ 取引が完了しました。')
            
            if CANCEL_FLUG:
                print('■ 60秒間待機します。')
                time.sleep(60)
                trade_info = zaif_trade.get_info2()
                if trade_info["open_orders"] > 0:
                    print("■ キャンセルしました")
                    print(zaif_trade.cancel_order(order_id=order_id))
                    Last_trade_price = Last_trade_price_pre
                else:
                    print("■ 取引が完了しました。")
        time.sleep(5)


main.pyと同じ階層にフォルダ「config」を作成し、下記jsonファイルに保存します。

{
    "key":"【zaifで作成したkey】",
    "secret":"【zaifで作成したsecret】"
}

実行結果

5日間約2時間ずつ動かしてみた結果

ノートパソコンで持ち歩くので、ずっと動かすことはしにくかったため、20秒ごとに1回動くようにして、合計4時間動かしてみました。

その結果!



JPY:10000 → JPY:11018.61967652


約10%増加した...!

あれ意外といいんじゃ!?

反省点と改善点

Bitcoinがこの数日間で60万円代から80万円代に乗ったこともあっていい感じに利益につながったのかも?
まだまだ謎のエラーが出るのと、zaifのサーバーが弱いのか、加熱時には「ZaifApiError: trade temporarily unavailable.」や「ZaifServerException: return status code is 502」(サーバが落ちている?)などのエラーが出る。


また、売りのタイミングは良いが、買いのタイミングがただ値段が下がったら買っているだけなので、MACDやRSIなどを利用して買いのタイミングを工夫すべきですね。


※このプログラムを利用して利益損害が出たとしても自己責任でお願い致します。

間違えや質問がございましたら気軽にコメントください!


====
キャンセルのプログラムが書いてなかったので追記しました。
コード

print("■ キャンセルしました")
print(zaif_trade.cancel_order(order_id=order_id)) #ここ
Last_trade_price = Last_trade_price_pre

Githubにコードを公開しました。

記事に乗っているコードとは
github/zaif-auto-trade

Next!

12/23 19:30公開予定
Python × ZaifAPI 取引時間をハックするプログラム【ボリンジャーバンド編】



読者登録をして待つ

もしくは、

Twitterをフォローして待つ

Excelをプログラムに任せて、空いてる時間でトレードする

仕事でExcelを使ってらっしゃる方はこちらもおすすめ
【Python x Excel】 めんどくさいExcel作業を自動化しよう!基本操作編 - テクノロジーであそぼ!