クリプトHFTとか競プロとか

競技プログラミングや仮想通貨に関することを中心にブログを書いていきます.

BybitのBTC, ETH, EOS, XRPの変動係数を比べてみる

モチベーション

最近BTC/USD成り行き注文を利用する高頻度取引botを開発していたのですが,ある程度の説明力のある指標を用いても,それをTake戦略で使用すると,成り行き手数料0.075%が重くのしかかってきます.

なので,BTC/USD以外にTake戦略が有利に働くような市場を探します.

今回は,8/1の約定履歴をもとにして作った一秒足のリターンの変動係数(標準偏差 / 平均値)が高ければ高いほど,ボラティリティが高く,成り行きが有利である*1として検証をすすめていきます.

データの用意

bybitの約定履歴は,https://public.bybit.com/trading/ に落ちていますので,それをダウンロードするスクリプトを書いてあとからでも参照しやすくしておきます.

import gzip
import os
import pandas as pd
from datetime import datetime, timedelta
from urllib import request
from time import sleep

#参考: https://qiita.com/yuukiclass/items/88e9ac6c5a3b5ab56cc4


def main():
    baseurl = 'https://public.bybit.com/trading/'
    #https://public.bybit.com/trading/BTCUSD/BTCUSD2020-05-25.csv.gz
    is_concat = input("do you want to concat many days ? (y/n): ")
    
    if is_concat == "y":
        start_date, end_date, symbol = input("yyyy-mm-dd(start) yyyy-mm-dd(end) symbol\n").split()
        file_title = f"exec_bybit-{start_date}-{end_date}.csv"
        df = pd.DataFrame()
        start = datetime.strptime(start_date, "%Y-%m-%d")
        end = datetime.strptime(end_date, "%Y-%m-%d")
        
        # https://thr3a.hatenablog.com/entry/20180813/1534124783
        for i in range((end - start).days + 1):
            date_str = start + timedelta(i)
            date_str = date_str.strftime("%Y-%m-%d")
            filepath = f"{date_str}.csv"
            dlurl =  baseurl + f"{symbol}/{symbol}{date_str}.csv.gz"
            df2 = download(dlurl, filepath)
            df = pd.concat([df,df2])
            print(f"donwloaded {date_str}")
            sleep(0.5)
        
        df.to_csv(file_title)
    else: 
        date, symbol= input('yyyy-mm-dd symbol\n').split()    
    
        print('Downloading... ' + baseurl + f"{symbol}/{symbol}{date}.csv.gz")
        filepath = f"{date}.csv.gz"
        df = download(baseurl + f"{symbol}/{symbol}{date}.csv.gz", filepath)
        print('Done!')
        file_title = f"exec_bybit-{date}.csv"
        df.to_csv(file_title)    
    
    print("Done!")
    return

def download(url, filepath):
    request.urlretrieve(url, filepath)
    df = unzip(filepath)
    os.remove(filepath)
    
    return df

def unzip(filepath):
    with gzip.open(filepath, 'rt') as f:
        df = pd.read_csv(f)
    return df

if __name__ == "__main__":
    main()

また,秒足にする関数も書いておきます.

def makeCandles(df, sec):
    # 参考: https://note.com/nagi7692/n/ne674d117d1b6?magazine_key=m0b2a506bf904
    df.drop(['tickDirection', 'trdMatchID', 'grossValue', 'homeNotional', 'foreignNotional'], axis=1, inplace=True)
    #86400本の秒足ができるように0秒に約定を入れる
    df = df.sort_index()
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit="s")
    df = df.rename(columns={'timestamp': 'exec_date'})
    df = df.set_index('exec_date')
    
    df['buy_size'] = df['size'].where(df['side'] == 'Buy', 0)
    df['buy_flag'] = df['side'] == 'Buy'
    df['sell_size'] = df['size'].where(df['side'] == 'Sell', 0)
    df['sell_flag'] = df['side'] == 'Sell'

    df_ohlcv = df.resample('{}S'.format(sec)).agg({"price": "ohlc", "size": "sum", "buy_size": "sum", "buy_flag": "sum",
                                      "sell_size": "sum", "sell_flag": "sum", })
    df_ohlcv.columns = ['open', 'high', 'low', 'close', 'volume', 'buy_vol', 'buy_num', 'sell_vol', 'sell_num']
    df_ohlcv['buy_num'] = df_ohlcv['buy_num'].astype(int)
    df_ohlcv['sell_num'] = df_ohlcv['sell_num'].astype(int)
    df_ohlcv.ffill(inplace=True)

    return df_ohlcv

実際に見てみる

結果としては,リターンの変動係数の大きい順に並べると, EOSUSD > XRPUSD > BTCUSD > ETHUSDという順になりました.

f:id:KabukiMining:20201003115405p:plain

EOSUSDをbybitで取引する場合には,EOS現物が必要となるので,そういった参入障壁によってリターンのばらつきが生まれているのでしょうか.

BTCUSDよりもETHUSDのほうが変動係数が小さいというのは意外でした. なぜなのでしょうか?

ぜひこれからの取引にこの情報を活用してみてください.

おわりに

今回の記事でつかったJupyterNotebookはGithubに乗せてあります

また,よければこちらからbybitへの登録をお願いします.

*1:実際はスプレッドが広がっていることが想像される