仮想通貨の自動売買ツール作ってみたいけど何から書いたらいいかわからなくなっていませんか?
この記事ではPythonで作成した仮想通貨の自動売買ツールのプログラムを公開し解説しています。
仮想通貨の自動売買ツール サンプルコードを公開【コピペ可】
自動売買ツールをPythonで作成したサンプルコードを公開します。
このコードをコピペして、口座開設とAPIキーを入力して動かせば今すぐにでも、ビットコインと日本円を使用した自動売買が可能です。(口座とAPIキーが無いと何もできません)
ビットバンクのAPIを使用しているので、サンプルコードを動かすにはビットバンクの口座を開設が必要です。
ビットバンクのサイトへ → 仮想通貨ならビットバンク
パラメータ(設定項目)やその他の要因によって大きく損益が変わってきます。そのため、このコードを使用して損失が発生をしても責任は負いません。
この記事で自動売買ツールを運用するまでの7ステップをまとめてあります。
仮想通貨の自動売買ツール サンプルコード全文
import python_bitbankcc
import datetime
import math
import time
#初期設定部分----------------------------------------------------
#トレード対象
trade_target = 'btc_jpy'
#トレード設定
short_range = 5 #短期移動平均線の期間
long_range = 10 #長期移動平均線の期間
#API情報
api_Key = 'あなたのAPI情報'
api_Secret = 'あなたのAPI情報'
#売買ポジション
buysell_position = "buy"
#-----------------------------------------------------------------
#パブリックapi インスタンス生成
pub = python_bitbankcc.public()
#プライベートapi インスタンス生成
prv = python_bitbankcc.private(api_Key,api_Secret)
#単純移動平均線の計算式 datalist = 元データのリスト periods = 設定期間
def smaCalculation(datalist,periods):
smaData = [] #計算結果格納用List
sum = 0 #足し算結果の格納用変数
for i in range(len(datalist)-periods + 1):
for j in range(periods):
sum = datalist[i+j] + sum
smaData.append(sum / periods)
sum = 0
return smaData
#トレードの処理 ここから-------------------------------------------------------------
while True:
#資産情報の取得------------------------------------------------------------------
asset_data = prv.get_asset()
asset_data = asset_data["assets"]
#日本円の資産額を取得
jpy_asset = float(asset_data[0]['free_amount'])
#ビットコインの資産額を取得
btc_asset = float(asset_data[1]['free_amount'])
#-------------------------------------------------------------------------------
#取引所から値動きデータを取得し単純移動平均線を算出--------------------------------
#現在の日時を取得
dt_today = datetime.datetime.now()
#現在の日時が9:00よりも前だったら前日の日付を使用(ビットバンクは9:00で日付変更される)
if dt_today.strftime('%H%M') < '0900':
dt_today = dt_today - datetime.timedelta(days=1)
#上記で設定した日付の前日を設定(2日分のデータを取得するため)
dt_yesterday = dt_today - datetime.timedelta(days=1)
dt_today = dt_today.strftime('%Y%m%d')
dt_yesterday = dt_yesterday.strftime('%Y%m%d')
#取引所から2日分のデータを取得し、必要データを抽出後、結合
candledata = pub.get_candlestick(trade_target,'1hour',dt_today)
candledata = candledata["candlestick"][0]
candledata = candledata["ohlcv"]
candledata_yesterday = pub.get_candlestick(trade_target,'1hour',dt_yesterday)
candledata_yesterday = candledata_yesterday["candlestick"][0]
candledata_yesterday = candledata_yesterday["ohlcv"]
candledata = candledata_yesterday + candledata
#終値データのみ取り出し
last_priceList = []
for j in range(len(candledata)):
last_priceList.append(int(candledata[j][3]))
#移動平均線作成に必要なデータの取り出し
dataList = []
for i in range(long_range):
dataList.append(last_priceList[len(last_priceList) - long_range + i])
#単純移動平均線データの格納用リスト
short_smaData = []
long_smaData = []
short_smaData.append(smaCalculation(dataList,short_range))
long_smaData.append(smaCalculation(dataList,long_range))
short_lastDataNo = [len(v)-1 for v in short_smaData]
long_lastDataNo = [len(v)-1 for v in long_smaData]
#現在の取引価格を取得
now_tradePrice = pub.get_ticker(trade_target)
now_tradePrice = now_tradePrice["last"]
#---------------------------------------------------------------------------------
#短期移動平均線データから売買タイミングを判断する-----------------------------------
#短期移動平均線が長期移動平均線を上回ったら買い注文
if (short_smaData[0][short_lastDataNo[0]] > long_smaData[0][long_lastDataNo[0]] and buysell_position == "buy"):
#買う数量を計算
order_vol = jpy_asset / float(now_tradePrice)
order_vol = math.floor(order_vol * 10000) / 10000
#買い注文を実施
prv.order(trade_target,str(now_tradePrice),str(order_vol),'buy','limit')
#売買ポジションを売りに変更
buysell_position = 'sell'
print("買い注文を実施しました")
#短期移動平均線が長期移動平均線を下回ったら売り注文
elif (short_smaData[0][short_lastDataNo[0]] < long_smaData[0][long_lastDataNo[0]] and buysell_position == "sell"):
#売る数量を計算
order_vol = btc_asset
order_vol = math.floor(order_vol * 10000) / 10000
#売り注文を実施
prv.order(trade_target,str(now_tradePrice),str(order_vol),'sell','limit')
#売買ポジションを買いに変更
buysell_position = 'buy'
print("売り注文を実施しました")
else:
pass
#-------------------------------------------------------------------------------
#約定待ち
while len(prv.get_active_orders('btc_jpy')) == 0:
print("約定待ちです")
time.sleep(5)
#一定時間待つ
time.sleep(3600)
1時間ごとに取引所へ価格データを取りに行って、期間の異なる移動平均線を2本作成しクロスの発生を判断します。ゴールデンクロスで購入、デットクロスで売却です。
・投資額は口座にある資産を全て投入するようになっています。
・稼働開始時に、短期移動平均線が長期移動平均線を上回っていた場合には、すぐに買い発注します。
・期間設定は23時間以内でないと、プログラム起動日時よってはエラーが出ます。
2022.09.21 現在の取引価格を取得する部分で処理が抜けていましたので追記しました。
こちらの記事ではChatGPTを使用して自動売買ツールのPythonプログラムを作成させています。
自動売買ツールのサンプルコードを解説
上記のサンプルコードについて、詳しく解説していきます。
初期設定部分
仮想通貨の自動売買に必要な設定項目です。
#初期設定部分----------------------------------------------------
#トレード対象
trade_target = 'btc_jpy'
#トレード設定
short_range = 5 #短期移動平均線の期間
long_range = 10 #長期移動平均線の期間
#API情報
api_Key = 'あなたのAPI情報'
api_Secret = 'あなたのAPI情報'
#売買ポジション
buysell_position = "buy"
#-----------------------------------------------------------------
- トレード対象(trade_target)
- 短期移動平均線の期間(short_range)
- 長期移動平均線の期間(long_range)
- APIキー情報(api_key , api_Secret)
- 売買ポジション(buysell_position)
- トレード対象
-
売買を行う銘柄を選択します。
このサンプルコードでは、ビットコインと日本円をトレードする設定となっています。
銘柄の指定方法はビットバンクAPIの仕様にある方法と同じですので、そちらを参照してください。
※日本円との取引でない、仮想通貨同士のトレードだとエラーが出るかもしれません。
bitbank-api-docs/README_JP.md at master · bitbankinc/bitbank-api-docs Official Documentation for the bitbank.cc APIs and Streams – bitbankinc/bitbank-api-docs - 短期移動平均線の期間
-
短期移動平均線を計算するための期間を設定する項目です。
平均する期間を調整するため、数字が小さいほど直近の値動きに反応をします。
ゴールデンクロス・デットクロスで売買タイミングを計るため、長期移動平均線よりも小さい値にすることが必要になります。
- 長期移動平均線の期間
-
長期移動平均線を計算するための期間を設定する項目です。
短期移動平均線と同じく、数字を小さくするほど直近の値動きに反応するようになりますが、こちらは短期移動平均線よりも大きな数字の必要があります。
- APIキー情報
-
取引所(ビットバンク)の個人データへアクセスするためのAPIキーを設定します。ビットバンクでAPIキーの発行を行うと、2種類のコードが発行されるので入力します。
- 売買ポジション
-
トレード開始時に、自分が売り側なのか買い側なのかを設定しておく項目です。
ビットコイン等を持っている状態からスタートする場合には、「buy」の部分を「sell」と打ち直してからトレードを開始します。
インスタンスの生成
#パブリックapi インスタンス生成
pub = python_bitbankcc.public()
#プライベートapi インスタンス生成
prv = python_bitbankcc.private(api_Key,api_Secret)
ビットバンクAPIを使用するために、インスタンスをローソク足データなどのパブリックデータへのアクセス用と、資産データなどのプライベートデータへのアクセス用の2つを作成します。
このインスタンス作成時に初期設定部分で入力をした、API情報が使用されます。
APIについてはこちらの記事で解説しています。
単純移動平均線の関数
#単純移動平均線の計算式 datalist = 元データのリスト periods = 設定期間
def smaCalculation(datalist,periods):
smaData = [] #計算結果格納用List
sum = 0 #足し算結果の格納用変数
for i in range(len(datalist)-periods + 1):
for j in range(periods):
sum = datalist[i+j] + sum
smaData.append(sum / periods)
sum = 0
return smaData
取引所から取得した仮想通貨の値動きデータから、単純移動平均線を作成するための処理をまとめた関数です。まだこの時点ではデータ取得を行っていませんので、定義をするだけの部分となります。
以下の記事で、この単純移動平均線を含めた全3種類の移動平均線の計算方法と、サンプルコードを公開していますのでそちらも参照ください。
仮想通貨の値動きデータを取得し、必要なデータを一次格納
#取引所から値動きデータを取得し単純移動平均線を算出--------------------------------
#現在の日時を取得
dt_today = datetime.datetime.now()
#現在の日時が9:00よりも前だったら前日の日付を使用(ビットバンクは9:00で日付変更される)
if dt_today.strftime('%H%M') < '0900':
dt_today = dt_today - datetime.timedelta(days=1)
#上記で設定した日付の前日を設定(2日分のデータを取得するため)
dt_yesterday = dt_today - datetime.timedelta(days=1)
dt_today = dt_today.strftime('%Y%m%d')
dt_yesterday = dt_yesterday.strftime('%Y%m%d')
#取引所から2日分のデータを取得し、必要データを抽出後、結合
candledata = pub.get_candlestick(trade_target,'1min',dt_today)
candledata = candledata["candlestick"][0]
candledata = candledata["ohlcv"]
candledata_yesterday = pub.get_candlestick(trade_target,'1min',dt_yesterday)
candledata_yesterday = candledata_yesterday["candlestick"][0]
candledata_yesterday = candledata_yesterday["ohlcv"]
candledata = candledata_yesterday + candledata
#終値データのみ取り出し
last_priceList = []
for j in range(len(candledata)):
last_priceList.append(int(candledata[j][3]))
#移動平均線作成に必要なデータの取り出し
dataList = []
for i in range(long_range):
dataList.append(last_priceList[len(last_priceList) - long_range + i])
取引データの加工が必要なので長くなっていますが、分割して解説していきます。
- データ取得用の日付を設定
-
#現在の日時を取得 dt_today = datetime.datetime.now() #現在の日時が9:00よりも前だったら前日の日付を使用(ビットバンクは9:00で日付変更される) if dt_today.strftime('%H%M') < '0900': dt_today = dt_today - datetime.timedelta(days=1) #上記で設定した日付の前日を設定(2日分のデータを取得するため) dt_yesterday = dt_today - datetime.timedelta(days=1) dt_today = dt_today.strftime('%Y%m%d') dt_yesterday = dt_yesterday.strftime('%Y%m%d')
ビットバンクからローソク足データを取得するには日付の指定が必要となるため、現在の日時の取得を行い変数へ格納します。
ビットバンクのAPIに指定する日時は、9:00で日付が変わるため、例えば9月1日の8:00にデータ取得を行う場合には8月31日の8:00と指定する必要があります。そのための処理が中央のif文です。
2日分の日付を設定している理由は、もし9:00にデータ取得を行った場合、当日のデータが1つしか取得できず単純移動平均線の作成が不可能となるためです。
- 取引所から2日分のデータを取得し、必要データの抽出と結合
-
#取引所から2日分のデータを取得し、必要データを抽出後、結合 candledata = pub.get_candlestick(trade_target,'1min',dt_today) candledata = candledata["candlestick"][0] candledata = candledata["ohlcv"] candledata_yesterday = pub.get_candlestick(trade_target,'1min',dt_yesterday) candledata_yesterday = candledata_yesterday["candlestick"][0] candledata_yesterday = candledata_yesterday["ohlcv"] candledata = candledata_yesterday + candledata
APIを使用して2日分のローソク足データを取得します。
まず、当日分のローソク足データを取得し始値・終値等が書かれたデータのみを抽出した後、前日分のローソク足データも取得し同じくデータの抽出を行います。
この時点ではデータが当日分と前日分に分かれているため、データを結合して2日分のローソク足データを1つにして格納します。
ローソク足データから終値データの抽出、必要分のデータを抜き出し
#終値データのみ取り出し
last_priceList = []
for j in range(len(candledata)):
last_priceList.append(int(candledata[j][3]))
#移動平均線作成に必要なデータの取り出し
dataList = []
for i in range(long_range):
dataList.append(last_priceList[len(last_priceList) - long_range + i])
2日分のローソク足データから、単純移動平均線を作成するために終値データを抽出します。終値だけではなく始値などに変更することも可能ですが、ここでは終値を使用します。
まず、for文で2日分のローソク足データから終値を取得後リストに格納します。次に長期単純移動平均線の期間分のデータがあれば十分なため、for文で長期移動平均線の期間分のデータのみを取り出します。
その際には最新のデータから取得しなければいけないため、全てのローソク足データを格納したリストの後ろから必要な期間分だけ抜き取ります。
単純移動平均線の作成
#単純移動平均線データの格納用リスト
short_smaData = []
long_smaData = []
short_smaData.append(smaCalculation(dataList,short_range))
long_smaData.append(smaCalculation(dataList,long_range))
short_lastDataNo = [len(v)-1 for v in short_smaData]
long_lastDataNo = [len(v)-1 for v in long_smaData]
単純移動平均線の短期・長期それぞれを格納するためのリストを作成し、上記にある単純移動平均線の関数を呼び出して計算を行わせます。
売買タイミングの判断基準となる値は単純移動平均線の最後の値なので、リスト長さをリストから割り出します。
売買タイミングの判定と注文実施
#短期移動平均線データから売買タイミングを判断する-----------------------------------
#短期移動平均線が長期移動平均線を上回ったら買い注文
if (short_smaData[0][short_lastDataNo[0]] > long_smaData[0][long_lastDataNo[0]] and buysell_position == "buy"):
#買う数量を計算
order_vol = jpy_asset / float(now_tradePrice)
order_vol = math.floor(order_vol * 10000) / 10000
#買い注文を実施
prv.order(trade_target,str(now_tradePrice),str(order_vol),'buy','limit')
#売買ポジションを売りに変更
buysell_position = 'sell'
print("買い注文を実施しました")
#短期移動平均線が長期移動平均線を下回ったら売り注文
elif (short_smaData[0][short_lastDataNo[0]] < long_smaData[0][long_lastDataNo[0]] and buysell_position == "sell"):
#売る数量を計算
order_vol = btc_asset
order_vol = math.floor(order_vol * 10000) / 10000
#売り注文を実施
prv.order(trade_target,str(now_tradePrice),str(order_vol),'sell','limit')
#売買ポジションを買いに変更
buysell_position = 'buy'
print("売り注文を実施しました")
else:
pass
#-------------------------------------------------------------------------------
作成した短期単純移動平均線と長期移動平均線のクロスをif文で判断し、仮想通貨の売買を実施します。
and条件で売買ポジションも条件に入れることで、重複して買い注文・売り注文を行わないようにしています。
- 売買数量の計算
-
現在持っている日本円を、現在のビットコイン価格で割ることでビットコインの購入数量を計算しています。
ビットバンクでは小数点以下4位までしか注文は受け付けていないので、それ以下の桁数は切り捨てを行っています。
- 売買注文を実施
-
買い注文をAPIを使用して実施します。対象通貨・価格・数量・買い注文指定(buy)・指値注文指定(limit)を渡して行います。戻り値も受け取ることができますが、このコードでは受け取っていません。
ここでpost_onryという、マイナス手数料を確実に受け取れる指定もできますが、ここでは行っていません。
- 売買ポジションを設定
-
買い注文を行った場合は次は売り注文のため売買ポジションを「売り」に、売り注文を行った場合には次は買い注文のため売買ポジションを「買い」に設定します。
実際に注文テストは行うことができなかったので注文動作は未確認です。
約定待ちと次のデータ取得まで待機
#約定待ち
while len(prv.get_active_orders('btc_jpy')) == 0:
print("約定待ちです")
time.sleep(5)
#一定時間待つ
time.sleep(3600)
約定待ち中に重複して注文を実施してしまわないように、約定するまでの間はループするようになっています。5秒間隔で注文が残っていないかを確認し、注文が無くなった(全て約定した)状態になったところでループを抜け出します。
その後、1時間(3600秒)を待機します。正確にはここで1時間待つと「今までのデータ処理時間 + 約定待ち時間 + ここでの1時間待機」となり、次のデータ取得まで1時間よりも多く待ってしまいます。
もっと正確に1時間ごとのデータ取得を行う方法もあるのですが、このコードではシンプルさを優先しました。
仮想通貨の自動売買ツール サンプルまとめ
コード全文をコピーして動かせばすぐにでも、仮想通貨の自動売買が開始できますが、最適な期間設定を見つけないと稼げません。
このコードをベースにして、自分なりのトレードルールを追加したり、独自の処理を追加して良いセッティングを探してみてください。