Pythonで仮想通貨とIT企業株価の相関関係を可視化する

仮想通貨の価格とIT企業（GAFA）の株価との相関関係を可視化してみようと思います。

####必要なライブラリ
データの取得・解析にはPandas、可視化にはMatplotlib・Seabornを使います。

```python
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
```

データの取得
--
####仮想通貨
仮想通貨の価格データ取得の詳細については、こちらを参照ください。

https://qiita.com/tkodaii/items/3fd44aa11133938827c1

ビットコイン、イーサリアム、リップル、ドージコインのUSドルに対する価格を取得します。今回データを取得する取引所では、XEMなどのドルで直接買えないアルトコインも多いので、その場合は、BTCに対する価格を取得した後にBTC価格を使って変換しましょう。

```python
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年分のデータを取得します。

```python
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のリスト
```

データの統合
--
今回は、リターンと初値について相関関係を調べていこうと思うので、必要なデータを統合して整理します。ここで重要なのが、株価は株式市場の開いている平日のデータしかありませんが、仮想通貨は常に取引されているので、土日のデータも含まれます。そこで、統合するデータは株価データのある日だけにします。

```python
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)
```

グラフで比較する
--
まず、価格をプロットしてみます。

```python
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)
```

<img width=80% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/b24a869f-d36a-9431-6d95-625fd44e6097.png">

次に、リターンです。

```python
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)
```

<img width=80% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/829e31a9-7eab-a452-3d89-aee79d8dac9e.png">

相関関係を可視化する
--
グラフで比較しても分かりにくいので、seabornを使って相関関係を可視化してみます。リターンについてヒストグラムで比較します。
まず、ビットコインとイーサリアムを見てみます。jointplotを使えば、２つのヒストグラムとscatterが描かれますが、kind='hex'を指定するとscatterの密度になります。

```python
sns.jointplot(x=BTC['Return'], y=ETH['Return'], kind='hex')
```

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/531e0131-4870-20e2-ece3-88b392332492.png">

かなり強い相関があることが分かります。では、アップルとグーグルではどうでしょうか。


```python
sns.jointplot(x=AAPL['Return'], y=GOOG['Return'], kind='hex', color='seagreen')
```

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/a38e8437-6e21-7192-4001-406728880efb.png">

こちらも相関関係があることが分かりました。
ビットコインとアップルではどうでしょうか。


```python
sns.jointplot(x=df_returns['BTC'], y=df_returns['AAPL'], kind='hex', color='indianred')
```

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/695975e8-7640-5d5a-b566-f896b3ced857.png">

こちらはあまり相関はなさそうです。
最後に、全ての銘柄をまとめて表示してみます。pairplot関数を用いれば3つ以上のデータについてjointplotのペアを表示することができます。

```python
sns.pairplot(df_returns.dropna())
```

![pairplot_return.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/c1e752f5-466c-8902-ea7c-1bd04c483809.png)

この場合、実質的に同じscatterが２つ存在してしまうので、上にscatter、下にカーネル密度推定を表示することもできます。PiarGrid関数を使います。初値について見てみます。

```python
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')
```

![pairgrid_open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/d086c97a-0147-e790-22aa-03877f095bd4.png)

最後に、相関係数を表示します。


```python
sns.heatmap(df_returns.corr(), annot=True)
```

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1315219/11e48d4b-038a-082d-8486-16d14d7a730f.png">

全体を見ると、

* IT企業同士、ドージコイン以外の仮想通貨は相関関係がある
* ドージコインはかなり特殊なデータである

ということが可視化の結果から分かるでしょうか。
今回は、仮想通貨とIT企業の株価を見てみましたが、金など他の資産との相関を調べてみるのも面白そうです。