Bybitの約定データから任意の間隔のohlcvデータを作成する&ローソク足グラフを作る
やりたいこと
bybitの過去約定ログデータは https://public.bybit.com/trading/BTCUSD/ からダウンロードできる。これを使って 任意の間隔のohlcvデータを作成しグラフ化する。完成するとタイトルのようなグラフができる。Google Collab で動作確認済。
ログのダウンロード
繰り返しデーター分析する可能性があるので、指定した日付のログファイルを、一旦/tmpへダウンロードしファイルのパスを返す関数を作る。
def get_bb_log(yyyy, mm, dd, symbol="BTCUSD"):
'''
bybitからパラメーターに指定された日付の約定データを/tmpにダウンロードする。
/tmpに一時保存することでキャッシュ機能を実現
:param yyyy: 年(4桁)
:param mm: 月
:param dd: 日
:param symbol: オプション:ディフォルトBTCUSD
:return: /tmpにダウンロードしたファイル名
'''
file_name = f'{symbol}{yyyy:04d}-{mm:02d}-{dd:02d}.csv.gz'
tmp_file = '/tmp/'+ file_name
if not os.path.exists(tmp_file):
download_url = f'https://public.bybit.com/trading/{symbol}/{file_name}'
request.urlretrieve(download_url, tmp_file)
print("download file=", file_name)
return tmp_file
Bybitログの中身は以下のとおり全約定毎にデータが提供されている。詳細な分析が可能だが、まずは標準的なローソク足で概要を確認することが今回の目的。
timestamp,symbol,side,size,price,tickDirection,trdMatchID,grossValue,homeNotional,foreignNotional
1631836798.763,BTCUSD,Sell,385,47778.5,ZeroMinusTick,28e39120-98e3-5653-90cb-832367d94e12,805801.0000000001,385,0.00805801
1631836796.369,BTCUSD,Sell,53889,47778.5,MinusTick,fd1bb703-fcac-5bc7-b34a-6ec31e78a789,112789225.0,53889,1.12789225
1631836795.752,BTCUSD,Buy,385,47779.0,ZeroMinusTick,46c5be5e-7545-5c08-bb21-f4c4916b7340,805793.0,385,0.00805793
1631836795.211,BTCUSD,Buy,3924,47779.0,PlusTick,f4402966-0e3e-55bc-abd8-04834fefd0ab,8212812.999999999,3924,0.08212813
1631836794.271,BTCUSD,Sell,30000,47778.5,ZeroMinusTick,53172192-b902-51b9-9d36-cc185187b34b,62789748.0,30000,0.62789748
1631836794.271,BTCUSD,Sell,4552,47778.5,ZeroMinusTick,8ec16332-1e6f-5314-b51e-271f824fbcd5,9527297.0,4552,0.09527297
1631836794.271,BTCUSD,Sell,32017,47778.5,MinusTick,8203375d-bb88-5fc2-b838-710c1df8e78c,67011312.0,32017,0.67011312
1631836794.068,BTCUSD,Buy,84,47779.0,PlusTick,f505aa2e-b5ad-5e23-b38c-f30441fb29ee,175809.0,84,0.00175809
1631836793.9,BTCUSD,Sell,385,47778.5,ZeroMinusTick,48765e59-9db0-5f1c-ae4a-50f6c374f3f9,805801.0000000001,385,0.00805801
1631836792.836,BTCUSD,Sell,904,47778.5,ZeroMinusTick,28a64a1e-d086-55fd-8f22-0169b0667daa,1892064.0,904,0.01892064
1631836792.216,BTCUSD,Sell,4557,47778.5,MinusTick,362315a6-f1c1-51c1-b190-b846e6ef3e14,9537762.0,4557,0.09537762
1631836790.945,BTCUSD,Buy,385,47779.0,PlusTick,c4929e50-e80f-575c-a211-17b250d931f1,805793.0,385,0.00805793
DataFrame(Pandas)の作成
すでに作ったログのダウンロード関数get_bb_logを用いてデータをダウンロードしDataFrameを作成する。
生ログの1カラム目(index)が秒単位のUNIXTIME(UTC)になっているので、フォマット指定はutc=True, unit='s'となる。
def get_bb_df(yyyy, mm, dd):
'''
bybitから約定データをダウンロードしpandasのDataFrameオブジェクトにする。
:param yyyy: 年(4桁)
:param mm: 月
:param dd: 日
:return: 約定データが入ったDataFrame
'''
file = get_bb_log(yyyy, mm, dd)
bb_df = pd.read_csv(file, index_col=0)
bb_df.index = pd.to_datetime(bb_df.index, utc=True, unit='s')
return bb_df
任意期間の足を作成
生成した DataFrameは約定単位でのデータが入っているので単位時間でリサンプルする。データ量によってはかなり重い処理になるので、実用上は毎回実施するのではなくファイルに保存するなどの処理が必要になる。
秒だと 'S' 分だと'T' 時間だと'H'をsample_timeに指定すると任意の時間でリサンプルできる。
def resample_ohlcv(data, sample_time):
'''
約定データからohlcvを作成する。
timeに指定できるパラメータは文字列で以下のように指定する。
15秒:'15S' / 1分: '1T' / 1時間: '1H'
詳細はpadnasのドキュメント
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
:param data: bybitの約定データの入ったDataFrame
:param sample_time: サンプル間隔
:return: ohlcvデータ
'''
resample_df = data['price'].resample(sample_time).ohlc()
resample_df['volume'] = data['size'].resample(sample_time).sum()
return resample_df
実行
作った関数を使ってデータをダウンロードする。
複数のデータをappendで繋げていくことができる。
df = get_bb_df(2021, 9, 15)
df = df.append(get_bb_df(2021, 9, 16))
df = df.append(get_bb_df(2021, 9, 17))
時間足の作成
1時間刻みにしたい場合は1Hを指定する。
ohlcv_df = resample_ohlcv(df, '1H')
ohlcv_dfの中身
期待どおり1時間のOHLCVデータが完成した。
open high low close volume
timestamp
2021-09-15 00:00:00+00:00 47109.5 47350.0 46951.0 47137.0 130713843
2021-09-15 01:00:00+00:00 47137.5 47445.0 47000.0 47044.5 105234309
2021-09-15 02:00:00+00:00 47045.0 47172.0 46999.0 47156.5 47737913
2021-09-15 03:00:00+00:00 47157.0 47177.0 46963.0 47072.0 60636334
2021-09-15 04:00:00+00:00 47072.0 47110.0 46832.0 46856.0 74501893
ローソク足の作成
OHLCVデータをmplfinanceを使ってローソク足を作る。mplfinance が入っていない環境ではpipでインストールする必要がある。
コード
mavはMoving Average。移動平均を簡単に追加できる。
import mplfinance as mpf
# ohlcのグラフ化
mpf.plot(ohlcv_df, type='candle', figratio=(12,4), mav=(5, 10))
出力
取引高の表示
パラメータvolumeにTrueを入れると取引量の表示を追加できる。
# ohlcvのグラフ化
mpf.plot(ohlcv_df, type='candle', figratio=(12,4), mav=(5, 10), volume=True)
出力
Google Colabで試す
jupiter noteファイルは以下。ダウンロードしてGoogle Colabなどのjupiter環境で動かすことができる。
Google Colaboratoryで直接動かすこともできる。以下をクリックして実行。