日本取引所グループで公開されていた“構成銘柄別ウエイト一覧”に、配当利回りの列を付与してみました。
- 銘柄コードの終わりに “.T” を追加。それで良いのか未検証。
- 配当利回り等の値は Yahoo Finance から取得。
Yahoo ファイナンス JAPAN で見られる株式ランキングの値と異なっていたので、終値と一株配当も付与してみました。
※ 作成したソースコード及びその結果の一覧は保証しません。
配当利回りなどの列を追加した一覧をダウンロード(2024/08/20 作成)
import pandas as pd
import yfinance as yf
from datetime import datetime
from zoneinfo import ZoneInfo
# TOPIX 構成銘柄別ウエイト一覧
csv_url = (
"https://www.jpx.co.jp/automation/markets/indices/"
"topix/files/topixweight_j.csv"
)
df = pd.read_csv(csv_url, encoding="shift_jis")
# 不要な列を削除
df = df.drop(columns=["日付"])
df = df.drop(columns=["ニューインデックス区分"])
# "コード"列が数字で始まっている行のみにし、末尾に".T”を追加
df = df[df["コード"].astype(str).str.match("^\\d")]
df["コード"] = df["コード"].astype(str).str.replace("$", ".T", regex=True)
# 銘柄コード毎に次の値を格納
# - 配当利回り
# - 終値
# - 一株配当
dividend_yields = []
close_prices = []
dividends_per_share = []
for code in df["コード"]:
stock_info = yf.Ticker(code)
dividend_yield = stock_info.info.get("dividendYield", None)
dividend_yields.append(dividend_yield)
# 上場廃止銘柄は終値が取れずにエラーになったので対策
try:
close_price = stock_info.history(period="1d").iloc[-1]["Close"]
except IndexError:
close_price = None
close_prices.append(close_price)
dividend_per_share = stock_info.info.get("dividendRate", None)
dividends_per_share.append(dividend_per_share)
df["配当利回り"] = dividend_yields
df["終値"] = close_prices
df["一株配当"] = dividends_per_share
# CSVファイルに出力
now = datetime.now(ZoneInfo("Asia/Tokyo"))
ts = now.strftime("%Y%m%d")
output_csv = f"topixweight_j_with_some_value_{ts}.csv"
df.to_csv(output_csv, index=False)
以前のコード
2024/03/16 頃に使用したコードです。
2024/08/20 現在は実行してもエラーになりますが残しておきます。
- 銘柄コードの終わりが “.0″ だったので、”.T” に置換。それで良いのか未検証。
- 配当利回り等の値は Yahoo Finance から取得。
配当利回りなどの列を追加した一覧をダウンロード(2024/03/16 作成)
import pandas as pd
import yfinance as yf
# TOPIX 構成銘柄別ウエイト一覧(1月末現在)
csv_url = (
"https://www.jpx.co.jp/markets/indices/topix/"
"tvdivq00000030ne-att/topixweight_j.csv"
)
df = pd.read_csv(csv_url, encoding="shift_jis")
# 不要な列を削除
df = df.drop(columns=["日付"])
df = df.drop(columns=["ニューインデックス区分"])
# "コード"列が数字で始まっている行のみにし、".0"を".T"に置換
df = df[df["コード"].astype(str).str.match("^\\d")]
df["コード"] = df["コード"].astype(str).str.replace("\\.0$", ".T", regex=True)
# 銘柄コード毎に次の値を格納
# - 配当利回り
# - 終値
# - 一株配当
dividend_yields = []
close_prices = []
dividends_per_share = []
for code in df["コード"]:
stock_info = yf.Ticker(code)
dividend_yield = stock_info.info.get("dividendYield", None)
dividend_yields.append(dividend_yield)
close_price = stock_info.history(period="1d").iloc[-1]["Close"]
close_prices.append(close_price)
dividend_per_share = stock_info.info.get("dividendRate", None)
dividends_per_share.append(dividend_per_share)
df["配当利回り"] = dividend_yields
df["終値"] = close_prices
df["一株配当"] = dividends_per_share
# CSVファイルに出力
output_csv = "topixweight_j_with_some_value.csv"
df.to_csv(output_csv, index=False)
Docker Desktop for Windows/Macでつくるクリーンな開発環境構築入門(Python版) (Amazon)
ファイナンス機械学習 (Amazon)
アセットマネージャーのためのファイナンス機械学習 (Amazon)
コメント
初めまして。コードありがとうございます。
株式データを取得をしたく、新しくpythonを始めた者です。とても参考になりました。
早速試してみたのですが、下記エラーが発生しました。
エラーの内容を見ると恐らくcsvのURLが見つからないようです。
もし宜しければ、お手すきの際に解決法を教えて頂けないでしょうか?
csv_urlのみ下記、最新アドレスに変更しており、他はそのままコピーペーストしています。
“https://www.jpx.co.jp/markets/indices/topix/files/topixweight_j.csv”
IDLE Shell で Run Moduleしています。
エラー内容
————————————-
Traceback (most recent call last):
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\TestPythonTopix.py”, line 8, in
df = pd.read_csv(csv_url, encoding=”shift_jis”)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py”, line 1026, in read_csv
return _read(filepath_or_buffer, kwds)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py”, line 620, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py”, line 1620, in __init__
self._engine = self._make_engine(f, self.engine)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py”, line 1880, in _make_engine
self.handles = get_handle(
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\common.py”, line 728, in get_handle
ioargs = _get_filepath_or_buffer(
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\common.py”, line 384, in _get_filepath_or_buffer
with urlopen(req_info) as req:
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\common.py”, line 289, in urlopen
return urllib.request.urlopen(*args, **kwargs)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 215, in urlopen
return opener.open(url, data, timeout)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 521, in open
response = meth(req, response)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 630, in http_response
response = self.parent.error(
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 559, in error
return self._call_chain(*args)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 492, in _call_chain
result = func(*args)
File “C:\Users\xxx\AppData\Local\Programs\Python\Python312\Lib\urllib\request.py”, line 639, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
修正頂いた csv_url が違っておりエラーになったようです。
現在は “https://www.jpx.co.jp/automation/markets/indices/topix/files/topixweight_j.csv” であり、”/automation” が抜けていると見受けます。
上記含め、いくつかの修正をして投稿のコード及びデータを更新しましたので参照ください。
先日は長文失礼しました。
ご返信また、コードの更新ありがとうございます。大変助かりました。
お陰様で無事に実行・完了することができました。
途中、401 Client Error: Unauthorized for url が出ましたが、 yfinanceをアップデートすることで最後まで完了できました。
次はサーバーでスケジュール実行をしようと思っています。ありがとうございました!