#記事概要
「株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難しい。。。)