bybitの過去frを計算するコード

間違えてるかもですが、せっかく作ったので共有。

# license CC0

import pandas as pd

print('calc fr')

date = pd.to_datetime('2021-03-10 00:00:00Z')
dfs = []
while True:
   date_str = date.strftime("%Y-%m-%d")
   print(date_str)
   url = 'https://public.bybit.com/premium_index/BTCUSD/BTCUSD{}_premium_index.csv.gz'.format(date_str)
   try:
       df = pd.read_csv(url)
   except Exception as e:
       print(e)
       break
   df = df.rename(columns={
       'start_at': 'timestamp',
       'open': 'op',
       'high': 'hi',
       'low': 'lo',
       'close': 'cl',
       'symbol': 'market'
   })
   df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s', utc=True)
   df = df[['timestamp', 'cl']]
#     display(df)
   df['timestamp'] = df['timestamp'].dt.floor('8H')
   df = pd.concat([
       df.groupby('timestamp')['cl'].mean()
   ], axis=1)
   dfs.append(df)
   
#     display(df)
   date += pd.to_timedelta(1, unit='day')

df = pd.concat(dfs)
df = df.sort_values('timestamp')
interest_rate = (0.0006 - 0.0003) / 3.0
df['fr'] = (df['cl'] + (interest_rate  - df['cl']).clip(-0.0005, 0.0005) ).shift(2)
df.to_pickle('df_fr.pkl')
display(df)

原理

bybitの過去frを直接取得するAPIが見つからなかったので、以下の計算式に従って、プレミアムインデックスから計算しました。

バックテスト用に書いたので以下から取得。プレミアムインデックスはAPIから取得できるらしいので、書き換えれば当日も取得できそう。

よく探したらあった

xlsxですがfrそのものがありました。

https://www.bybit.com/data/basic/inverse/funding-history?symbol=BTCUSD