再編成した東証市場のプライム等区分別銘柄一覧の取得

# はじめに

[以前書いた記事](./58a912a9b75313cffa46)で日経平均、ダウなどの構成銘柄一覧を取得する方法を紹介した。
日経平均だと225銘柄なのでもう少し幅を広げたい場合にTOPIX、東証プライム、スタンダード、グロースなど分類できる。

ここの記事([Pythonで株価の東証の銘柄コード一覧を取得して、東証1部、2部、TOPIXに整理](https://qiita.com/kanagii_codes/items/d33f3b1532802413e619)、以下元ネタ)で大概の事が書いてあるのでわざわざ書く必要も無いのだが少し情報を追加して紹介したい。

# 実装

## 東証市場再編成

2022年4月1日より東京証券取引所が市場再編成を行った([市場区分見直しの概要 \| 日本取引所グループ](https://www.jpx.co.jp/equities/market-restructure/market-segments/index.html))。
そしてJPXから提供されるデータもようやく更新されたようだ。

そのため元ネタにある方法は手直しが必要となる。

## 東証銘柄一覧の取得

とはいえ大した変更をするわけではない。
一点、書き加えたいのがJPXのエクセルデータを`Pandas`のデータフレームに落とし込むときに一旦ダウンロードする例をよくみかけるが以下のように直接読み込める。
なお、ダウンロードに関係なく`read_excel`を利用するには`xlrd`が必要である。

```python
url = 'https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls'
df_jpx = pd.read_excel(url)
df_jpx = df_jpx.iloc[:, [1, 2, 3, 9]]
```

結果

```
コード	銘柄名	市場・商品区分	規模区分
0	1301	極洋	プライム（内国株式）	TOPIX Small 2
1	1305	ダイワ上場投信－トピックス	ETF・ETN	-
2	1306	ＮＥＸＴ　ＦＵＮＤＳ　ＴＯＰＩＸ連動型上場投信	ETF・ETN	-
3	1308	上場インデックスファンドＴＯＰＩＸ	ETF・ETN	-
4	1309	ＮＥＸＴ　ＦＵＮＤＳ　ＣｈｉｎａＡＭＣ・中国株式・上証５０連動型上場投信	ETF・ETN	-
...	...	...	...	...
4179	9993	ヤマザワ	スタンダード（内国株式）	-
4180	9994	やまや	スタンダード（内国株式）	-
4181	9995	グローセル	プライム（内国株式）	TOPIX Small 2
4182	9996	サトー商会	スタンダード（内国株式）	-
4183	9997	ベルーナ	プライム（内国株式）	TOPIX Small 1

4184 rows × 4 columns
```

## 東証プライム銘柄一覧の取得

上記リストからプライムに絞り込む。

```python
df_tse_prim = df_jpx.loc[df_jpx["市場・商品区分"].str.contains('プライム')]
df_tse_prim = df_tse_prim.iloc[:, [0, 1]]
df_tse_prim.columns = ['symbol', 'name']
```

結果

```
symbol	name
0	1301	極洋
19	1332	日本水産
20	1333	マルハニチロ
37	1375	雪国まいたけ
39	1377	サカタのタネ
...	...	...
4176	9989	サンドラッグ
4177	9990	サックスバー　ホールディングス
4178	9991	ジェコス
4181	9995	グローセル
4183	9997	ベルーナ

1839 rows × 2 columns
```

TOPIXをいろいろ分類したい場合は元ネタを参照されたし。

## 国内株の銘柄一覧取得

ここで終わるとただの元ネタの書き直しなので追加情報を加えたい。
株価の情報としてはYahoo Financeが秀逸なんだけども少なくとも自分の調べた限り銘柄リストを取得する方法が見当たらない。
そこで以下のサービスを利用することで国内株というか世界中の株の銘柄リストが取得できる。

## investing.comから国内株を取得

[investpy](https://github.com/alvarobartt/investpy)を使えばinvesting.com (https://www.investing.com/) から簡単にデータを取得できる。

```python
from investpy.stocks import get_stocks

df_investpy_jp = get_stocks(country='Japan').iloc[:, [5, 2]]

"""
# 別のやり方
from investpy.stocks import get_stocks_dict

raw = get_stocks_dict(country='Japan', columns=['symbol', 'full_name'])
df_investpy_jp = pd.DataFrame.from_dict(raw)
"""
```

結果

```
symbol	full_name
0	1332	Nippon Suisan Kaisha, Ltd.
1	4061	Denki Kagaku Kogyo K.K.
2	5714	DOWA Holdings Co., Ltd.
3	7011	Mitsubishi Heavy Industries, Ltd.
4	8604	Nomura Holdings Inc
...	...	...
3700	7673	Daiko Tsusan Co Ltd
3701	1451	KHC
3702	7065	Upr Corp
3703	7677	Yashima & Co Ltd
3704	3440	Nisso Pronity Co Ltd

3705 rows × 2 columns
```

お分かりの通りわざわざ`Japan`を指定して国内株に絞っているのでそこを変更すればいろんな国の情報が取得できる。

## JPXのデータとマージする

あまり意味が無いかもしれないけどJPXで取得したデータとマージして会社名の日本語・英語表記に変更してみる。

```python
df_tse_prim['symbol'] = df_tse_prim['symbol'].astype(str)
df_investpy_jp['symbol'] = df_investpy_jp['symbol'].astype(str)
df_prim = pd.merge(df_tse_prim, df_investpy_jp, on='symbol').rename(columns={'full_name': 'name(en)'}).set_index('symbol')
```
結果

```
symbol	name	name(en)
1301	極洋	Kyokuyo
1332	日本水産	Nippon Suisan Kaisha, Ltd.
1333	マルハニチロ	Maruha Nichiro Corp
1377	サカタのタネ	Sakata Seed Corp
1379	ホクト	Hokuto Corp
...	...	...
9989	サンドラッグ	Sundrug Co Ltd
9990	サックスバー　ホールディングス	Sac’s Bar Holdings Inc
9991	ジェコス	Gecoss Corp
9995	グローセル	Renesas Easton Co Ltd
9997	ベルーナ	Belluna Co Ltd

1804 rows × 2 columns
```
## (別解)twelvedata.comから国内株を取得

APIキーが必要だがtwelvedata.com (https://twelvedata.com/) からも取得できる。
提供されている[Pythonライブラリ](https://github.com/twelvedata/twelvedata-python)はWebSocketが使えて便利だけども今回は銘柄リストを取得するだけなのでシンプルにAPIを叩く。

```python
import requests

api_key = '<your twelvedata.com api key>'
endpoint = f'https://api.twelvedata.com/stocks?country=japan&apikey={api_key}'

raw = requests.get(endpoint)
df_12 = pd.DataFrame.from_dict(raw.json()['data']).iloc[:, [0, 1]].set_index('symbol')
```

結果

```
symbol	name
1301	Kyokuyo Co., Ltd.
1332	Nippon Suisan Kaisha, Ltd.
1333	Maruha Nichiro Corporation
1352	Hohsui Corporation
1375	Yukiguni Maitake Co., Ltd.
...	...
9993	Yamazawa Co., Ltd.
9994	Yamaya Corporation
9995	Glosel Co., Ltd.
9996	Satoh & Co., Ltd.
9997	Belluna Co., Ltd.

3912 rows × 1 columns
```

investing.comと件数が違うが面倒くさいので後で調べる(w。

# 最後に

投資する際には必要な株価や会社の指標などを調べることが重要だが全銘柄を対象にするのはネットワークの負荷を増やし情報過多になるだけのように思える。
そのためインデックス登録銘柄など絞り込んだほうがより効率的だと考えられるのでまず手始めに銘柄リストを取得してみた。

今回紹介した記事の全ソースはこちら。

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