Python:TOPIX に含まれる銘柄の配当利回りを取得する

日本取引所グループで公開されていた“構成銘柄別ウエイト一覧”に、配当利回りの列を付与してみました。

  • 銘柄コードの終わりに “.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)

コメント

  1. TaC より:

    初めまして。コードありがとうございます。
    株式データを取得をしたく、新しく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

  2. 熊右衛門 より:

    修正頂いた csv_url が違っておりエラーになったようです。
    現在は “https://www.jpx.co.jp/automation/markets/indices/topix/files/topixweight_j.csv” であり、”/automation” が抜けていると見受けます。
    上記含め、いくつかの修正をして投稿のコード及びデータを更新しましたので参照ください。

    • TaC より:

      先日は長文失礼しました。
      ご返信また、コードの更新ありがとうございます。大変助かりました。
      お陰様で無事に実行・完了することができました。

      途中、401 Client Error: Unauthorized for url が出ましたが、 yfinanceをアップデートすることで最後まで完了できました。
      次はサーバーでスケジュール実行をしようと思っています。ありがとうございました!