はじめに
ある個別銘柄間の株価の相関を分析したいと思った人は、多いはず。他人が知らない情報を掴むために、自分で情報を獲得することが大切です。
そこで、今回は、個別銘柄間の相関係数を求め、ヒートマップにするツールをPythonで実装します。
相関係数とは?
相関係数とは、2種類のデータの直線的な関係性の強さを −1−1 から +1+1 の間の値で表した数のこと。直線的でない2種類のデータは相関係数が0に近い傾向になるので、注意が必要です。
相関なし
相関なし(0)横軸と縦軸の間に相関がないデータは、2次元空間にまばらなデータになります。
二つの個別銘柄の株価に関連がないことを表します。
負の相関
負の相関(−1)は、右下に下がる直線の関係を表します。
つまり、ある個別銘柄1の株価が上がると、ある個別銘柄2の株価が下がるということを表します。
正の相関
正の相関(+1)は、右上に上がる直線の関係を表します。
つまり、ある個別銘柄1の株価が上がると、ある個別銘柄2の株価も上がるということを表します。
ヒートマップとは
ヒートマップとはデータを可視化するために、行列型の数字データの強弱を色で視覚化する方法です。
例えば、相関係数でヒートマップとは、以下のようなものです。左と下の4桁の数字は、銘柄コードとなります。
- 9433:KDDI
- 9437:NTTドコモ
- 7751:Canon
- 6724:セイコーエプソン
- 8473:SBIホールディングス
- 9143:SGホールディングス
2020年のデータになります。
例えば左の番号が 9433、下の番号が9437の合わさるブロックの色を確認すると「薩摩色」です。
薩摩色は、0.3程度です。あまり相関がないと言えます。
毎年、KDDIとNTTドコモは同じ通信業界ということもあり、相関係数は高いのですが、2020年は低いです。これは、NTTドコモは、TOBにより株価が急騰した影響です。
といった具合に分析ができます。
実装
使用するライブラリ
本記事で使用する各ライブラリのバージョンは以下の通りです。
– Python 3.6.8
– Numpy 1.15.4
– Pandas 1.1.4
– matplotlib 3.0.2
– seaborn 0.11.0
BeautifulSoup
BeautifulSoupの解説はこちらを参照ください。
seaborn
seabornの長所
以下2点が、matplotlibと比較した際のseabornの長所です。
- ・綺麗な図を描くことができる
- ・matplotlibと比べて少ないコードで描画できる
seabornのインストール
※seabornを利用するためには、Pythonのバージョンは3.6以上である必要です。
さて、最新バージョンのseabornをインストールするには、
Mac:ターミナル
Windows:コマンドプロンプト
にて、pipコマンドを用います。
pip install seaborn
また、Anacondaを利用している場合には、condaコマンドを用います。
conda install seaborn
Seabornでヒートマップ
seaborn.heatmap(data, vmin=None, vmax=None)
vminでdataが取りうる最小値を指定する。
vmaxでdataが取りうる最大値を指定する。
コード全文
以下で分析したい年数と、銘柄コードを指定する。
year = 2020
stock_number = [9433,9437,7751,6724,8473,9143]
[‘始値’,’高値’,’安値’,’終値’,’出来高’,’終値調整’]のうち’終値’で分析をする。
その他で分析したい場合は、以下の終値を変更ください。
df=df.rename(columns={‘終値’: str(n)})
from bs4 import BeautifulSoup
import pandas as pd
import requests
from datetime import datetime
import seaborn as sns
import matplotlib.pyplot as plt
#stock_numberの相関係数を求める。
year = 2020 #2020年
stock_number = [9433,9437,7751,6724,8473,9143]
def get_kabuka(stock_number,year):
piason_array=pd.DataFrame()
for n in stock_number:
url = 'https://kabuoji3.com/stock/{}/{}/'.format(n,year)
headers = {
"User-Agent": "Chrome"
}
soup = BeautifulSoup(requests.get(url, headers = headers).content, 'html.parser')
tag_tr = soup.find_all('tr')
head = [h.text for h in tag_tr[0].find_all('th')] #テーブルのヘッドの取得
#テーブルの各データの取得
data = []
for i in range(1,len(tag_tr)):
data.append([d.text for d in tag_tr[i].find_all('td')])
df = pd.DataFrame(data, columns = head)
#カラムの設定
col = ['始値','高値','安値','終値','出来高','終値調整']
for m in col:
df[m] = df[m].astype(float)
df['日付'] = [datetime.strptime(i,'%Y-%m-%d') for i in df['日付']]
df=df.rename(columns={'終値': str(n)})
piason_array[str(n)]=df[str(n)]
print(piason_array)
coef = piason_array.corr()
print(coef)
plt.figure()
sns.heatmap(coef,vmax=1,vmin=-1)
plt.show()
get_kabuka(stock_number,year)
コメント