Pythonで自動売買Botを作る④~テクニカル指標を用いた自動売買botを作り方

 

 

 

これまで「Bitbank(ビットバンク)の提供しているAPI機能を使って価格データの取得と口座残高の確認・注文処理を行ってきました。というわけで今回はいよいよ満を持してこの2つ記事でやったことを組み合わせて簡単な自動売買Botを作ってみます。

この記事で作るのはあくまで簡単なテクニカル指標に従って自動で売買するプログラムなので儲かるとかそういうことは考えずあくまで動かすことを目的としています。コードが動くと楽しいですし達成感がありますのでプログラミングのモチベ向上になると思います。

自動売買のトレードシグナルを作る

これまでの記事ではBitbank(ビットバンク)の提供しているAPI機能を使って価格データの取得と口座残高の確認・注文処理を行ってきましたが、最初の記事の「Pythonで自動売買Botを作る①~システムトレードの流れを把握する」でも説明したように、自動売買botを作る上においてはプログラムから売買注文を出す処理の他に自動で売買を行う判断に使う「トレードシグナル」を作る必要があります。

このトレードシグナルを何にするかは人によって変わってきます。基本的には過去の価格データをもとに売買シュミレーション(バックテスト)を行ってその中でリターンが高かったトレードシグナルを採用するというのが一般的です。

本来ならばバックテストをしてリターンが出せているかを確認したりしますが、今回はとりあえず簡単なものを作るだけなので、有名なテクニカル指標である移動平均線を使います。

移動平均線とは何か?

まず移動平均についてざっと説明すると、移動平均線とは、ある一定期間の価格から平均値を計算し、その数値を線で表したものです。その日を含めた過去何日間(または何週間)かの価格を毎日計算するため、平均値が移動していくことから、移動平均と呼ばれます。

例えば[100・110・120・130・140・150・160]という値動きをしている金融商品があったとするならば、その5日移動平均はまず4日目まではデータが足りないので算出不可能ですが、5日目の移動平均は(100+110+120+130+140)÷5=120、6日目の移動平均は(110+120+130+140+150)÷5=130、7日目の移動平均は(120+130+140+150+160)÷5=140、という風な計算になります。

このように計算期間がローリングして移動していくので、移動平均と言われています。そして、この移動平均は代表的なテクニカル指標のひとつで、価格の傾向(トレンド)など、相場の方向性を図る意味合いでよく使われます。YahooFinanceとかにもチャート画面にも移動平均線はデフォルトで乗っていたり、移動平均はテクニカルの王道中の王道なので投資・トレードに興味のある人は頭の隅にとどめておきましょう。

他にも移動平均の考え方はMACDなど、他のテクニカルチャートにも応用して利用されています。株式投資やFXを少しでもやったことのある人ならわかると思いますが、ようはチャートに画面に引いてあるこんな線のことですね。

引用元:https://www.jibunbank.co.jp/products/foreign_deposit/chart/help/sma/

移動平均線の使い方

そして、基本的な移動平均線の使い方としては、任意の2つの期間で計算した長期移動平均線と短期移動平均線が交差する「ゴールデンクロス」「デッドクロス」がトレードシグナルです。

まず「ゴールデンクロス」とは短期移動平均線が長期移動平均線を上に突き上げる形で交差することを指し、直近の価格が上向きだということで上がる可能性が高い=買い、反対に「デッドクロス」とは短期移動平均線が長期移動平均線を下に突き抜ける形で交差することを指し、直近の価格が下向きだということで下がる可能性が高い=売りという感じになります。

引用元:https://www.jibunbank.co.jp/products/foreign_deposit/chart/help/sma/

まあ「ゴールデンクロス=買い、デッドクロス=売り」という感じで覚えていれば問題ありません。このゴールデンクロスとデッドクロスを構成する長期と短期の2つの移動平均線の計算期間は人によってそれぞれですが、一般的に「5日・25日」とか「25日・75日」とかいう組み合わせがよく見かけますね。

pythonで移動平均線を計算する

というわけで移動平均の計算方法と使い方についてざっと説明したので次は実際にPythonで移動平均線計算していきます。移動平均の計算方法は簡単なので、自分でfor文で計算するのも全然アリですが、Pythonだと「Pandas」というライブラリを使えば、簡単に計算できます。

このPandasは基本的にエクセルのような表計算をpythonに実装するためのライブラリですが、拡張機能が豊富で、今回みたく移動平均線が計算出来たり日経平均株価やダウ工業平均の価格データも関数1つで入手できるので非常に便利なライブラリです。pythonを使いこなすあたっては絶対に使えるようにしておきたいライブラリです。

Pandasはpythonの拡張ツールである「Anaconda」をインストールしていればデフォルトでインストールされているので、pipでわざわざインストールうる必要はなく、importするだけで使用できます。

加えてPythonの拡張ソフトウェアである「Anaconda」もPythonでプログラミングするにあたって非常に便利なソフトなので絶対にインストールしておいたほうが良いです。

そして、今回移動平均を計算のもとになるビットコインの価格データですが、tickerをちまちま集めていると時間が掛かるので、今日はとりあえず仮想通貨の価格サイトからビットコインの価格データを引っ張ってきます。

