今回はbitFlyerから取得したローソク足(OHLCデータ)を1件ずつ判定処理してみます。※リクエスト先のAPIは別なので要注意
BOTなどを作る場合には自動取引を行う場合の売買指標の判定をしなければなりませんし、事前にバックテストも行う必要があります。そんな時はOHLCのデータを1件ずつ読み込みながら、売買指標が出ているかどうかを判定する必要があります。
今回は非常に簡単で、OHLCデータの内容を日時、始値、高値、安値、終値が分かる様に画面表示して、さらに陽線か陰線かを判定してみます。
ちなみに、bitFlyerからのローソク足情報はCryptowatch APIを使って取得します。結局Cryptowatchを使いますので、bitFlyer以外の取引所の情報を取得する手順も同じです。
■前提
以下の知識を前提としているので、抜けている箇所がある場合は事前のキャッチアップをしてくださいね。
・Pythonの基本文法が分かる
・Pythonのループ処理ができる
・Cryptowatch APIからbitFlyerのローソク足(OHLCデータ)の取得ができる
コンテンツ
Cryptowatchから取得したOHLCデータを1件ずつ判定処理する
では最初に処理の流れを確認しておきましょう。処理は以下の様になります。
1)Cryptowatch APIからbitFlyerのOHLCデータを取得
2)ループ処理でOHCLデータを1件ずつ読み込み
3)陽線 or 陰線 かを判定する
4)OHLCデータの内容を日本語で分かる様に変換する
5)OHLCの内容と判定結果を画面出力する
と、本当に簡単な内容になります。この処理はバックテストを行う時にとっても役に立ちますので、しっかりと身に付けておきましょう。
まずはOHLCの最初の1件のデータを取得する
まずはCryptowatch APIから取得したOHLCデータの最初の1件を取得しましょう。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import requests from datetime import datetime import pandas as pd def get_data(min, before=0, after=0): #パラメータ設定する params = {"periods" : min } if before != 0: params["before"] = before if after != 0: params["after"] = after response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc",params) data = response.json() return data min = 86400 after = 1519862400 #2018-03-01 before = 1527778799 #2018-05-31 out_data = get_data(min,before,after) Time_Data, Open_price, High_price, Low_price, Close_price = [],[],[],[],[] for ohlc in out_data["result"][str(min)]: Time_Data.append(datetime.fromtimestamp(ohlc[0])) Open_price.append(ohlc[1]) High_price.append(ohlc[2]) Low_price.append(ohlc[3]) Close_price.append(ohlc[4]) df = pd.DataFrame({'YYYY-MM-DD':Time_Data, 'open':Open_price, 'high':High_price, 'low':Low_price, 'close':Close_price}) print('日時:'+str(df['YYYY-MM-DD'][0])+'、始値:'+str(df['open'][0])+'、高値:'+str(df['high'][0])+'、安値:'+str(df['low'][0])+'、終値:'+str(df['close'][0])) |
■実行結果
1 |
日時:2018-03-01 09:00:00、始値:1140860、高値:1188000、安値:1098770、終値:1104460 |
■コード解説
このコードはこれまで何度か使用してきたコードですが、Cryptowatchからは2018/3/1以降のbitFlyerのデータを取得しています。
そして、DataFrameにOHLCデータを入れて、(日本語で日時、始値、高値、安値、終値のラベルを付けて)最初の1件だけを出力しています。
pandasのDataFrameを使う必要はないのですが、今後データの判定処理を行う際にも役に立つことが多いので、一度DataFrameの中にデータを入れる様にしています。
※ちなみにCryptowatchのafterの指定は2018/3/1を設定しても、2/25以降のデータが取れてしまう事があります。何か原因があるのかもしれませんが、処理の中で明示的に日時を指定して使用したほうが良いかも^^;
ループ処理にしてみよう!
さて、次はループ処理を行ってみましょう。といっても簡単です。今回は最初の10件だけ表示してみましょう。
変更追記箇所だけコードを載せます。
■Pythonコード(print文の部分を以下の通りに変更して下さい)
1 2 |
for i in range(10): print('日時:'+str(df['YYYY-MM-DD'][i])+'、始値:'+str(df['open'][i])+'、高値:'+str(df['high'][i])+'、安値:'+str(df['low'][i])+'、終値:'+str(df['close'][i])) |
■実行結果
1 2 3 4 5 6 7 8 9 10 |
日時:2018-03-01 09:00:00、始値:1140860、高値:1188000、安値:1098770、終値:1104460 日時:2018-03-02 09:00:00、始値:1100740、高値:1174593、安値:1094020、終値:1165220 日時:2018-03-03 09:00:00、始値:1165070、高値:1186250、安値:1144000、終値:1160600 日時:2018-03-04 09:00:00、始値:1171490、高値:1215727、安値:1170790、終値:1212529 日時:2018-03-05 09:00:00、始値:1210001、高値:1213180、安値:1170000、終値:1208010 日時:2018-03-06 09:00:00、始値:1208010、高値:1246120、安値:1202316、終値:1229800 日時:2018-03-07 09:00:00、始値:1229800、高値:1229800、安値:1116100、終値:1137000 日時:2018-03-08 09:00:00、始値:1137000、高値:1158090、安値:1012700、終値:1049900 日時:2018-03-09 09:00:00、始値:1056310、高値:1076451、安値:985000、終値:999670 日時:2018-03-10 09:00:00、始値:999928、高値:1010097、安値:893903、終値:996940 |
■Anaconda Promptの実行画面
判定処理を追加しよう!
さて、さらに陽線か陰線かを判定してみましょう。判定はとっても簡単です。以下で判断できます。
・始値より終値が高い ⇒ 陽線
・始値より終値が低い(安い) ⇒ 陰線
それも踏まえて判定条件を追加します。
※値は最初から陽線としておき、始値より終値が低い場合に陰線にする。というロジックにします。
■Pythonコード(for文の部分のみ変更)
1 2 3 4 5 6 |
for i in range(10): ohlc_msg = '陽線' if df['open'][i] > df['close'][i]: ohlc_msg = '陰線' print('日時:'+str(df['YYYY-MM-DD'][i])+'、始値:'+str(df['open'][i])+'、高値:'+str(df['high'][i])+'、安値:'+str(df['low'][i])+'、終値:'+str(df['close'][i])+'、判定結果:'+ohlc_msg) |
■実行結果
1 2 3 4 5 6 7 8 9 10 |
日時:2018-03-01 09:00:00、始値:1140860、高値:1188000、安値:1098770、終値:1104460、判定結果:陰線 日時:2018-03-02 09:00:00、始値:1100740、高値:1174593、安値:1094020、終値:1165220、判定結果:陽線 日時:2018-03-03 09:00:00、始値:1165070、高値:1186250、安値:1144000、終値:1160600、判定結果:陰線 日時:2018-03-04 09:00:00、始値:1171490、高値:1215727、安値:1170790、終値:1212529、判定結果:陽線 日時:2018-03-05 09:00:00、始値:1210001、高値:1213180、安値:1170000、終値:1208010、判定結果:陰線 日時:2018-03-06 09:00:00、始値:1208010、高値:1246120、安値:1202316、終値:1229800、判定結果:陽線 日時:2018-03-07 09:00:00、始値:1229800、高値:1229800、安値:1116100、終値:1137000、判定結果:陰線 日時:2018-03-08 09:00:00、始値:1137000、高値:1158090、安値:1012700、終値:1049900、判定結果:陰線 日時:2018-03-09 09:00:00、始値:1056310、高値:1076451、安値:985000、終値:999670、判定結果:陰線 日時:2018-03-10 09:00:00、始値:999928、高値:1010097、安値:893903、終値:996940、判定結果:陰線 |
ちゃんと判定できている様ですね^^
まとめ
さて、実際にCryptowatchからOHLCデータを取得して、それを一旦DataFrameに入れ、1のOHLC毎に処理していく事ができました。
システムトレードのためにBOTなどを作成する場合は、事前にバックテストというのを大量に行う必要があります。その時は今回と同じ様にOHLCを1件ずつ判定処理する。というのを何度もやる事になると思いますので、しっかりと覚えておいていただければと思います。