お金の健康

投資にプログラミングを使いたい!ビットコインと株価の関係

こんにちはー、ウチダです。

ぼくは経済や金融、投資が好きなので、投資とプログラミングの組み合わせを勉強しています。

今回はビットコインの価格と株価の関係を調査したので、その結果をお話します。

投資にプログラミングを使いたい!

ぼくはプログラミング言語の中で、Pythonを独学しています。

Pythonはデータ分析、AI、機械学習、深層学習といった分野で主要言語となっています。

コードがシンプルで読み書きしやすい特徴から初学者でも勉強しやすいプログラミング言語です。

Pythonには外部ライブラリが使えるという特徴があり、天才たちが作ってくれたライブラリをインストールすれば、自分のプログラムで自由に使えます。

最初にビットコインの価格と株価の関係を調べるために、yahoo financeからビットコインとS&P 500の価格を取得し、チャートで表示します。

プログラミングでチャートを表示する

まずyahoo financeのサイトでビットコインとS&P 500を調べると、シンボルがそれぞれBTC-USD^GSPCになっています。

図1 yahoo!financeのサイト(Bitcoin)

(引用:Yahoo!finance、Bitcoin USD(BTC-USD):リンク

(引用:Yahoo!finance、S&P 500(^GSPC):リンク

したがって、シンボルにはBTC-USD、^GSPCをそれぞれ使います。

期間は2014年9月16日〜2020年10月31日、価格は終値(Close)を使ってグラフを作成しました。

コードはこんな感じです。

#import libraries
from pandas_datareader import data
import pandas as pd
from pylab import mpl, plt
import numpy as np
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline

#date
start = '2014-09-16'
end = '2020-10-31'

#get a data of BTC
BTC_df = data.DataReader('BTC-USD', 'yahoo', start, end)
BTC_date = BTC_df.index
BTC_price = BTC_df['Close']

#get a data of S&P 500
SP500_df = data.DataReader('^GSPC', 'yahoo', start, end)
SP500_date = SP500_df.index
SP500_price = SP500_df['Close']

#show a price chart
plt.figure(figsize=(10, 6))
plt.plot(BTC_date, BTC_price, label = 'Bitcoin', color='g')
plt.plot(SP500_date, SP500_price, label = 'S&P 500', color='b')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("BTC_SP500_1.png")

できあがったグラフがこちらです。

図2 価格チャート

ビットコインの値動きが大きすぎて、Y軸を共有するとS&P 500が直線にしか見えないです。

ビットコインの価格は第2軸で表示します。

#show a price chart
fig, ax1 = plt.subplots(figsize=(10, 6))
plt.plot(SP500_date, SP500_price, label = 'S&P 500', color='b')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('S&P 500 price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
ax2 = ax1.twinx()
plt.plot(BTC_date, BTC_price, label = 'Bitcoin', color='g')
plt.legend(loc=6, fontsize=18)
plt.ylabel('BTC price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("BTC_SP500_2.png")

できあがったグラフはこちらです。

図3 価格チャート(右側がビットコインの価格)

傾向はあまり似ていないように見えます。

株価が大きく下がったときはビットコインも下がっているようにも見えますが、どうなんでしょう。

ちなみに2014年からビットコインを保有していたら、どのくらい儲かるのでしょうか?

対数収益率を計算して、2000年から保有しているS&P 500、金、銀と比較します。

#get a data of BTC
BTC_data = pd.DataFrame()
BTC_data['BTC'] = BTC_df['Close']
BTC_rets = np.log(BTC_data / BTC_data.shift(1))
BTC_rets.dropna(inplace=True)
BTC_rets = BTC_rets.cumsum().apply(np.exp)
BTC_date = BTC_rets.index
BTC_return = BTC_rets['BTC']

#date
start = '2000-01-03'
end = '2020-10-31'

#get datum of other asset
SP500_df = data.DataReader('^GSPC', 'yahoo', start, end)
gold_df = data.DataReader('GC=F', 'yahoo', start, end)
silver_df = data.DataReader('SI=F', 'yahoo', start, end)
df = pd.DataFrame()
df['SP500'] = SP500_df['Close']
df['gold'] = gold_df['Close']
df['silver'] = silver_df['Close']
rets = np.log(df / df.shift(1))
rets.dropna(inplace=True)
rets = rets.cumsum().apply(np.exp)
date = rets.index
SP500_return = rets['SP500']
gold_return = rets['gold']
silver_return = rets['silver']

#show a return chart
plt.figure(figsize=(10, 6))
plt.plot(BTC_date, BTC_return, label = 'Bitcoin', color='g')
plt.plot(date, gold_return, label = 'Gold', color='y')
plt.plot(date, silver_return, label = 'Silver', color='grey')
plt.plot(date, SP500_return, label = 'S&P 500', color='b')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('return', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("BTC_gold_silver_SP500_1.png")

できあがったグラフがこちらです。

図4 各資産のリターン

ビットコインの上がり方が半端ないです!

2018年、仮想通貨バブルの時期は40倍を超えています。

6倍になった金、8倍になった銀でさえ、ちっぽけに見えます。

素晴らしいリターンです。

次に株価との相関を調べます。

プログラミングで相関を調べる

ビットコインとS&P 500の対数収益率を再度計算して、相関を調べます。

#get a data of BTC, S&P 500
BTC_rets = np.log(BTC_data / BTC_data.shift(1))
SP500_rets = np.log(SP500_data / SP500_data.shift(1))

#make a DataFrame
frame = pd.DataFrame()
frame['BTC'] = BTC_rets['BTC']
frame['SP500'] = rets['SP500']
frame.dropna(inplace=True)

#show a scatter matrix
pd.plotting.scatter_matrix(frame,
                          alpha=0.2,
                          diagonal='hist',
                          hist_kwds={'bins':35},
                          figsize=(10,6));
plt.savefig("BTC_SP500_4.png")

できあがったグラフがこちらです。

図5 散布図マトリックス

ビットコインの価格と株価は、あまり相関がなさそうです。

最小二乗法による回帰分析も行います。

#OLS analysis
reg = np.polyfit(frame['BTC'], frame['SP500'], deg=1)

#show a scatter
plt.figure(figsize=(10, 6))
plt.scatter(frame['BTC'], frame['SP500'], marker='o')
plt.plot(frame['BTC'], np.polyval(reg, frame['BTC']), 'r', lw=2)
plt.xlabel('BTC return rate', fontsize=18)
plt.ylabel('S&P 500 return rate', fontsize=18)
plt.savefig("BTC_SP500_5.png")

できあがったグラフがこちらです。

図6 OLS分析の結果

やっぱり相関がなさそうです。

相関尺度も0.1未満です。

図7 相関尺度

分散投資の観点だと、相関が低いものに投資するのが良いので、株とビットコインの組み合わせは良いといえます。

バイナンスの研究レポートでも、ポートフォリオへのビットコインの組み入れはリスク・リターン向上に非常に有益と出ています。

(参考:COIN POST、バイナンス研究レポート:ビットコイン組み入れはリスク・リターン向上に非常に有益:リンク

直近3年間は他の資産とビットコインの相関が低くなっているので、ポートフォリオにビットコインを組み入れるのは分散投資に有効だという主張です。

ぼくの分析も、ビットコインのデータが2014年の9月からなので、6年分だけです。

ただ、ビットコインは歴史が浅いので、資産としての位置づけはこれから評価されていくものと思います。

まとめ

今回はビットコインの価格と相関するものを調査した話をしました。

株価よりも値動きが大きいので、大きなリターンを求めるならビットコインに注目です。

ここまで読んでくださりありがとうございました。^^

-お金の健康