1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】東証上場銘柄の株価データを取得する(その2)

Posted at

はじめに

前回の【Python】東証上場銘柄の株価データを取得する(その1)では
日本取引所グループにある東証上場銘柄の一覧ファイルを Pandas を使って銘柄抽出してみた

今回は,pandas_datareaderを使って,直近の株価データを取得してみる

自分銘柄

トヨタ,日産,ホンダ,ANA,JALを保有しているとする

下図のような Excel ファイルを my.xlsx という名前で用意した

列は,コードと銘柄名だ(日本取引所グループにある東証上場銘柄の一覧ファイルのそれと合わせた)
image.png

事前準備

前回書き忘れたが,
東証上場銘柄の一覧ファイルは data_j.xls という拡張子 xls ファイルなので,
xlrd をインストール必要がある
conda や pip で自分の環境に入れる必要がある

conda の場合

conda install xlrd

pip の場合

pip install xlrd

本論

必要なライブラリをインポートする

import pandas as pd
import pandas_datareader.data as pdr
import datetime
from dateutil.relativedelta import relativedelta

自分銘柄一覧(my.xlsx)と東証上場銘柄一覧(date_j.xls)を読み込む

my_df = pd.read_excel('my.xlsx', sheet_name = 'Sheet1', dtype = str)
topix_df = pd.read_excel('data_j.xls', dtype = str)

東証上場銘柄をTOPIX Core30に絞る
ちゃんと30行なっている

topix_core30_df = topix_df[topix_df['規模区分']=='TOPIX Core30']
len(topix_core30_df)
30

TOPIX Core30銘柄のコードと自分銘柄のコードを集合にする(重複排除される)
自分銘柄の,日産とANAがTOPIX Large70,JALがTOPIX Mid400で,トヨタとホンダはTOPIX Core30銘柄なので
3銘柄増え 30+3=33銘柄になっていれば正解

code_set = set(topix_core30_df['コード'].tolist()) | set(my_df['コード'].tolist())
len(code_set)
33

集合の中にある銘柄コードだけを,TOPIX の DataFrame から抽出する
isin を使うと,リストや集合の要素に一致する行が抽出できる

df = topix_df[topix_df['コード'].isin(code_set)]
df
日付 コード 銘柄名 市場・商品区分 33業種コード 33業種区分 17業種コード 17業種区分 規模コード 規模区分
1025 20211029 3382 セブン&アイ・ホールディングス 市場第一部(内国株) 6100 小売業 14 小売 1 TOPIX Core30
1434 20211029 4063 信越化学工業 市場第一部(内国株) 3200 化学 4 素材・化学 1 TOPIX Core30
1645 20211029 4452 花王 市場第一部(内国株) 3200 化学 4 素材・化学 1 TOPIX Core30
以降省略

リストにしておく

codeList = df['コード'].tolist()
companyList = df['銘柄名'].tolist()

取得期間終了日(本日)と取得期間開始日(本日から7日前)

ed = datetime.datetime.now() # 本日
st = ed - relativedelta(days = 7) # 7日前

コードに '.T' を付加し,DataReader で株価データを取得する
株価データは DataFrame で取得できる
直近のデータは DataFrame の最終行なので,
日付(Index)と終値(Close列)の最終行のデータを表示する

for code, company in zip(codeList, companyList):
    df = pdr.DataReader(code + '.T', 'yahoo', st, ed)
    dates = df.index  # 日付はindexになっている
    closes = df['Close']
    print(f'[{company}] date=[{dates[-1]}] close=[{closes[-1]}]')
[セブン&アイ・ホールディングス] date=[2021-11-22 00:00:00] close=[4777]
[信越化学工業] date=[2021-11-22 00:00:00] close=[20070]
[花王] date=[2021-11-22 00:00:00] close=[6219]
以降省略

まとめ

まとめると,次のようなコードになる

topix.py
import pandas as pd
import pandas_datareader.data as pdr
import datetime
from dateutil.relativedelta import relativedelta

"""
事前にここから東証上場銘柄一覧ファイル(data_j.xls)をダウンロードしておきます
https://www.jpx.co.jp/markets/statistics-equities/misc/01.html
あと,my.xlsx を用意します
"""
my_df = pd.read_excel('my.xlsx', sheet_name = 'Sheet1', dtype = str)
topix_df = pd.read_excel('data_j.xls', dtype = str)
topix_core30_df = topix_df[topix_df['規模区分']=='TOPIX Core30']

"""
TOPIX Core30 銘柄と自分銘柄の一覧を作る
"""
# TOPIX Core30 銘柄のコードと自分銘柄のコードを集合にする(重複排除される)
code_set = set(topix_core30_df['コード'].tolist()) | set(my_df['コード'].tolist())
# 集合の中にあるコードだけを,TOPIX の DataFrame から抽出する
## isin を使うと,リストや集合の要素に一致する行が抽出できる
df = topix_df[topix_df['コード'].isin(code_set)]
# リストにする
codeList = df['コード'].tolist()
companyList = df['銘柄名'].tolist()

"""
指定期間の株価データを取得し表示する
"""
ed = datetime.datetime.now() # 本日
st = ed - relativedelta(days = 7) # 7日前

for code, company in zip(codeList, companyList):
    df = pdr.DataReader(code + '.T', 'yahoo', st, ed)
    dates = df.index  # 日付はindexになっている
    closes = df['Close']
    print(f'[{company}] date=[{dates[-1]}] close=[{closes[-1]}]')

おわりに

楽しい,便利すぎるぜ,Python

次回は,ローソク足チャートを描く予定

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?