ちなみにトレードシグナルの計算のもとになるビットコインを始めとする仮想通貨の価格データの集め方は①「取引所が配信しているtickerを一定時間ごとに取得する」②「仮想通貨の価格データを集めているサイトから引っ張ってくる」という2つの方法がありますが、基本的には②でいいと思います。

そして、今回使うビットコインの価格データは「Coingecko」という仮想通貨の価格サイトから取得します。他にもビットコインの価格データは「CryptoWatch」という仮想通貨価格サイトからも取得できます。

という訳で上の記事で紹介した自作の関数を使ってビットコインの価格データの取得&前処理を行い、そのデータから移動平均線を計算していきます。

#######ビットコインの価格データを取得する#####

##ライブラリーのインストール
import pandas as pd
import time
import matplotlib.pyplot as plt
import datetime
import requests
import json
import numpy as np
%matplotlib inline


#自作関数の定義
def get_bitcoinprice(kasou):
url=('https://api.coingecko.com/api/v3/coins/')+str(kasou)+('/market_chart?vs_currency=jpy&days=1')
r=requests.get(url)
r=json.loads(r.text)
bitcoin=r['prices']

data=[]
date=[]
for i in bitcoin:
data.append(i[1])
date.append(i[0])
bitcoin=pd.DataFrame({"date":date,"price":data})
price=bitcoin['price']
a=price.pct_change()
bitcoin=pd.DataFrame({"date":date,"price":data,"change":a})
return bitcoin

#関数を使ってビットコインの価格データを取得する
a=get_bitcoinprice('bitcoin')
price = pd.Series(a['price'])

#データの確認
print(price.head())

これは直近1日分のビットコインの5分足価格データを取得する関数なので、数値は実行した日によって返ってくる数値は変わってしまいますが、こういう感じの結果が返ってくると思います。あとブログに乗せるとPythonの字下げを反映されないので、コピペしてそのまま実行すると動きませんので、以下の画像みたく改行してください。

次はこのビットコインの5分足の価格データから移動平均線を計算します。Pythonでの移動平均の計算は「変数名.rolling(window=任意の数).mean()」で計算できます。

引数のwindowで計算する移動平均を計算する期間を指定できます。今回は5分足のデータから25分と75分の移動平均を計算したいので、window=5とwindow=15として、25分移動平均線と75分移動平均線を計算します。

#Pandasで移動平均線を計算する
SMA25=price.rolling(window=5).mean()
SMA75=price.rolling(window=15).mean()

これで移動平均が計算できました。一応確認のためビットコインの価格と移動平均線をプロットしてみます。

#ビットコインの価格と移動平均線(5日・25日)をプロットする
from pylab import rcParams
rcParams['figure.figsize'] = 15,5
plt.plot(price,label='bitcoin')
plt.plot(SMA25,label='EMA5')
plt.plot(SMA75,label='EMA25')
plt.legend()
plt.grid(which='both')

こういう感じのグラフがプロットできます。pythonは計算だけでなく、「Matplotlib」というライブラリを使うと様々なグラフをプロットすることもできるので、便利です。

こんな感じで価格データの取得とトレードシグナルとする長期と短期の2つの移動平均線の計算ができました。これとシリーズ3つ目の記事「Pythonで自動売買Botを作る③~プライベートAPIを使って仮想通貨を売買する」で説明したプライベートAPIを使った売買注文のプログラムでPythonでビットコインを自動売買するために必要な要素はすべて集まったので、次はこれらを組み合わせたPythonによるビットコインの自動売買botを作っていきます。

スポンサーリンク

Bitbank(ビットバンク)で使える自動売買botの作り方

というわけで、いよいよ本題の日本の仮想通貨取引所「Bitbank(ビットバンク)で使える移動平均線を使ったビットコインの自動売買botの作り方とコードの中身を解説していきます。

##ビットバンクのライブラリと自分のプライベートAPI鍵を設定する

import python_bitbankcc
import time

API_KEY='自分のAPI鍵'
API_SECRET='自分のAPISECRET'

##インスタンスを定義する
prv = python_bitbankcc.private(API_KEY, API_SECRET)
pub = python_bitbankcc.public()


##bitbank用ビットコインを売買する関数


#ビットコインを購入する
def order_buy():
order=prv.order(
'btc_jpy', # ペア
'buy_amount', # 価格
'0.001', # 注文枚数
'buy', # 注文サイド
'market' # 注文タイプ
)
return order

#ビットコインを売却する
def order_sell():
order=prv.order(
'btc_jpy', # ペア
'buy_amount', # 価格
'0.001', # 注文枚数
'sell', # 注文サイド
'market' # 注文タイプ
)
return order



##ライブラリーのインストール
import pandas as pd
import time
import matplotlib.pyplot as plt
import datetime
import requests
import json
import numpy as np
%matplotlib inline


#ビットコインの日足データを取得する関数の定義


