はじめに
株式投資においては銘柄探しが重要である。
国内だけも何千とある銘柄をスクリーニングしてお化け株を探し出すのは困難であるし、そもそも投資は博打ではないのでこのようなお宝探しは現実的ではない。
個人的には過去に数回遭った憂き目(持ち株会社が倒産)から新興市場の銘柄は手を出さないほうがよいという教訓を得ている。
そのため最近では国内株だと東証プライム(≒旧東証一部)をメインに取引している。
とはいうものの武富士で苦い思いをしたのだが。
そうすると上場企業すべてを把握するよりある程度安定した企業の銘柄を絞ったほうが自分としては都合がよい。
また数年前より米国株も取引しているので、今回は国内株と合わせて主な指数の構成銘柄を取得してみた。
各指数
日経平均株価指数(日経225)
SBI証券バージョン
import pandas as pd
url = 'https://site1.sbisec.co.jp/ETGate/?OutSide=on&_ControlID=WPLETmgR001Control&_PageID=WPLETmgR001Mdtl20&_DataStoreID=DSWPLETmgR001Control&_ActionID=DefaultAID&getFlg=on&burl=search_market&cat1=market&cat2=none&dir=info&file=market_meigara_225.html'
# テーブルリストを取得
table_list = pd.read_html(url)
# 2番目が該当するテーブルなのでデータフレーム化
df_nk225_sbi = table_list[1]
# 最初の2カラムのみ残す
df_nk225_sbi = df_nk225_sbi.iloc[:, [0, 1]]
# カラム名を指定
df_nk225_sbi.columns = ['symbol', 'name']
# インデックスの設定
df_nk225_sbi = df_nk225_sbi.set_index('symbol')
結果
name
symbol
1332 日本水産
1333 マルハニチロ
1605 INPEX
1721 コムシスホールディングス
1801 大成建設
... ...
9613 エヌ・ティ・ティ・データ
9735 セコム
9766 コナミホールディングス
9983 ファーストリテイリング
9984 ソフトバンクグループ
日経平均株価(日経225)採用銘柄一覧表(2021.9.1現在) - fragment.database.バージョン
import pandas as pd
url = 'http://www13.plala.or.jp/bigdata/nikkei225.html'
# 1行目をヘッダとしてテーブルリストを取得
table_list = pd.read_html(url, header=[0])
# 5番目が該当するテーブルなので最下行のタイトル行を落としてデータフレーム化
df_nk225_fd = table_list[4][:-1]
# 最初の2カラムのみ残す
df_nk225_fd = df_nk225_fd.iloc[:, [0, 1]]
# df_nk225_fd = df_nk225_fd.rename(columns={'コード': 'symbol', '銘柄名': 'name' })
# カラム名を指定
df_nk225_fd.columns = ['symbol', 'name']
# インデックスの設定
df_nk225_fd = df_nk225_fd.set_index('symbol')
結果
name
symbol
4151 協和キリン
4502 武田
4503 アステラス
4506 大日本住友
4507 塩野義
... ...
9501 東電HD
9502 中部電
9503 関西電
9531 東ガス
9532 大ガス
[225 rows x 1 columns]
Dow Jones Industrial Average(ダウ平均株価, NYダウ)
Wikipedia(英語)バージョン
import pandas as pd
url = 'https://en.wikipedia.org/wiki/Dow_Jones_Industrial_Average'
table_list = pd.read_html(url)
df_dji_wp = table_list[1].iloc[:,[2,0]]
df_dji_wp.columns = ['symbol', 'name']
df_dji_wp = df_dji_wp.set_index('symbol')
結果
name
symbol
MMM 3M
AXP American Express
AMGN Amgen
AAPL Apple
BA Boeing
CAT Caterpillar
CVX Chevron
CSCO Cisco
KO Coca-Cola
DIS Disney
DOW Dow
GS Goldman Sachs
HD Home Depot
HON Honeywell
IBM IBM
INTC Intel
JNJ Johnson & Johnson
JPM JPMorgan Chase
MCD McDonald's
MRK Merck
MSFT Microsoft
NKE Nike
PG Procter & Gamble
CRM Salesforce
TRV Travelers
UNH UnitedHealth
VZ Verizon
V Visa
WBA Walgreens Boots Alliance
WMT Walmart
SBI証券(日本語)バージョン
import pandas as pd
url = 'https://site1.sbisec.co.jp/ETGate/WPLETmgR001Control?OutSide=on&getFlg=on&burl=search_home&cat1=home&cat2=learn&dir=learn&file=home_lecture_sihyou_08.html'
table_list = pd.read_html(url)
df_dji_sbi = table_list[1]
df_dji_sbi.columns = ['symbol', 'name']
df_dji_sbi = df_dji_sbi.set_index('symbol')
結果
name
symbol
AAPL アップル
AXP アメリカン・エキスプレス
BA ボーイング
CAT キャタピラー
CSCO シスコシステムズ
CVX シェブロン
DIS ウォルト・ディズニー
DWDP ダウ・デュポン
GS ゴールドマン・サックス・グループ
HD ホーム・デポ
IBM IBM
INTC インテル
JNJ ジョンソン・エンド・ジョンソン(J&J)
JPM JPモルガン・チェース・アンド・カンパニー
KO コカ・コーラ
MCD マクドナルド
MMM 3M
MRK メルク
MSFT マイクロソフト
NKE ナイキ
PFE ファイザー
PG プロクター・アンド・ギャンブル(P&G)
TRV トラベラーズ
UNH ユナイテッドヘルス・グループ
UTX ユナイテッド・テクノロジーズ
V ビザ
VZ ベライゾン・コミュニケーションズ
WBA ウォルグリーン・ブーツ・アライアンス
WMT ウォルマート
XOM エクソンモービル
National Association of Securities Dealers Automated Quotations 100(NASDAQ100)
Wikipedia(英語)バージョン
import pandas as pd
url = 'https://en.wikipedia.org/wiki/Nasdaq-100'
table_list = pd.read_html(url)
df_nasdaq_wp = table_list[3].iloc[:, [1, 0]]
df_nasdaq_wp.columns = ['symbol', 'name']
df_nasdaq_wp = df_nasdaq_wp.set_index('symbol')
結果
name
symbol
ATVI Activision Blizzard
ADBE Adobe
ADP ADP
ABNB Airbnb
ALGN Align
... ...
WBA Walgreens Boots Alliance
WDAY Workday
XEL Xcel Energy
ZM Zoom
ZS Zscaler
[102 rows x 1 columns]
Daiwa Asset Management(日本語)バージョン
url = 'https://www.daiwa-am.co.jp/special/nasdaq100/brand/'
table_list = pd.read_html(url)
df_nasdaq_daiwa = table_list[0]
df_nasdaq_daiwa.columns = ['symbol', 'name']
df_nasdaq_daiwa = df_nasdaq_daiwa.set_index('symbol')
結果
name
symbol
AAPL アップル
MSFT マイクロソフト
AMZN アマゾン・ドット・コム
FB メタ・プラットフォームズ
TSLA テスラ
... ...
SWKS スカイワークス・ソリューションズ
SIRI シリウスXMホールディングス
PDD ピンドゥオドゥオ
SPLK スプランク
PTON ペロトン・インタラクティブ
[101 rows x 1 columns]
Standard and Poor's 500(S&P 500)
Wikipedia(英語)バージョン
import pandas as pd
url = 'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'
table_list = pd.read_html(url)
df_sp_wp = table_list[0].iloc[:, [0,1]]
df_sp_wp.columns = ['symbol', 'name']
df_sp_wp = df_sp_wp.set_index('symbol')
結果
name
symbol
MMM 3M
AOS A. O. Smith
ABT Abbott
ABBV AbbVie
ABMD Abiomed
... ...
YUM Yum! Brands
ZBRA Zebra
ZBH Zimmer Biomet
ZION Zions Bancorp
ZTS Zoetis
[504 rows x 1 columns]
上記すべてを一括実行
以下のGithubからOpen in Colab
リボンクリックでGoogle Colaboratory
で実行できる。
まとめ
スクリーニングやバックテストを行うに際して必要となる銘柄リストの取得について解説した。
かつては自前でスクレイピングしていたものがpandas
が意図も簡単にやってくれる。
HTMLの構文解析は元のソースをいじられると即死するのだけど本例のような銘柄取得だけであれば簡単にできるので修正するのにもさほど手間はかからない。
本当は東証プライムの構成銘柄がほしかったが以下のリンクにあるようにJPXからのデータを元にしている例が多い。
Pythonで株価の東証の銘柄コード一覧を取得して、東証1部、2部、TOPIXに整理
ところが2022年4月に東京証券取引所が市場再編成を実施し今日現在(2022/4/30)確認してもまだデータが更新されていない。
そのため別の手段を考えるか更新されるのを待つかどちらかだと思い、自分は後者を選んだので今回は割愛した。
一方、米国株はいくつか取得手段があるので情報を得るには国内株よりは苦労しない。
短期的と判断してよいのかはわからないけどGAFAMなどはほどよく下げているので絶好の買い場にも思えるがいかんせん円安のため米ドル換金に躊躇してしまうのと5年スパンくらいでチャートを眺めるとここ1,2年で急上昇しているためまだまだ下げて調整する余地があるようにも思える。
そんなこんなでなかなかうまく投資ができていないが今回の銘柄リストから時系列データを取得しバックテストを実施し銘柄選びを行いたい。