仮想通貨の価格とIT企業(GAFA)の株価との相関関係を可視化してみようと思います。
####必要なライブラリ
データの取得・解析にはPandas、可視化にはMatplotlib・Seabornを使います。
import pandas as pd
from pandas import Series, DataFrame
from pandas_datareader import DataReader
import matplotlib.pyplot as plt
import seaborn as sns
import time
from datetime import datetime
import poloniex
データの取得
####仮想通貨
仮想通貨の価格データ取得の詳細については、こちらを参照ください。
ビットコイン、イーサリアム、リップル、ドージコインのUSドルに対する価格を取得します。今回データを取得する取引所では、XEMなどのドルで直接買えないアルトコインも多いので、その場合は、BTCに対する価格を取得した後にBTC価格を使って変換しましょう。
polo = poloniex.Poloniex()
period = polo.DAY # period of data
end = time.time()
start = end - period * 365 # 1 year
coin_name_list = ['BTC', 'ETH', 'XRP', 'DOGE']
for coin in coin_name_list:
globals()[coin] = DataFrame.from_dict(
polo.returnChartData('USDT_%s'%coin, period=period, start=start, end=end),
dtype=float)
timestamp = BTC['date'].values.tolist() # Series -> ndarray -> list
# timestamp -> year/month/day
date = [datetime.fromtimestamp(timestamp[i]).date() for i in range(len(timestamp))]
coin_list = [BTC, ETH, XRP, DOGE]
for COIN in coin_list:
COIN.drop(['date', 'quoteVolume', 'weightedAverage'], axis=1, inplace=True)
COIN.index = pd.to_datetime(date)
COIN.index.name = 'Date'
COIN.columns = ['High', 'Low', 'Open', 'Close', 'Volume']
####株価
株価については、pandasのdatareaderを使って、YahooのAPIから1年分のデータを取得します。
tech_name_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN'] #GAFA
end = datetime.now()
start = datetime(end.year - 1, end.month, end.day)
# 株価取得
for stock in tech_name_list:
globals()[stock] = DataReader(stock, 'yahoo', start, end) # 文字列を変数にする
tech_list = [AAPL, GOOG, MSFT, AMZN] # DataFrameのリスト
データの統合
今回は、リターンと初値について相関関係を調べていこうと思うので、必要なデータを統合して整理します。ここで重要なのが、株価は株式市場の開いている平日のデータしかありませんが、仮想通貨は常に取引されているので、土日のデータも含まれます。そこで、統合するデータは株価データのある日だけにします。
brand_list = coin_list
brand_list.extend(tech_list)
brand_name_list = coin_name_list
brand_name_list.extend(tech_name_list)
# 元のDataFrameで20日EMA、50日SMA、DailyReturnを計算
for df in brand_list:
df['EMA20'] = df['Open'].ewm(span=20).mean()
df['SMA50'] = df['Open'].rolling(window=50).mean()
df['Return'] = df['Open'].pct_change()
# 初値を統合したDataFrame
df_opens = pd.concat([df['Open'] for df in brand_list], axis=1)
df_opens.columns = brand_name_list
df_opens.dropna(inplace=True)
# リターンを統合したDataFrame
df_returns = pd.concat([df['Return'] for df in brand_list], axis=1)
df_returns.columns = brand_name_list
df_returns.dropna(inplace=True)
グラフで比較する
まず、価格をプロットしてみます。
fig, axes = plt.subplots(nrows=len(brand_list), ncols=1, figsize=(15, 20))
for i, (df, title) in enumerate(zip(brand_list, brand_name_list)):
df[['Open', 'EMA20', 'SMA50']].plot(ax=axes[i], subplots=False, title=title)
次に、リターンです。
fig, axes = plt.subplots(nrows=len(brand_list), ncols=1, figsize=(15, 20))
for i, (df, title) in enumerate(zip(brand_list, brand_name_list)):
df[['Return']].plot(ax=axes[i], subplots=False, title=title)
相関関係を可視化する
グラフで比較しても分かりにくいので、seabornを使って相関関係を可視化してみます。リターンについてヒストグラムで比較します。
まず、ビットコインとイーサリアムを見てみます。jointplotを使えば、2つのヒストグラムとscatterが描かれますが、kind='hex'を指定するとscatterの密度になります。
sns.jointplot(x=BTC['Return'], y=ETH['Return'], kind='hex')
かなり強い相関があることが分かります。では、アップルとグーグルではどうでしょうか。
sns.jointplot(x=AAPL['Return'], y=GOOG['Return'], kind='hex', color='seagreen')
こちらも相関関係があることが分かりました。
ビットコインとアップルではどうでしょうか。
sns.jointplot(x=df_returns['BTC'], y=df_returns['AAPL'], kind='hex', color='indianred')
こちらはあまり相関はなさそうです。
最後に、全ての銘柄をまとめて表示してみます。pairplot関数を用いれば3つ以上のデータについてjointplotのペアを表示することができます。
sns.pairplot(df_returns.dropna())
この場合、実質的に同じscatterが2つ存在してしまうので、上にscatter、下にカーネル密度推定を表示することもできます。PiarGrid関数を使います。初値について見てみます。
fig = sns.PairGrid(df_opens)
fig.map_upper(plt.scatter)
fig.map_lower(sns.kdeplot, cmap='cool_d')
fig.map_diag(plt.hist, color='purple')
最後に、相関係数を表示します。
sns.heatmap(df_returns.corr(), annot=True)
全体を見ると、
- IT企業同士、ドージコイン以外の仮想通貨は相関関係がある
- ドージコインはかなり特殊なデータである
ということが可視化の結果から分かるでしょうか。
今回は、仮想通貨とIT企業の株価を見てみましたが、金など他の資産との相関を調べてみるのも面白そうです。