J-Quants APIを用いた日ごとの時価総額算出方法
📖 はじめに
データサイエンスと金融マーケットをつなぐ Market API Develoer のコミュニティ「マケデコ」の公式 Discord サーバーにて以下の質問が投稿されていました。
各銘柄の日次時価総額(株価 × 発行済株式数)を計算しようとしています。
株価データ(Close や AdjustmentClose)は問題ないものの、API から取得できるのは「期末発行済株式数」のみであり、期中に株式数が変動するとその四半期内の日次時価総額が大きくずれてしまう恐れがあります。
そこで、四半期途中の発行済株式数変動を含めて、正確に日次時価総額を算出する方法を教えてほしい。
発行済株式数は決算期末以外にも株式分割や増資などで変動するため、そのまま期末値を使うだけでは誤差が生じます。
本記事では、AdjustmentFactor を利用して日次の発行済株式数を補正し、時価総額を算出する手順をご紹介します。
⚠️ 注意
全てのデータを確認したわけではない点にご注意ください。
本記事で提供する情報を用いた株式投資の結果(損失・利益)は各自の判断と責任において行ってください。
著者は一切の責任を負いません。
💡 課題と解決方法
-
期末発行済株式数
- 変数名
- NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock
- APIパス
- /fins/statements
- 課題
- 期末時点での発行済株式数を取得可能だが、期末以降〜次期末までに分割や増資があった場合、日次時価総額の計算に反映できない。
- 変数名
-
調整係数
- 変数名
- AdjustmentFactor
- APIパス
- /prices/daily_quotes
- 解決方法
- 本変数は株式分割等があった日付に変動点を持つため、これを利用すればいつ・どの割合で株式数が変わったかを検出できます。
- 変数名
🧮 算出方法
対象データ
実際の算出方法に移る前に今回算出対象データを以下に記載します。
- メタプラネット<3350>
- 2025/03/28
- 株式数を 1 -> 10 に分割している
上記の日時を基準に J-Quants API でデータ取得した結果は以下の通りです。
-
/fins/statements データでの発行済み株式数
- 2025-03-03: 36,268,334 株
- 2025-05-14: 459,906,340 株
-
/prices/daily_quotes データでの調整係数
- 2025-03-27: 1.0
- 2025-03-28: 0.1
- 2025-03-31: 1.0
上記のように株式分割や併合が行われた日に調整係数が変化している事が分かります。
反対に発行済み株式数は 2025-05-14 の決算発表まで分かりません。
算出方法
- APIからデータ取得
- データ整形・結合
# 手順1で取得したデータを csv ファイルで保存しており pandas の read_csv メソッドを使用して読み込む想定 df_price = load_data(PRICE_RANGE_PATH) # 価格データ(/prices/daily_quotes) df_state = load_state_data(STATEMENT_RANGE_PATH) # 財務データ(/fins/statements) # 財務情報の Date が DisclosedDate という列名なのでリネーム # 財務情報の Code が LocalCode という列名なのでリネーム # 発行済み株式数も列名が長い為合わせてリネーム df_state = df_state.rename( columns={ "DisclosedDate": "Date", "LocalCode": "Code", "NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock": "NumSharesOutstanding" } ) # 価格データから今回の検証に必要な列名だけをフィルター cols_to_keep = ["Date", "Code", "Close", "AdjustmentFactor"] df_price = df_price[cols_to_keep] # メタプラネットのデータだけフィルター df_price = df_price[df_price["Code"] == "33500"] # 財務情報と価格情報データ結合 cols_to_merge = ["Date", "Code", "NumSharesOutstanding"] df_state_trim = df_state[cols_to_merge] df_price = df_price.merge(df_state_trim, on=["Date", "Code"], how="left")
- 日次補正後発行済株式数を求める
このコードは改善の余地があります。
初回の決算までの欠損値を 0 で埋めるなどの工夫が必要です。# 日次補正後発行済株式数 df_price["AdjOutstandingShares"] = pd.NA base_shares = None for i, row in df_price.iterrows(): af = row["AdjustmentFactor"] shares_q = row["NumSharesOutstanding"] # 期末日に値がある場合、新ベースを計算 if pd.notna(shares_q): # 決算期末日の株数データがあれば、ベースをリセットする base_shares = shares_q elif af != 1.0 and base_shares is not None: # 分割・逆分割イベント検出:ベースを 1/AF 倍する base_shares = base_shares / af # ベースが定まっていれば、そのまま埋める df_price.at[i, "AdjOutstandingShares"] = base_shares
- 時価総額を計算
df_price["MarketCap"] = df_price["Close"] * df_price["AdjOutstandingShares"]
📊 算出結果
Visual Studio Code の Data Wrangler 拡張機能で確認した結果を添付。
このように株式分割が行われた 2025-03-28 にて、 AdjOutstandingShares 列が分割に合わせて 10 倍に変化しています。
その値から時価総額である MarketCap 列を算出している為、株価が 1/10 に変化しても正しく算出出来ている事が分かります。
✨ おわりに
本手法を用いることで、期末以降に発生した株式分割や増資を AdjustmentFactor の変化点から自動検出し、日次レベルで発行済株式数を補正できます。
最後までお読みいただきありがとうございました。皆様の分析のお役に立てれば幸いです。
Discussion