米国株からスクリーニングするとき,ナスダック銘柄は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() #ナスダック銘柄を取得
という感じでナスダック銘柄を取得できます.
今回の内容も含めて,詳しくは以下の記事に書いてあります.