【J-Quants】APIを用いたROE及びPBRの算出

## はじめに

こんにちは！J-Quants運営チームです。

個人投資家向けのAPIデータ配信サービスである[J-Quants](https://jpx-jquants.com/)を利用する上での、技術的なTipsなどの技術記事を投稿しております。

この記事では、上場企業の貸借対照表や損益計算書に記載の項目を取得できる財務諸表(BS/PL)API※を用いて、ROE(自己資本利益率)とPBR(株価純資産倍率)を算出する方法をご紹介します。
※
財務諸表(BS/PL)APIは8/28にリリースされた新規のAPIです。なお、本APIはプレミアムプランのユーザの方のみご利用可能となっております。

## （参考）J-Quantsとは

J-Quantsとは、ヒストリカル株価データ・財務データなどの金融データを取得できる、個人投資家向けのAPIデータ配信サービスです。投資にまつわるデータを分析しやすい形式で提供し、個人投資家の皆様がデータを活用して取引できるようになることを目的としております。

個人投資家がデータ分析を用いた投資分析を行う際の大きな障壁は、整形された金融データの取得が難しいことでは？という理由から、2022年7月にベータ版をリリースいたしました。ご好評の声を頂いたこともあり、2023年4月より正式にリリースしております。

## ROE(自己資本利益率)とPBR(株価純資産倍率)の算出式

ROEは「Return On　Equity」の略で「自己資本利益率」ともいいます。「企業がどれぐらい効率良くお金を稼いでいるか」を示す財務指標として用いられ、基本的に、ROEが高いほど経営効率の良い企業だと見ることができます。業種によって平均値が多少異なることもあり、本指標だけで一概には判断することはできません。

PBRは「Price Book-Value　Ratio」の略で、企業の資産内容や財務状態をもとに株価水準を測る指標です。一般的に数値が高いほど割高と判断されます。

まず初めにROE(自己資本利益率)とPBR(株価純資産倍率)の算出式を確認します。

- ROE = 親会社所有者帰属当期利益 ÷ 期首期末平均自己資本

自己資本 = 純資産 - 非支配持分

- PBR = 株価 ÷ 1株当たり親会社所有者帰属持分

1株当たり親会社所有者帰属持分 = (自己資本(純資産 - 非支配持分) ÷
(発行済株式数 - 自己株式数))

今回は2022年度末時点のJPX(銘柄コード：8697)の上記指標を算出していきます。

## APIでのデータ取得

それぞれの指標の算出に必要なデータをAPIを用いて取得していきます。
必要なデータと取得元のAPI(取得項目名)は以下のとおりです。

- 当期純利益：財務諸表(BS/PL)API(Profit (loss) attributable to owners of
  parent (IFRS))

- 純資産：財務情報API(Equity)

- 非支配持分：財務諸表(BS/PL)API(Non-controlling interests (IFRS))

- 株価：株価四本値API(AdjustmentClose)

- 発行済株式数：財務情報API
  (NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock)

- 自己株式数：財務情報API(NumberOfTreasuryStockAtTheEndOfFiscalYear)

以下にデータを取得する際のコードの例を示します。J-QuantsのAPIから金融データを取得する際には、まず最初に登録したメールアドレスとパスワードをbodyに入れてPOSTすることでリフレッシュトークンを取得し、そのリフレッシュトークンをクエリストリングに入れてPOSTすることでIDトークンを取得します。

`MAIL_ADDRESS`と`PASSWORD`はご自身のメールアドレスとパスワードを入れてください。セキュリティの観点から、これらはコード中には記載せずに環境変数に設定しておき、スクリプトの先頭で`MAIL_ADDRESS = os.environ["MAIL_ADDRESS"]`などとして読み出すことを推奨します。

なお、記事中で用いたPythonとライブラリのバージョンは以下の通りです。

- Python 3.11.0
- pandas 1.5.3
- requests 2.28.2

``` python
import json

import pandas as pd
import requests

resp = requests.post(
    "https://api.jquants.com/v1/token/auth_user",
    data=json.dumps({"mailaddress": MAIL_ADDRESS, "password": PASSWORD})
)
REFRESH_TOKEN = resp.json()["refreshToken"]

resp = requests.post(
    "https://api.jquants.com/v1/token/auth_refresh",
    params={"refreshtoken": REFRESH_TOKEN}
)
ID_TOKEN = resp.json()["idToken"]
```

まずは、今取得したIDトークンをヘッダーに入れて株価四本値APIをリクエストします。
dateは2022年度の最終営業日を指定します。

``` python
resp = requests.get(
    "https://api.jquants.com/v1/prices/daily_quotes",
    params={"date": "2023-03-31", "code": "86970"},
    headers={"Authorization": f"Bearer {ID_TOKEN}"}
)
daily_quotes = resp.json()["daily_quotes"]
```

同様に、財務情報API及び財務諸表(BS/PL)APIもリクエストし ます。
dateはそれぞれ通期の開示が行われた日付(DisclosedDate)を指定します。
期首期末平均を算出する必要があるため2年分取得します。

``` python
def get_statements(date: str | None, code: str | None, id_token: str) -> dict[str, str]:
    resp = requests.get(
        "https://api.jquants.com/v1/fins/statements",
        params={"date": date, "code": code},
        headers={"Authorization": f"Bearer {id_token}"}
    )
    return resp.json()["statements"]

def get_fs_details(date: str | None, code: str | None, id_token: str) -> dict[str, str]:
    resp = requests.get(
        "https://api.jquants.com/v1/fins/fs_details",
        params={"date": date, "code": code},
        headers={"Authorization": f"Bearer {id_token}"}
    )
    return resp.json()["fs_details"]

statements_2022 = get_statements("2022-04-26", "86970", ID_TOKEN)
statements_2023 = get_statements("2023-04-27", "86970", ID_TOKEN)
fs_details_2022 = get_fs_details("2022-04-26", "86970", ID_TOKEN)
fs_details_2023 = get_fs_details("2023-04-27", "86970", ID_TOKEN)
```

それぞれ中身を見てみましょう。

<details>
<summary>

- 財務情報
  </summary>
  <div>

<!-- -->

    {'DisclosedDate': '2023-04-27',
     'DisclosedTime': '12:00:00',
     'LocalCode': '86970',
     'DisclosureNumber': '20230425552021',
     'TypeOfDocument': 'FYFinancialStatements_Consolidated_IFRS',
     'TypeOfCurrentPeriod': 'FY',
     'CurrentPeriodStartDate': '2022-04-01',
     'CurrentPeriodEndDate': '2023-03-31',
     'CurrentFiscalYearStartDate': '2022-04-01',
     'CurrentFiscalYearEndDate': '2023-03-31',
     'NextFiscalYearStartDate': '2023-04-01',
     'NextFiscalYearEndDate': '2024-03-31',
     'NetSales': '133991000000',
     'OperatingProfit': '68253000000',
     'OrdinaryProfit': '',
     'Profit': '46342000000',
     'EarningsPerShare': '88.03',
     'DilutedEarningsPerShare': '',
     'TotalAssets': '82187392000000',
     'Equity': '321809000000',
     'EquityToAssetRatio': '0.004',
     'BookValuePerShare': '599.47',
     'CashFlowsFromOperatingActivities': '66878000000',
     'CashFlowsFromInvestingActivities': '-8522000000',
     'CashFlowsFromFinancingActivities': '-52898000000',
     'CashAndEquivalents': '98812000000',
     'ResultDividendPerShare1stQuarter': '',
     'ResultDividendPerShare2ndQuarter': '26.0',
     'ResultDividendPerShare3rdQuarter': '',
     'ResultDividendPerShareFiscalYearEnd': '37.0',
     'ResultDividendPerShareAnnual': '63.0',
     'DistributionsPerUnit(REIT)': '',
     'ResultTotalDividendPaidAnnual': '33114000000',
     'ResultPayoutRatioAnnual': '0.716',
     'ForecastDividendPerShare1stQuarter': '',
     'ForecastDividendPerShare2ndQuarter': '',
     'ForecastDividendPerShare3rdQuarter': '',
     'ForecastDividendPerShareFiscalYearEnd': '',
     'ForecastDividendPerShareAnnual': '',
     'ForecastDistributionsPerUnit(REIT)': '',
     'ForecastTotalDividendPaidAnnual': '',
     'ForecastPayoutRatioAnnual': '',
     'NextYearForecastDividendPerShare1stQuarter': '',
     'NextYearForecastDividendPerShare2ndQuarter': '28.0',
     'NextYearForecastDividendPerShare3rdQuarter': '',
     'NextYearForecastDividendPerShareFiscalYearEnd': '29.0',
     'NextYearForecastDividendPerShareAnnual': '57.0',
     'NextYearForecastDistributionsPerUnit(REIT)': '',
     'NextYearForecastPayoutRatioAnnual': '0.607',
     'ForecastNetSales2ndQuarter': '',
     'ForecastOperatingProfit2ndQuarter': '',
     'ForecastOrdinaryProfit2ndQuarter': '',
     'ForecastProfit2ndQuarter': '',
     'ForecastEarningsPerShare2ndQuarter': '',
     'NextYearForecastNetSales2ndQuarter': '',
     'NextYearForecastOperatingProfit2ndQuarter': '',
     'NextYearForecastOrdinaryProfit2ndQuarter': '',
     'NextYearForecastProfit2ndQuarter': '',
     'NextYearForecastEarningsPerShare2ndQuarter': '',
     'ForecastNetSales': '',
     'ForecastOperatingProfit': '',
     'ForecastOrdinaryProfit': '',
     'ForecastProfit': '',
     'ForecastEarningsPerShare': '',
     'NextYearForecastNetSales': '134500000000',
     'NextYearForecastOperatingProfit': '68500000000',
     'NextYearForecastOrdinaryProfit': '',
     'NextYearForecastProfit': '49000000000',
     'NextYearForecastEarningsPerShare': '93.93',
     'MaterialChangesInSubsidiaries': 'false',
     'ChangesBasedOnRevisionsOfAccountingStandard': 'false',
     'ChangesOtherThanOnesBasedOnRevisionsOfAccountingStandard': 'false',
     'ChangesInAccountingEstimates': 'true',
     'RetrospectiveRestatement': '',
     'NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock': '528578441',
     'NumberOfTreasuryStockAtTheEndOfFiscalYear': '6891928',
     'AverageNumberOfShares': '526414670',
     'NonConsolidatedNetSales': '37975000000',
     'NonConsolidatedOperatingProfit': '30787000000',
     'NonConsolidatedOrdinaryProfit': '31029000000',
     'NonConsolidatedProfit': '30387000000',
     'NonConsolidatedEarningsPerShare': '57.73',
     'NonConsolidatedTotalAssets': '211678000000',
     'NonConsolidatedEquity': '102440000000',
     'NonConsolidatedEquityToAssetRatio': '0.484',
     'NonConsolidatedBookValuePerShare': '196.36',
     'ForecastNonConsolidatedNetSales2ndQuarter': '',
     'ForecastNonConsolidatedOperatingProfit2ndQuarter': '',
     'ForecastNonConsolidatedOrdinaryProfit2ndQuarter': '',
     'ForecastNonConsolidatedProfit2ndQuarter': '',
     'ForecastNonConsolidatedEarningsPerShare2ndQuarter': '',
     'NextYearForecastNonConsolidatedNetSales2ndQuarter': '',
     'NextYearForecastNonConsolidatedOperatingProfit2ndQuarter': '',
     'NextYearForecastNonConsolidatedOrdinaryProfit2ndQuarter': '',
     'NextYearForecastNonConsolidatedProfit2ndQuarter': '',
     'NextYearForecastNonConsolidatedEarningsPerShare2ndQuarter': '',
     'ForecastNonConsolidatedNetSales': '',
     'ForecastNonConsolidatedOperatingProfit': '',
     'ForecastNonConsolidatedOrdinaryProfit': '',
     'ForecastNonConsolidatedProfit': '',
     'ForecastNonConsolidatedEarningsPerShare': '',
     'NextYearForecastNonConsolidatedNetSales': '',
     'NextYearForecastNonConsolidatedOperatingProfit': '',
     'NextYearForecastNonConsolidatedOrdinaryProfit': '',
     'NextYearForecastNonConsolidatedProfit': '',
     'NextYearForecastNonConsolidatedEarningsPerShare': ''}

</div>
</details>
<details>
<summary>

- 財務諸表(BS/PL)
  </summary>
  <div>

<!-- -->

    {'DisclosedDate': '2023-04-27',
     'DisclosedTime': '12:00:00',
     'LocalCode': '86970',
     'DisclosureNumber': '20230425552021',
     'TypeOfDocument': 'FYFinancialStatements_Consolidated_IFRS',
     'FinancialStatement': {'Goodwill (IFRS)': '72043000000',
      'Retained earnings (IFRS)': '275523000000',
      'Operating profit (loss) (IFRS)': '68253000000.0',
      'Previous fiscal year end date, DEI': '2022-03-31',
      'Basic earnings (loss) per share (IFRS)': '88.03',
      'Document type, DEI': '通期第３号参考様式\u3000[IFRS]（連結）',
      'Current period end date, DEI': '2023-03-31',
      'Revenue - 2 (IFRS)': '134496000000.0',
      'Industry code when consolidated financial statements are prepared in accordance with industry specific regulations, DEI': 'CTE',
      'Profit (loss) attributable to owners of parent (IFRS)': '46342000000.0',
      'Other current liabilities - CL (IFRS)': '8274000000',
      'Share of profit (loss) of investments accounted for using equity method (IFRS)': '1319000000.0',
      'Current liabilities (IFRS)': '81833258000000',
      'Industry code when financial statements are prepared in accordance with industry specific regulations, DEI': 'CTE',
      'Equity attributable to owners of parent (IFRS)': '312734000000',
      'Whether consolidated financial statements are prepared, DEI': 'true',
      'Non-current liabilities (IFRS)': '32324000000',
      'Other expenses (IFRS)': '59000000.0',
      'Income taxes payable - CL (IFRS)': '9963000000',
      'Filer name in English, DEI': 'Japan Exchange Group, Inc.',
      'Non-controlling interests (IFRS)': '9075000000',
      'Capital surplus (IFRS)': '38841000000',
      'Finance costs (IFRS)': '96000000.0',
      'Other current assets - CA (IFRS)': '3582000000',
      'Property, plant and equipment (IFRS)': '11041000000',
      'Deferred tax liabilities (IFRS)': '69000000',
      'Other components of equity (IFRS)': '445000000',
      'Current fiscal year start date, DEI': '2022-04-01',
      'Type of current period, DEI': 'FY',
      'Cash and cash equivalents (IFRS)': '98812000000',
      'Share capital (IFRS)': '11500000000',
      'Retirement benefit asset - NCA (IFRS)': '10025000000',
      'Number of submission, DEI': '1',
      'Trade and other receivables - CA (IFRS)': '16023000000',
      'Liabilities and equity (IFRS)': '82187392000000',
      'EDINET code, DEI': 'E03814',
      'Equity (IFRS)': '321809000000',
      'Security code, DEI': '86970',
      'Other financial assets - CA (IFRS)': '112400000000',
      'Other financial assets - NCA (IFRS)': '3068000000',
      'Income taxes receivable - CA (IFRS)': '5359000000',
      'Investments accounted for using equity method (IFRS)': '18593000000',
      'Other non-current assets - NCA (IFRS)': '6253000000',
      'Previous fiscal year start date, DEI': '2021-04-01',
      'Filer name in Japanese, DEI': '株式会社日本取引所グループ',
      'Deferred tax assets (IFRS)': '1751000000',
      'Trade and other payables - CL (IFRS)': '8883000000',
      'Bonds and borrowings - CL (IFRS)': '33000000000',
      'Current fiscal year end date, DEI': '2023-03-31',
      'XBRL amendment flag, DEI': 'false',
      'Non-current assets (IFRS)': '186834000000',
      'Retirement benefit liability - NCL (IFRS)': '8485000000',
      'Amendment flag, DEI': 'false',
      'Assets (IFRS)': '82187392000000',
      'Income tax expense (IFRS)': '20987000000.0',
      'Report amendment flag, DEI': 'false',
      'Profit (loss) (IFRS)': '47219000000.0',
      'Operating expenses (IFRS)': '67502000000.0',
      'Intangible assets (IFRS)': '36109000000',
      'Profit (loss) before tax from continuing operations (IFRS)': '68207000000.0',
      'Liabilities (IFRS)': '81865583000000',
      'Accounting standards, DEI': 'IFRS',
      'Bonds and borrowings - NCL (IFRS)': '19973000000',
      'Finance income (IFRS)': '49000000.0',
      'Profit (loss) attributable to non-controlling interests (IFRS)': '876000000.0',
      'Comparative period end date, DEI': '2022-03-31',
      'Current assets (IFRS)': '82000557000000',
      'Other non-current liabilities - NCL (IFRS)': '3795000000',
      'Other income (IFRS)': '504000000.0',
      'Treasury shares (IFRS)': '-13575000000'}}

</div>
</details>

## 指標の算出に必要なデータの抽出

次に、APIから取得したデータのうち指標の算出に必要なデータのみを抽出します。

``` python
# 抽出するデータを格納するリスト
extracted_data = {}
```

``` python
extracted_data['AdjustmentClose'] = daily_quotes[0]['AdjustmentClose']
extracted_data['Equity_2022'] = statements_2022[0]['Equity']
extracted_data['Equity_2023'] = statements_2023[0]['Equity']
extracted_data['NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock'] = statements_2023[0]['NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock']
extracted_data['NumberOfTreasuryStockAtTheEndOfFiscalYear'] = statements_2023[0]['NumberOfTreasuryStockAtTheEndOfFiscalYear']
extracted_data['Non-controlling interests (IFRS)_2022'] = fs_details_2022[0]['FinancialStatement']['Non-controlling interests (IFRS)']
extracted_data['Profit (loss) attributable to owners of parent (IFRS)'] = fs_details_2023[0]['FinancialStatement']['Profit (loss) attributable to owners of parent (IFRS)']
extracted_data['Non-controlling interests (IFRS)_2023'] = fs_details_2023[0]['FinancialStatement']['Non-controlling interests (IFRS)']
```

データを確認してみます。

``` python
print(extracted_data)
```

    {'AdjustmentClose': 2018.5, 'Equity_2022': '323852000000', 'Equity_2023': '321809000000', 'NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock': '528578441', 'NumberOfTreasuryStockAtTheEndOfFiscalYear': '6891928', 'Non-controlling interests (IFRS)_2022': '8198000000', 'Profit (loss) attributable to owners of parent (IFRS)': '46342000000.0', 'Non-controlling interests (IFRS)_2023': '9075000000'}

## 取得したデータを元にROE(自己資本利益率)とPBR(株価純資産倍率)の算出

先ほど取得したデータを元にROE(自己資本利益率)とPBR(株価純資産倍率)を算出していきます。

実際に算出してみましょう。

``` python
def calculate_roe(data):
    profit_attributable = float(extracted_data['Profit (loss) attributable to owners of parent (IFRS)'])
    equity_2022 = float(extracted_data['Equity_2022'])
    equity_2023 = float(extracted_data['Equity_2023'])
    non_controlling_interests_2022 = float(extracted_data['Non-controlling interests (IFRS)_2022'])
    non_controlling_interests_2023 = float(extracted_data['Non-controlling interests (IFRS)_2023'])

    roe = profit_attributable / (((equity_2022 - non_controlling_interests_2022) + (equity_2023 - non_controlling_interests_2023)) / 2)
    percent_value = roe * 100
    percent_roe = "{:.1f}%".format(percent_value)
    return percent_roe

def calculate_pbr(data):
    afternoon_adjustment_close = float(extracted_data['AdjustmentClose'])
    equity_2023 = float(extracted_data['Equity_2023'])
    non_controlling_interests_2023 = float(extracted_data['Non-controlling interests (IFRS)_2023'])
    including_treasury_stock = float(extracted_data['NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock'])
    treasury_stock = float(extracted_data['NumberOfTreasuryStockAtTheEndOfFiscalYear'])

    pbr = afternoon_adjustment_close / ((equity_2023 - non_controlling_interests_2023) / (including_treasury_stock - treasury_stock))
    rounded_pbr = round(pbr, 1)
    return rounded_pbr
```

``` python
roe = calculate_roe(extracted_data)
print("ROE:", roe)
pbr = calculate_pbr(extracted_data)
print("PBR:", pbr)
```

    ROE: 14.7%
    PBR: 3.4

## おわりに

この記事ではJ-Quants
APIから取得するデータを用いて、ROEとPBRを算出する方法についてご紹介いたしました。

本記事中ではrequestsを用いて一から実装しましたが、[jquants-api-client-python](https://github.com/J-Quants/jquants-api-client-python)というPythonライブラリもありますので、ぜひご活用ください。

また、J-Quants APIを使い方や分析例をColab
Notebookで作成しているものが、このリポジトリの[examples](https://github.com/J-Quants/jquants-api-client-python/tree/main/examples)にあります！お時間がございましたら是非覗いてみてください。

## ディスクレーマー

当記事は、J-Quantsを利用した金融データ分析に関する技術的事項の共有を目的としたものであり、株式などの投資商品への投資の推奨を目的とするものではありません。また、本記事の内容をもとに投資等を行った結果損害等が生じた場合においても、一切の責任を負わないものとします。

## JPX総研について

JPX総研ではJ-Quantsなどの新しいプロダクトを内製開発しています！
キャリア採用も通年で行なっておりますので、ご興味がある方は以下のリンクをお確かめください！

- [JPX総研キャリア採用ページ](https://jpx-mid-career-recruitment.com/)

## 参考リンク

- [J-Quants](https://jpx-jquants.com/)
- [jquants-api-client-python](https://github.com/J-Quants/jquants-api-client-python)