LoginSignup
9

More than 3 years have passed since last update.

S&P500構成銘柄の株価のデータをyahoo financeから取得し、相関の高いペアを見つける。

Last updated at Posted at 2019-11-12

記事概要

「株Aが上がると、株Bも上がる」「株Aが下がると、株Bも下がる」というような現象を「連れ高」、「連れ安」と言います。天才トレーダーのBNFさんは株式の売買にこれを利用して大儲けしたそうです。
自分も真似をして大儲け!と思ったのですが、連動するペアを見つける方法って調べてもいいものがでてこない。
そこで、Pythonで実装してみたので、コードとその説明を公開します。

コード

Githubに置いています。ご自由にどうぞ
https://github.com/toshiikuoo/puclic/blob/master/%E6%A0%AA%E4%BE%A1%E7%9B%B8%E9%96%A2.ipynb

動作

動作の流れは次のようになります

wikipediaのS&P500のページから銘柄一覧の情報を取得

取得した銘柄一覧の株価をyahoo financeから取得

全ての銘柄の組み合わせのペアについて株価の相関を算出 ※相関:二つのデータがどれだけ似ているかを数値化したもの

相関が大きい順にペアを並び替え

コードの説明

上のコードを抜粋しながら説明します。

  • 必要なライブラリのインポート

# 必要なライブラリimport
!pip install lxml html5lib beautifulsoup4

import pandas as pd
from pandas import Series,DataFrame
from pandas_datareader import DataReader

import numpy as np

from datetime import datetime

from scipy.stats.stats import pearsonr
import itertools

# Install yfinance package.

!pip install yfinance

# Import yfinance
import yfinance as yf  

  • wikipediaのS&P500のページから銘柄一覧の情報を取得。銘柄のlistを作成。
# S&P全銘柄のリストを作成
url="https://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
sp500_list=pd.read_html(url)[0].Symbol.values.tolist()
len(sp500_list)
  • yahoo financeから銘柄のlistの株価を取得。
# sp500銘柄の終値を1つのDataFrameに格納
close_sp500_list=yf.download(sp500_list_yahoo,'2019-10-04','2019-11-01')["Adj Close"]
  • 取得した株価から相関を算出
# 列ごとのペアで相関を算出

# 算出した相関を入れるための辞書型作成
correlations={}

# 相関を算出
for cola,colb in itertools.combinations(sp500_list_yahoo,2):
  nas=np.logical_or(np.isnan(close_sp500_list.loc[:,cola]),np.isnan(close_sp500_list.loc[:,colb]))
  try:
    correlations[cola + '__'+ colb]=pearsonr(close_sp500_list.loc[:,cola][~nas],close_sp500_list.loc[:,colb][~nas])
  except ValueError:
    pass    

# 出力された結果"correlations"はリスト形式なのでDataFrameに変換
result=DataFrame.from_dict(correlations,orient='index')
result.columns=['PCC','p-value']
print(result.sort_values('PCC'))

結果

最終的な出力は以下。各銘柄ペアの相関がソートされて出力されている。

           PCC       p-value
BKR__SPGI   -0.968878  1.437804e-03
BIIB__HAS   -0.962712  8.038530e-13
BKR__PGR    -0.959178  2.465597e-03
PGR__WCG    -0.941347  6.818268e-11
CI__PGR     -0.935051  1.840799e-10
...               ...           ...
CNC__WCG     0.996087  1.493074e-22
BKR__PRGO    0.997290  1.101006e-05
CBS__VIAB    0.998546  7.579099e-27
BBT__STI     0.998835  8.266321e-28
GOOGL__GOOG  0.999502  1.701271e-31

[127260 rows x 2 columns]

今後のアクション

出力結果を使って相関の高い銘柄群のグループ化をしたい。
(質問・改善点など気軽に連絡ください。初投稿なのでおかしなとこあると思います。Github難しい。。。)

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
9