bitFlyer APIのTipsを列挙していきます。ご利用は自己責任で。
始めの一歩。pybitflyerを利用します。pythonコードではなく、シェル内で。
# sudo python -m pip install pybitflyer
秒ごとのohlcvが欲しいときに。APIの仕様で一回のapi.executions毎に500回分の執行しか取れないので、counts回分繰り返すようにする。10回繰り返す(counts=10)と、5000回(=500×10)執行分の秒足が返される。
def ohlcv_sec (step, counts, count=500): df = pd.DataFrame([]) before = 0 for i in range(counts): r = api.executions(product_code='FX_BTC_JPY', count=count, before=before) df = pd.concat([df, pd.DataFrame(r)]) before = int(df.iloc[-2, 0]) sleep(0.1) df = df.drop_duplicates(subset='id') df['exec_date'] = pd.to_datetime(df['exec_date']) df = df.set_index('exec_date') df_price = df['price'].resample(step).ohlc() df_volume = df['size'].resample(step).sum() ohlcv = df_price.assign(volume=df_volume) ohlcv.columns = ['Open', 'High', 'Low', 'Close', 'Volume'] return ohlcv df = ohlcv_sec('S', 50, count=500) #step = Y, M, D, H, T, S, L, U df = df.fillna(method='ffill') # print(df.tail()) # Open High Low Close Volume # exec_date # 2020-08-18 12:34:15 1298476.0 1298592.0 1298446.0 1298458.0 0.402346 # 2020-08-18 12:34:16 1298455.0 1298455.0 1298398.0 1298398.0 0.189386 # 2020-08-18 12:34:17 1298398.0 1298400.0 1298336.0 1298377.0 0.254000 # 2020-08-18 12:34:18 1298322.0 1298336.0 1298260.0 1298277.0 0.583021 # 2020-08-18 12:34:19 1298249.0 1298257.0 1298237.0 1298237.0 0.091903
ローソク足を、自分で作ってみたいと思ったときに。
# sudo python -m pip install mplfinance
簡単にローソク足が描ける。
import mplfinance as mpf mpf.plot(df, type='candle', volume=True, mav=(5, 20, 50), figratio=(18,6))

フツーの分足で良いのなら、CryptowatchのAPIから取れる。タイムスタンプはUTC標準時。呼び出しのperiodsを3600(=60×60)にすれば、1時間足が取れる。
def ohlcv(periods, counts=6000): params = {"periods" : periods } after = int((datetime.datetime.now() - datetime.timedelta(seconds=(periods+1)*counts)).timestamp()) params["before"], params['after'] = 0, after response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params) data = response.json() df = pd.DataFrame(data['result'][str(periods)]).drop([6], axis=1) df[0] = pd.to_datetime(df[0].apply(datetime.datetime.fromtimestamp)) df = df.set_index(0) df.columns = ['Open', 'High', 'Low', 'Close', 'Volume'] return df df = ohlcv(60) # print(df.tail()) # Open High Low Close Volume # 0 # 2020-08-18 12:41:00 1299029 1299068 1298270 1298919 65.158156 # 2020-08-18 12:42:00 1298924 1299618 1298394 1298643 83.296856 # 2020-08-18 12:43:00 1298667 1298816 1297620 1298001 90.063755 # 2020-08-18 12:44:00 1298002 1298601 1297596 1297832 89.762146 # 2020-08-18 12:45:00 1298104 1298955 1297878 1298499 90.814710
何かあったときに、LINEに飛ばしいときはコレ。下記リンクから、何とかして登録してみてください。
https://notify-bot.line.me/ja/
def line_notify (message): line_notify_token = 'please_get_and_put_your_token' line_notify_api = 'https://notify-api.line.me/api/notify' payload = {'message': message} headers = {'Authorization': 'Bearer ' + line_notify_token} requests.post(line_notify_api, data=payload, headers=headers) print(message) # line_notify('test') # test
時間の計測をしたいときは、コレ。奇数回目の呼び出しでカウントスタート、偶数回目の呼び出しで計測時間を表示。
timer_memory = 0 def timer (): global timer_memory if timer_memory == 0: timer_memory = time.time() else: elapsed_time = time.time() - timer_memory print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") timer_memory = 0 # timer() # for i in range(5): # print(i) # timer() # 0 # 1 # 2 # 3 # 4 # elapsed_time:0.00031185150146484375[sec]
成行注文をするときの関数。引数sideには、’BUY’か’SELL’が入る。ここで’PLACE’を指定すると、現在のポジションを精算する。
def order (side, size): if side != 'PLACE': api.sendchildorder(product_code="FX_BTC_JPY", child_order_type="MARKET", side=side, size=round(size, 2)) else: pos = api.getpositions(product_code="FX_BTC_JPY") if pos: sze = sum([p['size'] for p in pos]) ops = 'BUY' if pos[0]['side'] == 'SELL' else 'SELL' order(ops, sze) else: return # order('BUY', 0.01)
かなり雑多ですが、こんなところで。
シストレの本質は「エッジ×繰り返し」にあるわけですが、大体においてこのエッジが小さすぎます。なので、ちょっとした計算違いがあるとすぐにエッジがなくなり、マイナスになります。それでなくとも、シストレ屋さんの競争の中でエッジがすぐになくなるので、常に新しいエッジを求めて全力疾走を続けなければなりません。
機械学習にしても、短い時間軸では有効な予測手法にはならないように感じています。かと言って長い時間軸だと、敢えて機械学習を回すメリットが減じてしまいます。
シストレなんて、首を突っ込むものじゃないと思うんですけどね。まぁそうは言っても、やっちゃう人はやっちゃうものですが。