nashidos’s diary

アルゴリズムとか機械学習とか色々

デプスチャートをPythonで描写してみる

本記事では仮想通貨のデプスチャートをPythonで描写する方法について紹介します。

今回は例としてbitflyerのBTC_JPYのデプスチャートを作成してみたいと思います。

実際にソースコードも載せているのでご自由にお使いください。

デプスチャートとは

デプスチャートはその名の通り注文の深さを視覚的に表したチャートです。

買い、売りのそれぞれの注文がどの価格帯にどれだけの量注文されているかなどがわかるので、買いが強いのか売りが強いのかが判定しやすくなります。

f:id:nashidos:20210406231837p:plain

ただ、もちろんデプスチャートのみでトレンドを見極めるのは難しいのでご注意ください。

bitFlyer API

ビットフライヤーAPIPythonから使えるpybitflyerというパッケージを今回は使用しました。

pipを用いて簡単に使用することが出来ます。

pip install pybitflyer

APIからは板の情報や価格情報、約定履歴などの情報を知ることができます。

詳しくは公式のAPI Documentationをご覧ください。

ソースコード

以下が実際に私が実装したソースコードです。

実行環境はJupyter Notebookです。

import pybitflyer
from datetime import datetime
from time import sleep
from matplotlib import pyplot as plt
%matplotlib inline

# APIクラスの宣言
api = pybitflyer.API()

# BTC/JPYの板情報を取得
board = api.board(product_code="BTC_JPY")

# 各板情報を取得
def get_depth_data(position):
    size = []
    price = []
    for order in board[position]:
        size.append(order['size'])
        price.append(order['price'])

    size_cum = [size[0]]
    for i in range(1, len(size)):
        size_cum.append(size[i]+size_cum[-1])
    
    return size, price, size_cum

# 注文サイズ、注文価格、累積注文サイズを取得
asks_size, asks_price, asks_size_cum = get_depth_data('asks')
bids_size, bids_price, bids_size_cum = get_depth_data('bids')

# 取得する範囲
board_range = 100

# 図のサイズ
plt.figure(figsize=(10,3))

# 図の描写
plt.fill_between(asks_price[0:board_range], asks_size_cum[0:board_range],  color="red", alpha=0.3)
plt.fill_between(bids_price[0:board_range], bids_size_cum[0:board_range],  color="green", alpha=0.3)
plt.plot(asks_price[0:board_range], asks_size_cum[0:board_range], color="red")
plt.plot(bids_price[0:board_range], bids_size_cum[0:board_range], color="green")

# 図の保存
plt.savefig("depthchart.png")

描写したデプスチャート

出力されたデプスチャートの例は以下の通りです。

横軸がBTCの価格、縦軸が累積の注文枚数です。

最も低い位置は現在の価格を示しており、そこから買い注文と売り注文がどのように分布しているのかを見ることができます。
f:id:nashidos:20210406224654p:plain

まとめ

Pythonを用いてデプスチャートを描写してみました。

product_codeを変えることで他の通貨のデプスチャートも簡単に描写することができます。

ご自身でご自由に拡張してみてください。

おわり。

Pythonでビットコインの価格変動と曜日の関係を分析してみる




「月曜日は上がりやすい」など曜日と価格変動が関係しているという噂を耳にしたことがある人もいるのではないでしょうか。

そこで本記事では、実際に曜日と価格変動に関係があるのかをPythonを利用して分析していきます。

使用するデータは以下のサイトで取得させていただきました。
仮想通貨(暗号通貨)4本値CSVゲッター from Cryptowatch

Pythonで分析

それでは実際にコードを見ながら分析を進めていきいます。

インポートとデータの確認

import pandas as pd
import numpy as np
import datetime
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline

btc = pd.read_csv("btc.csv",encoding="shiftJIS")
btc.head()

出力
出力結果

んーこのままではそれぞれのカラム名がわかりにくいので名前を変えましょう。

btc= btc1h.rename(columns={0:'day',1:'start',2:'high',3:'low',4:'finish',5:'volume'})
btc.head()

出力
出力結果
(day:日付、start:始値、high:高値、low:安値、finish:終値、volume:出来高)

これで見やすくなりました。

曜日データの追加

まだ曜日のデータがないため、日付データを利用して曜日データを生成したいと思います。

今回はweekday()を利用して曜日データを取得します。

ls = list()
for i in date:
    date_dt = datetime.datetime.strptime(i, '%Y/%m/%d %H:%M').weekday() #曜日データの生成
    ls.append(date_dt)
    
day_of_week = pd.Series(ls,name="day_of_week")
btc = pd.concat([btc,day_of_week],axis=1) #先ほどのデータに曜日データを追加
btc.head()#0:月曜日, 1:火曜日, 2:水曜日, 3:木曜日, 4:金曜日, 5:土曜日, 6:日曜日

出力結果

はい、曜日データを追加することができました。

可視化

試しにそれぞれの曜日の価格データを可視化してみましょう。

plt.gcf().set_size_inches(15, 8)
plt.plot(btc[btc["day_of_week"]==0]["finish"])
plt.plot(btc[btc["day_of_week"]==1]["finish"])
plt.plot(btc[btc["day_of_week"]==2]["finish"])
plt.plot(btc[btc["day_of_week"]==3]["finish"])
plt.plot(btc[btc["day_of_week"]==4]["finish"])
plt.plot(btc[btc["day_of_week"]==5]["finish"])
plt.plot(btc[btc["day_of_week"]==6]["finish"])

出力
チャート画像

画像を見る限り明らかに外れているような曜日はありませんね。




確率を算出

次は実際に確率を算出して数字で見てみましょう。

その日が上がったのか(up)下がったのか(down)というデータを追加していきます。

ls = list()
for i in range(len(btc["start"])):
    if btc["start"][i] - btc["finish"][i] < 0:
        ls.append("up")
    elif btc["start"][i] - btc["finish"][i] > 0:
        ls.append("")
    else:
        ls.append("equal")
    
up_down = pd.Series(ls,name="up_down")
btc = pd.concat([btc,up_down],axis=1)
btc.head()

出力
出力結果

追加できたので次はそれぞれの曜日の時の価格が上がる確率を計算していきます。

def updown(n):
    up = 0
    down = 0
    for i in range(len(day_of_week)):
        if day_of_week[i] == n and up_down[i] == "up":
            up += 1
        elif day_of_week[i] == n and up_down[i] == "down":
            down += 1
    return up/(up+down)

day_week = ["月曜","火曜","水曜","木曜","金曜","土曜","日曜"]

for i in range(7):
    print(day_week[i],updown(i))

出力

月曜 0.5267175572519084
火曜 0.5037037037037037
水曜 0.5149253731343284
木曜 0.5746268656716418
金曜 0.5111111111111111
土曜 0.5149253731343284
日曜 0.5984848484848485

結果を見てみると日曜日が最も上昇する確率が高く、火曜日が最も上昇する確率が低いことがわかりました。

まとめ

曜日によって多少の差はあるもののトレード戦略として利用するには頼りないような気がします。

少なくとも曜日だけを参考にして取引するのはやめた方がよさそうです。

おわり