[Python pandas] bitFlyer の取引ランキングをコマンドでまとめて確認する

やりたいこと

bitFlyer(bF)の取引ランキング情報を簡単に確認したい。


Webからは以下で見れる。


※そもそもランキングって何?
これをチェック


つくったもの

Pythonで各ランキングの上位n位と、それぞれに対する自分や指定した人のランキングを簡単に確認できるコード書いた。実行するとこんな感じ。volume は小数点丸めてる。ついでに BTC/trades, trades/min, BTC/min も出力してみた。


各ランキング(上位n名) ※ここでは5名分


指定した人のランキング
複数人分まとめて取れるようにした


コード

nicknamesを自分やチェックしたい人のものに、ranksを確認したいランキング数(上位n名まで)に変更して実行してください。

import requests
import pandas as pd
import dateutil
from datetime import timedelta

# Input nicknames
nicknames = ["勇者ああああ", "これはまあまあ", ]

# Input ranking range
ranks = 5

# GET
RANKING = "https://lightning.bitflyer.jp/api/trade/ranking?contractRegion=JP"
res = requests.get(RANKING).json()

# 週次換算 trades/min
weeklyRanks = ["VOLUME", "FX", "API", "MANUAL", "NEW_MM_POINT", "NEW_MT_POINT"]

# Ranking
myRanks = {v: "\n<<{}>>\n                 Rank       BTC   Trades  BTC/Trades  Trades/m  BTC/m\n{}".format(v, "="*70) for v in nicknames}
for k in [k for k in res.keys()]:
  try:
    df = pd.DataFrame(res[k])
  except Exception as e:
    print(k, res.keys(), res, e)
    continue
  dt = dateutil.parser.parse(df["calculated_date"][0]) + timedelta(hours=9)
  minutes = dt.hour * 60 + dt.minute + dt.second / 60
  if minutes == 0:  minutes = 1440
  weekday = dt.weekday()
  if k in weeklyRanks:
    minutes += weekday * 1440
  print("\n\n<<{}>> at {}".format(k, dt.strftime("%Y/%m/%d %H:%M:%S")))
  print("Rank       BTC   Trades  BTC/Trades  Trades/m  BTC/m  name\n{}".format("-"*80))
  ranks = min(ranks, df.shape[0])
  for i in range(ranks):
    m  = "{:>4}".format(df.index[i] + 1)
    m += "{:>10}".format(round(df["volume"].values[i], 1))
    m += "{:>9}".format(df["number_of_trades"].values[i])
    m += "{:>12.2f}".format(round(df["volume"].values[i] / df["number_of_trades"].values[i], 2))
    m += "{:>10.2f}".format(round(df["number_of_trades"].values[i] / minutes, 2))
    m += "{:>7.2f}".format(round(df["volume"].values[i] / minutes, 2))
    m += "  {}".format(df["nickname"].values[i])
    print(m)

  for n in nicknames:
    myRanks[n] += "\n{:<17}".format(k)
    df_ = df[df["nickname"] == n]
    if df_.empty:
      myRanks[n] += " ---".format(k)
    else:
      myRanks[n] += "{:>4}".format(df_.index[0] + 1)
      myRanks[n] += "{:>10}".format(round(df_["volume"].values[0], 1))
      myRanks[n] += "{:>9}".format(df_["number_of_trades"].values[0])
      myRanks[n] += "{:>12.2f}".format(round(df_["volume"].values[0] / df_["number_of_trades"].values[0], 2))
      myRanks[n] += "{:>10.2f}".format(round(df_["number_of_trades"].values[0] / minutes, 2))
      myRanks[n] += "{:>7.2f}".format(round(df_["volume"].values[0] / minutes, 2))

# Output
for n,v in myRanks.items():
  print(v, "\n")


Special thanks

スナフキンさんのツイートが元ネタです


おわりに

有料(¥100)にしてるけど、これで内容は全部です。募金してくれる人がいれば、ジュース代としていただけると嬉しい。コードは、インデントくずれが起きたりするようなので、コピペ時には注意してください。


マガジン


コメント用note(未購入者向け)


干し芋


ここから先は

0字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM