はじめに
以前書いた記事で日経平均、ダウなどの構成銘柄一覧を取得する方法を紹介した。
日経平均だと225銘柄なのでもう少し幅を広げたい場合にTOPIX、東証プライム、スタンダード、グロースなど分類できる。
ここの記事(Pythonで株価の東証の銘柄コード一覧を取得して、東証1部、2部、TOPIXに整理、以下元ネタ)で大概の事が書いてあるのでわざわざ書く必要も無いのだが少し情報を追加して紹介したい。
実装
東証市場再編成
2022年4月1日より東京証券取引所が市場再編成を行った(市場区分見直しの概要 | 日本取引所グループ)。
そしてJPXから提供されるデータもようやく更新されたようだ。
そのため元ネタにある方法は手直しが必要となる。
東証銘柄一覧の取得
とはいえ大した変更をするわけではない。
一点、書き加えたいのがJPXのエクセルデータをPandas
のデータフレームに落とし込むときに一旦ダウンロードする例をよくみかけるが以下のように直接読み込める。
なお、ダウンロードに関係なくread_excel
を利用するにはxlrd
が必要である。
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 NEXT FUNDS TOPIX連動型上場投信 ETF・ETN -
3 1308 上場インデックスファンドTOPIX ETF・ETN -
4 1309 NEXT FUNDS ChinaAMC・中国株式・上証50連動型上場投信 ETF・ETN -
... ... ... ... ...
4179 9993 ヤマザワ スタンダード(内国株式) -
4180 9994 やまや スタンダード(内国株式) -
4181 9995 グローセル プライム(内国株式) TOPIX Small 2
4182 9996 サトー商会 スタンダード(内国株式) -
4183 9997 ベルーナ プライム(内国株式) TOPIX Small 1
4184 rows × 4 columns
東証プライム銘柄一覧の取得
上記リストからプライムに絞り込む。
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を使えばinvesting.com (https://www.investing.com/) から簡単にデータを取得できる。
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で取得したデータとマージして会社名の日本語・英語表記に変更してみる。
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ライブラリはWebSocketが使えて便利だけども今回は銘柄リストを取得するだけなのでシンプルにAPIを叩く。
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。
最後に
投資する際には必要な株価や会社の指標などを調べることが重要だが全銘柄を対象にするのはネットワークの負荷を増やし情報過多になるだけのように思える。
そのためインデックス登録銘柄など絞り込んだほうがより効率的だと考えられるのでまず手始めに銘柄リストを取得してみた。
今回紹介した記事の全ソースはこちら。