日本取引所グループで公開されていた“構成銘柄別ウエイト一覧"に、配当利回りの列を付与してみました。
- 銘柄コードの終わりに “.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)
Pythonでできる! 株価データ分析 (Amazon) Docker Desktop for Windows/Macでつくるクリーンな開発環境構築入門(Python版) (Amazon) ファイナンス機械学習 (Amazon) アセットマネージャーのためのファイナンス機械学習 (Amazon)
TaC · 2024年8月16日
初めまして。コードありがとうございます。 株式データを取得をしたく、新しく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
熊右衛門 · 2024年8月20日
修正頂いた csv_url が違っておりエラーになったようです。 現在は “https://www.jpx.co.jp/automation/markets/indices/topix/files/topixweight_j.csv" であり、"/automation” が抜けていると見受けます。 上記含め、いくつかの修正をして投稿のコード及びデータを更新しましたので参照ください。
TaC · 2024年8月21日
先日は長文失礼しました。 ご返信また、コードの更新ありがとうございます。大変助かりました。 お陰様で無事に実行・完了することができました。
途中、401 Client Error: Unauthorized for url が出ましたが、 yfinanceをアップデートすることで最後まで完了できました。 次はサーバーでスケジュール実行をしようと思っています。ありがとうございました!