def get_bitcoinprice(kasou):
    url=('https://api.coingecko.com/api/v3/coins/')+str(kasou)+('/market_chart?vs_currency=jpy&days=1')
    r=requests.get(url)
    r=json.loads(r.text)
    bitcoin=r['prices']
    data=[]
    date=[]
    for i in bitcoin:
        data.append(i[1])
        date.append(i[0])
        bitcoin=pd.DataFrame({"date":date,"price":data})
        price=bitcoin['price']
    a=price.pct_change()
    bitcoin=pd.DataFrame({"date":date,"price":data,"change":a})
    return bitcoin




##############BOT本体#################

flag=True

while True:

 #関数を使ってビットコインの価格データを取得する
 a=get_bitcoinprice('bitcoin')
 price = pd.Series(a['price'])


 #Pandasで移動平均線を計算する
 SMA25=price.rolling(window=5).mean()
 SMA75=price.rolling(window=15).mean()


 #ビットコイン価格と2つの移動平均線の最新数値の取得
 realprice=price[int(len(price)-1)]
 reala25=SMA25[int(len(price)-2)]
 realb25=SMA25[int(len(price)-1)]
 reala75=SMA75[int(len(price)-2)]
 realb75=SMA75[int(len(price)-1)]


 if flag==True:

    if reala25<reala75 and realb25>realb75:

     order_buy()
     flag=False
     d = datetime.datetime.today()
     print(d.strftime("%Y-%m-%d %H:%M:%S"),'buyBTC')

    else:
     d = datetime.datetime.today()
     print(d.strftime("%Y-%m-%d %H:%M:%S"),'no trade')


 if flag==False:
     order_sell()
     flag=True
     d = datetime.datetime.today()
     print(d.strftime("%Y-%m-%d %H:%M:%S"),'sellBTC')

 time.sleep(300)


このコードだとビットコインの価格を取得する→シグナルに使っているテクニカル指標を計算する→条件を満たしている場合買い注文を入れる→一定時間がたったら売り注文を入れるという処理を5分おきに繰り返しています。

短期移動平均線が長期移動平均線を突き抜けるゴールデンクロスという現象をプログラミングの条件式にすると、「n-5分における 長期移動平均線の数値>短期移動平均線の数値」and「n分における 長期移動平均線の数値<短期移動平均線の数値」という風になります。

そして、ゴールデンクロスは価格が上がる可能性が高いサインなので、ゴールデンクロスが発生したらビットコインを購入して、一定時間(5分後)にビットコインを売却するという処理を行っています。

ちなみにデッドクロスが発生した場合は売るという処理を行いたい場合は、売りから入ることができる信用取引ができる環境である必要があります。残念ながらビットバンクは現物しかなく、信用取引で売りから入ることはできないので、売買機会が少なくなってしまいます。

2019年現在APIを使って信用取引ができる国内の取引所はビットフライヤーとリキッドの2つですが、ここの2つは取引所自体が怪しいので、あまり信用できないというのが難しいところです。

一応海外の取引所でBITMEXという取引所だとビットコインとドルで信用取引を行うことができますし、アルトコインのレバレッジ取引所も少ない手数料でできるので、今のところBITMEXが一番マシかもしれません.

仮想通貨取引所「Bitmex」でAPIを使った自動取引をする方法

終わり

以上がpythonでビットコインを自動売買するための知見です。今回はデモなので単純移動平均(SMA)と現物取引でしたが、株式やビットコインを自動売買するプログラムを組んで、システムトレードで本気で儲けようとする場合は、移動平均線ではなく、もっと有効性の高いトレード戦略を自分でバックテストなりで見つけたり、売りから入れる信用取引にするなどして、売買の条件処理をもう少し複雑にする必要があります。まあそれでも儲かるとは限りませんが・・・

また自動化した売買プログラムを常時実行させたい場合はレンタルサーバーと契約して、そこにプログラムのソースをおいてCronやWhile文で定期実行するのが一般的です。詳細は↓の記事で解説しています

ちなみにpythonで移動平均線以外のテクニカル指標を計算するにあたっては「ta-lib」というライブラリを使うと、MACD・RSI・ボリンジャーバンドなどメジャーなテクニカル指標は全部関数1つで計算することができるようになります。

とりあえずシステムトレード(自動売買)をプログラムで作る上で抑えておきたい流れとしては、①APIとかを使って板情報と価格を取得→②トレードシグナルを計算→③買いシグナルが出たら買い注文を出す→④売りシグナルがでたら売り注文を出す という感じですね。

これがBotを作るうえでの基本でここから色々アレンジをしていく形になります。そして、やはり本気でリターンを出そうと思うのであれば様々なトレード戦略やアービトラージやサーバーの高速化など色んな知識が必要になってきます。

まあそういったトレード戦略の話はPython3ではじめるシステムトレードに書いてあったので、もっと本気でシステムトレード(自動売買)に取り組んでみたいという方は是非読んでみてください。

しばらく忙しいので更新できるか分かりませんが、時間が出来ればもっと凝ったコードも作っていきたいと思います。

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. yuu より:

    >条件を満たしている場合買い注文を入れる→一定時間がたったら売り注文を入れるという処理を5分おきに繰り返しています。

    買い注文後すぐに売り注文を出すようなコードになっています。