LoginSignup
1
6

More than 3 years have passed since last update.

【Python】S&P500から低PERの銘柄をスクリーニングする

Posted at

米国株からスクリーニングするとき,ナスダック銘柄は1万銘柄とかあるので,そこからスクリーニングするのは時間がかかって仕方がありません.

そこで思いつくのが,500銘柄程度しかないインデックスであるS&P500からスクリーニングするということです.

S&P500の銘柄データ(チェッカーシンボル)を持ってくる

S&P500銘柄が一覧になっているデータを探すしかありません.

Wikipediaに記載されている銘柄をまとめたと考えられているCSVデータが,以下のURLにあります.

参考:配当再投資でのんびり投資(https://nonbiri-reinvest.net/post-692/)

ただし,公式かどうかは怪しいので,正確ではないかもしれません.また,S&P500の組入れ銘柄は定期的に入れ替わるので,最新の銘柄を取得し続ける必要があります.公式で一覧になっているものが見つかれば,再掲したいです.

これを以下のようにPython(pandas)で呼んでやれば,S&P500だけのデータを取得できます.

import pandas as pd
url = "https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv"
df = pd.read_csv(url, encoding="SHIFT_JIS")
print(df)
    Symbol                 Name                  Sector
0      MMM           3M Company             Industrials
1      AOS      A.O. Smith Corp             Industrials
2      ABT  Abbott Laboratories             Health Care
3     ABBV          AbbVie Inc.             Health Care
4     ABMD              Abiomed             Health Care
..     ...                  ...                     ...
500    YUM      Yum! Brands Inc  Consumer Discretionary
501   ZBRA   Zebra Technologies  Information Technology
502    ZBH        Zimmer Biomet             Health Care
503   ZION        Zions Bancorp              Financials
504    ZTS               Zoetis             Health Care

これで,S&P500の銘柄を取得できました(たぶん).

低PERの銘柄をスクリーニングする

以下のコードでできます.

import pandas as pd
import pandas_datareader.data as web

pers = pd.DataFrame({'PER':['']}, index=['銘柄'])
error_symbols = []
for c in codelist['Symbol']:
    try:
        per = web.get_quote_yahoo(c)['trailingPE']
        if per[c] < 10:
            pers.loc[c] = per[c]
    except:
        error_symbols.append(c)

print(pers)

構造としては,pandas_datareaderのget_quote_yahooで各銘柄のPER(正確にはtrailingPE)を見ていき,PERが10以下ならpersというDataFrameにシンボルとPERを格納します.

深くは考えていませんが,エラーが起きた時にはerror_symbolsというリストに入るようにしています.

これ(もしくは本記事の最後のまとめコード)を実行すると,以下が得られます.

          PER
銘柄
AFL   7.81709
ALL    6.7747
BIO   4.51307
CE    8.71157
EBAY   7.3074
KIM   8.76055
MHK    3.7743
PGR   9.66667
PHM   9.60201
COO   8.52827
UNM   7.40874

3分ほどでスクリーニングできました.S&P500でも結構かかりますね.

まとめコード

S&P500から低PERの銘柄をスクリーニングするコードです.

import pandas as pd
import pandas_datareader.data as web

url = "https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv"
codelist = pd.read_csv(url, encoding="SHIFT_JIS")

pers = pd.DataFrame({'PER':['']}, index=['銘柄'])
error_symbols = []
for c in codelist['Symbol']:
    try:
        per = web.get_quote_yahoo(c)['trailingPE']
        if per[c] < 10:
            pers.loc[c] = per[c]
    except:
        error_symbols.append(c)

print(pers)

ちなみに:ナスダック銘柄からスクリーニングする

ナスダック銘柄からスクリーニングする場合は,

from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
codelist = get_nasdaq_symbols() #ナスダック銘柄を取得

という感じでナスダック銘柄を取得できます.

今回の内容も含めて,詳しくは以下の記事に書いてあります.

1
6
0

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
1
6