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という順になりました.
EOSUSDをbybitで取引する場合には,EOS現物が必要となるので,そういった参入障壁によってリターンのばらつきが生まれているのでしょうか.
BTCUSDよりもETHUSDのほうが変動係数が小さいというのは意外でした. なぜなのでしょうか?
ぜひこれからの取引にこの情報を活用してみてください.
おわりに
今回の記事でつかったJupyterNotebookはGithubに乗せてあります.
また,よければこちらからbybitへの登録をお願いします.
*1:実際はスプレッドが広がっていることが想像される