【python/bitFlyer】目指せ仮想通貨自動売買システム開発!テクニカル分析1 – 移動平均線

python

このシリーズではbitFlyer Lightning APIを使用することで、常に情報収集/テクニカル分析し、 ここだと思えるタイミングで自動売買を行えるシステム開発を目指します。

今回は収集したTickerを使ってグラフ表示および単純移動平均、指数移動平均を求めてみたいと思います。

-- 実行環境 --
Windows 10 64ビット版(1903)、python 3.7.4

-免責事項-
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねます。当サイトの情報を利用する場合には、自己責任でご利用下さい。

API制限
HTTP API は、以下のとおり呼出回数を制限いたします。
Private API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。同一 IP アドレスからの API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。

0.1 以下の数量の注文は、すべての板の合計で 1 分間で 100 回を上限とします。上限に達するとその後 1 時間は 1 分間で 10 回まで注文を制限します。システムに負荷をかける目的で注文を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。

bitFlyer API API Documentation より抜粋

収集情報をグラフ表示してみる

まずは以前ローカルのSQL Server に蓄積したデータをグラフ表示したいと思います。1分毎にTickerを保存している環境を想定です。ターゲットは直近2日(2880レコード)、Y軸はLTPとしています。

import pyodbc
import matplotlib.pyplot as plt

# DB接続
con = pyodbc.connect( 'DRIVER={SQL Server};SERVER=localhost\AutoTrading;DATABASE=bitFlyer_DB')
cur = con.cursor()

# データ取得(直近2880レコードを対象)
cur.execute( "SELECT timestamp, ltp FROM (SELECT TOP(2880) timestamp, ltp FROM TB_Ticker ORDER BY timestamp DESC) as TMP_TBL ORDER BY timestamp")
data = cur.fetchall()
con.close()

x = []
y = []
dcnt = 0

for r in data:
	x.append( dcnt)
	y.append( r[1])	
	dcnt = dcnt + 1

# 描画
plt.title( "LTP - 2 days")
plt.plot( x , y )
plt.show()
なこ
なこ

ちゃんと収集されてますね!

なこ
なこ

って2日間で3万円ぐらい上下してますね。

ヒロ
ヒロ

そうだな。情報収集しつつ、テクニカル分析で底で拾って、上で捌けるようになるのが目標だね。

移動平均の取得

移動平均の場合はゴールデンクロス/デッドクロスの判定が基本でしょうか。

単純移動平均/Simple Moving Average

import pyodbc
import matplotlib.pyplot as plt
import pandas as pd

# DB接続
con = pyodbc.connect( 'DRIVER={SQL Server};SERVER=localhost\AutoTrading;DATABASE=bitFlyer_DB')
cur = con.cursor()

# データ取得(直近2880レコードを対象)
cur.execute( "SELECT timestamp, ltp FROM (SELECT TOP(2880) timestamp, ltp FROM TB_Ticker ORDER BY timestamp DESC) as TMP_TBL ORDER BY timestamp")
data = cur.fetchall()
con.close()

ltp = []
for r in data:
	ltp.append( r[1])

# 単純移動平均算出
sma060 = list( pd.Series( ltp).rolling(60).mean())
sma360 = list( pd.Series( ltp).rolling(360).mean())

# グラフ表示
df = pd.DataFrame( dict( ltp=ltp, sma060=sma060, sma360=sma360))
plt.show( df.plot())

指数移動平均/Exponential Moving Average

import pyodbc
import matplotlib.pyplot as plt
import pandas as pd

# DB接続
con = pyodbc.connect( 'DRIVER={SQL Server};SERVER=localhost\AutoTrading;DATABASE=bitFlyer_DB')
cur = con.cursor()

# データ取得(直近2880レコードを対象)
cur.execute( "SELECT timestamp, ltp FROM (SELECT TOP(2880) timestamp, ltp FROM TB_Ticker ORDER BY timestamp DESC) as TMP_TBL ORDER BY timestamp")
data = cur.fetchall()
con.close()

ltp = []
for r in data:
	ltp.append( r[1])

# 指数移動平均算出
sma060 = list( pd.Series( ltp).ewm(60).mean())
sma360 = list( pd.Series( ltp).ewm(360).mean())

# グラフ表示
df = pd.DataFrame( dict( ltp=ltp, sma060=sma060, sma360=sma360))
plt.show( df.plot())
なこ
なこ

ltpやsma060、sma360 に格納された値や移動平均の結果を使って購入判定すればいいんですよね? 出来そうな気がしてきました!

ヒロ
ヒロ

その通りなんだけど実はそんなに単純じゃないんだ。どの線のクロスを見るのかとか、いくつのデータで平均とるかとか当たり前のパラメーターはもちろんなんだけど、それ以外にもヨコヨコで頻繁にクロスを繰り返す場合の処理とか、ちゃんと組んでみると悩むことは結構多いんだ。

なこ
なこ

確かに頻繁にクロスするケースなんてよくありそうですね。今回のグラフでも中央付近ではクロス繰り返してますし。どうすればいいんですか?

ヒロ
ヒロ

例えばだけど別のテクニカル分析の結果を出してANDで購入/売却するとか、自分の中で必勝パターンだけ売買するような組み方は出来るかなとは思う。色々試してみて、自分なりの売買条件を見つけていくといいんじゃないかな。

まとめ

今回は収集した情報から移動平均を出してみました。移動平均は分かりやすいですが、これだけでは仕組み上どうしても急騰/急落に対応しきれなかったり、頻繁にクロスを繰り返すときの処理を考えないといけないというデメリットもあります。
他のテクニカル分析や自身の経験などをプラスαしてパラメーター決定や売買判定につなげるか検討が必要ではないでしょうか。

最後まで閲覧頂きありがとうございました。では

コメント

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