仮想通貨

bitFlyer APIのTips

投稿日:2020年8月18日 更新日:

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)

かなり雑多ですが、こんなところで。

シストレの本質は「エッジ×繰り返し」にあるわけですが、大体においてこのエッジが小さすぎます。なので、ちょっとした計算違いがあるとすぐにエッジがなくなり、マイナスになります。それでなくとも、シストレ屋さんの競争の中でエッジがすぐになくなるので、常に新しいエッジを求めて全力疾走を続けなければなりません。

機械学習にしても、短い時間軸では有効な予測手法にはならないように感じています。かと言って長い時間軸だと、敢えて機械学習を回すメリットが減じてしまいます。

シストレなんて、首を突っ込むものじゃないと思うんですけどね。まぁそうは言っても、やっちゃう人はやっちゃうものですが。



-仮想通貨
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です



関連記事

no image

機械学習で仮想通貨の価格予測→ムリ (XGBoost)

機械学習+仮想通貨で儲けられる? 残念ながら以前の記事で述べた通り、ローソク足+機械学習でマトモな価格予測を行うことはできません。前回はPython+Keras+GRUでこのことを確認したのですが、今 …

bitFlyerのAPIでできること→ほとんど何でもできる

【2020/12/12】 pybitflyer記事へのリンクを更新しました bitFlyerを使っているのだけれど、APIなるもので何かができるらしい 確かにAPIを利用すると、bitFlyerで色々 …

no image

機械学習で仮想通貨の価格予測→ムリ (Keras/GRU)

機械学習+仮想通貨で儲けられる? 残念ながら、機械学習でのお金儲けは、かなり難しいです。 少なくとも、ローソク足だけを使って機械学習で価格予測をしようとしても、ほとんどマトモな予測はできません。 機械 …

no image

pybitflyerで簡単自動売買

pybitflyerなるものを使えば、bitFlyerの取引を自動化できる? pybitflyerを使うことで、bitFlyerの取引を自動化することができます。 本記事ではpybitflyerを導入 …

プロフィール

タクマ
−−−−−−−−

東南アジア(ミャンマー&フィリピン)でNW系システムインテグレーターとして6年ほど駐在していました。本を1500冊以上読んだり、プログラミングをしたりしています。嫁さんはタイ人で、タイ在住です。
ーー
「〇〇を分かりやすく解説!」系のスカスカな記事を見ていると頭が悪くなりそうなので、対抗して、少し骨のある記事を書こうと考えています。
ーー
Twitter (@tkm_nkmr)
ーー
Twitterまとめのまとめ
YouTube Find!
SNS Trends

−−−−−−−−