PythonTrend

【Python】オススメ株価分析ツール|個別銘柄の株価の相関係数ヒートマップの作り方

Python

はじめに

ある個別銘柄間の株価の相関を分析したいと思った人は、多いはず。他人が知らない情報を掴むために、自分で情報を獲得することが大切です。

そこで、今回は、個別銘柄間の相関係数を求め、ヒートマップにするツールを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)

コメント

タイトルとURLをコピーしました