日経平均、ダウなどの構成銘柄一覧を取得する

# はじめに

株式投資においては銘柄探しが重要である。
国内だけも何千とある銘柄をスクリーニングしてお化け株を探し出すのは困難であるし、そもそも投資は博打ではないのでこのようなお宝探しは現実的ではない。

個人的には過去に数回遭った憂き目(持ち株会社が倒産)から新興市場の銘柄は手を出さないほうがよいという教訓を得ている。
そのため最近では国内株だと東証プライム(≒旧東証一部)をメインに取引している。

> とはいうものの武富士で苦い思いをしたのだが。

そうすると上場企業すべてを把握するよりある程度安定した企業の銘柄を絞ったほうが自分としては都合がよい。

また数年前より米国株も取引しているので、今回は国内株と合わせて主な指数の構成銘柄を取得してみた。

# 各指数

## 日経平均株価指数(日経225)

[SBI証券](https://www.sbisec.co.jp/ETGate)バージョン

```python
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')
```

結果

```shell
                name
symbol              
1332            日本水産
1333          マルハニチロ
1605           INPEX
1721    コムシスホールディングス
1801            大成建設
...              ...
9613    エヌ・ティ・ティ・データ
9735             セコム
9766     コナミホールディングス
9983     ファーストリテイリング
9984      ソフトバンクグループ
```

[日経平均株価（日経225）採用銘柄一覧表（2021\.9\.1現在） \- fragment\.database\.](http://www13.plala.or.jp/bigdata/nikkei225.html)バージョン

```python
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     東電ＨＤ
9502      中部電
9503      関西電
9531      東ガス
9532      大ガス

[225 rows x 1 columns]
```

## Dow Jones Industrial Average(ダウ平均株価, NYダウ)

Wikipedia(英語)バージョン

```python
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証券(日本語)バージョン

```python
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(英語)バージョン

```python
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(日本語)バージョン

```python
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      シリウスＸＭホールディングス
PDD             ピンドゥオドゥオ
SPLK               スプランク
PTON       ペロトン・インタラクティブ

[101 rows x 1 columns]
```

## Standard and Poor's 500(S&P 500)

Wikipedia(英語)バージョン

```python
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`で実行できる。

https://github.com/higebobo/my-colab/blob/main/List_of_symbols.ipynb

# まとめ

スクリーニングやバックテストを行うに際して必要となる銘柄リストの取得について解説した。

かつては自前でスクレイピングしていたものが`pandas`が意図も簡単にやってくれる。
HTMLの構文解析は元のソースをいじられると即死するのだけど本例のような銘柄取得だけであれば簡単にできるので修正するのにもさほど手間はかからない。

本当は東証プライムの構成銘柄がほしかったが以下のリンクにあるように[JPX](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)からのデータを元にしている例が多い。

[Pythonで株価の東証の銘柄コード一覧を取得して、東証1部、2部、TOPIXに整理](https://qiita.com/kanagii_codes/items/d33f3b1532802413e619)

ところが2022年4月に東京証券取引所が市場再編成を実施し今日現在(2022/4/30)確認してもまだデータが更新されていない。
そのため別の手段を考えるか更新されるのを待つかどちらかだと思い、自分は後者を選んだので今回は割愛した。

一方、米国株はいくつか取得手段があるので情報を得るには国内株よりは苦労しない。
短期的と判断してよいのかはわからないけどGAFAMなどはほどよく下げているので絶好の買い場にも思えるがいかんせん円安のため米ドル換金に躊躇してしまうのと5年スパンくらいでチャートを眺めるとここ1,2年で急上昇しているためまだまだ下げて調整する余地があるようにも思える。

そんなこんなでなかなかうまく投資ができていないが今回の銘柄リストから時系列データを取得しバックテストを実施し銘柄選びを行いたい。