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
結果を見てみると日曜日が最も上昇する確率が高く、火曜日が最も上昇する確率が低いことがわかりました。
まとめ
曜日によって多少の差はあるもののトレード戦略として利用するには頼りないような気がします。
少なくとも曜日だけを参考にして取引するのはやめた方がよさそうです。
おわり