お金

bitFlyer APIのTips

投稿日:

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

【お金】TRY/JPY買い・USD/ZAR買い戦略について【因果関係】

トルコリラのスワップ金利投資を考えている方へ。 以前に、TRY/JPY買い・USD/ZAR買いの両建てを提案しました。 TRY/JPYとUSD/ZARの長期の相関を見ていると逆の動きをしています。そこ …

no image

日経平均は中長期的に下落する

はじめに 今年(2020年)の2月/3月ごろから世間で新型コロナが騒がれだし、2月25日~3月19日の18営業日間に、日経平均は23,387円から6,834円(29%)下落しました。その後は持ち直し、 …

no image

【お金】世界の主要な資産の時価総額とその割合【インデックス】

自分用のメモです。 世界の主要な資産の時価総額とその割合を、下記の通りまとめました。インデックス投資をするときに、あると便利ですよね。 とはいえ、ある程度ざっくりと引っ張ってきた数字なので、上記数字の …

no image

【お金】FXで相場の振動から利益を得られるかどうか【ムリ】

FXの中には、値動きの激しいものがあります。この値動きを上手く利用して、利益を出せないか検証しました。 結論は、ムリです。何かしらの予測をしないと、FXで儲けることはできません。 例えばある5分足の終 …

no image

【お金】Googleトレンドと株価の相関【考察】

投資のため、どこにお金が流れ込むのかを予測しようとしている方へ。 Googleトレンドと株価の相関を調べてみました。厳密にというよりも、いくつかサンプルを取ってラフに実施しています。 まず、「スマホ」 …

プロフィール

タクマ
−−−−−−−−

東南アジアでシステムインテグレーターとして6年ほど駐在していたり、本を1000冊以上読んだり、趣味でWEBサービスを作ったりしています。

Twitterまとめのまとめ
YouTube Find!
SNS Trends

−−−−−−−−