2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-24

仮想通貨の価格と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())

pairplot_return.png

この場合、実質的に同じ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')

pairgrid_open.png

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

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

全体を見ると、

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

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?