nashidos’s diary

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

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

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

まとめ

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

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

おわり