見出し画像

日本取引所のAPIを使って株価&財務情報をゲットする

「株価情報を取得するにはどうしたらいいんだろう?」
「株価情報だけでなく財務情報も欲しい」
「できれば信頼できる情報ソースから取得したい」
そんなお悩みはありませんか?

これらの悩みを一発で解決するツールとして、
日本取引所のAPI(J-Quants-API)をおススメします

この記事では、
日本取引所のAPIを使って、
株価や財務情報を取得する方法のほか、
最後には株価と財務情報を使って、
PBRを算出する方法もご説明します。

日本取引所グループと聞いても
馴染みがうすいかもしれませんが、
要は東京証券取引所ですね。
今は、大阪証券取引所と合体して、
日本取引所グループになっています。


1. J-Quants アカウント登録


以下のサイトから
J-Quantsのアカウントを登録することで
APIを使えるようにします。

J-Quants APIに登録するをクリックするとユーザー登録画面になります


ここで登録したメールアドレスとパスワードを後から使います。

★APIの料金プラン


J-Quants APIは無料でも使えますが、
データによっては課金しないと取得できないものもあります。
最初は無料プランを選択しましょう。
ちなみに、無料プランは2年分のデータしかとれません。
また、株価データでも12週間遅延するので注意が必要
です。

このあたりは、pandas_datareaderのYfinanceの方が良いですね。
無料で、かなりの年数のデータを取得できますし遅延がありません。

世の中に無料で取れる情報ソースがあるのに、なぜ、日本取引所がこのような制約を設けたのか謎です🧐



ここから、J-QuantsのAPIを使って、株価情報・財務情報を取得していきます。

Googleコラボラトリーで実装していきます

Python用のライブラリーであるjquants-api-clientを使っていきます。
このライブラリーを使うことで、
より簡単に情報をゲットすることができます。
(逆にこのライブラリーを使わないと面倒です)

◾️公式ドキュメントはコチラ


3. ライブラリーのインストール・インポート


J-quantesのAPIクライアントをインストールします

!pip install jquants-api-client

必要なライブラリーをインポートします

import jquantsapi
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import warnings
warnings.simplefilter('ignore')


4. APIクライアントのインスタンス化


J-quantsのアカウント登録に使った
MAIL_ADDRESSとPASSWORDを"*****"に入力します。

J-QuantsのAPIは、過去、リフレッシュトークンの取得が必要でしたが、
今は、メールアドレスとパスワードを入力することで使用できます。

MAIL_ADDRESS = "*************"
PASSWORD = "***********"
cli = jquantsapi.Client(mail_address=MAIL_ADDRESS, password=PASSWORD)

上記だと、
平文に入力することになるので、
気になる方は、
以下のようにGoogleコラボのシークレットキーを活用することを
お勧めします!

◾️ Googleコラボでのシークレットキーの便利な使い方はコチラ

◾️ Googleコラボのシークレットキーを活用した場合のコードはコチラ

import os
from google.colab import userdata
os.environ["MAIL_ADDRESS"] = userdata.get('J_QUANTS_MAIL_ADDRESS')
os.environ["PASSWORD"] = userdata.get('J_QUANTS_PASSWORD')
MAIL_ADDRESS = os.environ["MAIL_ADDRESS"]
PASSWORD = os.environ["PASSWORD"]


これでJ-QuantsのAPIを使える環境が整いました。
早速、APIを使って情報を取得していきましょう。


5. 上場銘柄一覧の取得


まずは、簡単なところで、上場銘柄一覧を取得してみましょう。

# 最新日付の全銘柄一覧を取得
df_info = cli.get_listed_info()
df_lnfo.head()   

出力結果を2分割で表示しています

1/2
2/2

★取得できる銘柄情報


Date:日付
Code:証券コード
CompanyName:企業名
CompanyNameEnglish:企業名(英語)
Sector17Code:17業種の該当コード
Sector17CodeName:17業種の該当名
Sector33Code:33業種の該当コード
Sector33CodeName:33業種の該当名
MarketCode:マーケットコード(プライム・スタンダードなど)
MarketCodeName:マーケットコード名


6. 業種情報の取得


銘柄ごとのAPIクライアントに埋め込まれている業種情報を取得します。
33業種と17業種の2種類用意されています。

まずは、33業種の情報を取得します。

df_33_sectors = cli.get_33_sectors()
df_33_sectors.head()

次に、17業種の情報を取得します。

df_17_sectors = cli.get_17_sectors()
df_17_sectors.head()


7. 株価情報の取得


さあ、株価情報を取得していきましょう
株価情報は2通りの取得方法が提供されています。
それぞれの取得方法を確認してみましょう。

★銘柄コードを指定して取得する方法


codeに証券コードを入力します。

df_price = cli.get_prices_daily_quotes(code=8697)
df_price.tail()

出力結果は以下の通りです。
4本値については、株式分割・併合等があった際の調整後の株価も用意されています。これは良いですね。

1/2
2/2

★日付を指定して取得する方法


指定した日付で全銘柄の情報を取得できます。
契約プランによっては取得可能なデータの範囲が定められています。
無料プランの場合、最大2年間で、12週間遅れとなります。

df_price = cli.get_prices_daily_quotes(date_yyyymmdd="20240129")
df_price.head(2)

◾️期間を指定することもできます。
こちらの方が使えると思います。

#日付指定した取得→縦持ち
d_from = datetime(2022,3,31)
d_to = datetime(2024,1,26)
df_price = cli.get_price_range(
          start_dt=d_from.strftime(format="%Y%m%d"), 
          end_dt=d_to.strftime(format="%Y%m%d")
)
df_price

日付の引数を与えないと全期間のデータを取得します

# 全期間のデータ
df_topix = cli.get_indices_topix()
df_topix.head()


8. 財務情報の取得


財務情報も
銘柄コードを指定して取得する方法と、
日付を指定して取得する方法が提供されています。
実際は、銘柄コードを指定して取得することが多いと思います。

★銘柄コードを指定して取得する方法


df_fin = cli.get_fins_statements(code=8697)
df_fin.tail(1).T

★日付を指定して取得する方法



df_fin = cli.get_fins_statements(date_yyyymmdd="20230601")
df_fin.head(3).T

★取得できる財務情報


公式には以下の43項目が掲載されていますが、
実際はもっと取得できるようです。

- **DisclosureNumber**: 開示番号  
- **DisclosedDate**: 開示日  
- **ApplyingOfSpecificAccountingOfTheQuarterlyFinancialStatements**: 四半期財務諸表の作成に特有の会計処理の適用  
- **AverageNumberOfShares**: 期中平均株式数  
- **BookValuePerShare**: 1株当たり純資産  
- **ChangesBasedOnRevisionsOfAccountingStandard**: 会計基準等の改正に伴う会計方針の変更  
- **ChangesInAccountingEstimates**: 会計上の見積りの変更  
- **ChangesOtherThanOnesBasedOnRevisionsOfAccountingStandard**: 会計基準等の改正に伴う変更以外の会計方針の変更  
- **CurrentFiscalYearEndDate**: 当事業年度終了日  
- **CurrentFiscalYearStartDate**: 当事業年度開始日  
- **CurrentPeriodEndDate**: 当会計期間終了日  
- **DisclosedTime**: 開示時刻  
- **DisclosedUnixTime**: 開示UnixTime  
- **EarningsPerShare**: 1株当たり当期純利益  
- **Equity**: 純資産  
- **EquityToAssetRatio**: 自己資本比率  
- **ForecastDividendPerShare1stQuarter**: 配当予想_第1四半期末  
- **ForecastDividendPerShare2ndQuarter**: 配当予想_第2四半期末  
- **ForecastDividendPerShare3rdQuarter**: 配当予想_第3四半期末  
- **ForecastDividendPerShareAnnual**: 配当予想_合計  
- **ForecastDividendPerShareFiscalYearEnd**: 配当予想_期末  
- **ForecastEarningsPerShare**: 1株当たり当期純利益_通期予想  
- **ForecastNetSales**: 売上高_通期予想  
- **ForecastOperatingProfit**: 営業利益_通期予想  
- **ForecastOrdinaryProfit**: 経常利益_通期予想  
- **ForecastProfit**: 当期純利益_通期予想  
- **LocalCode**: 銘柄コード  
- **MaterialChangesInSubsidiaries**: 期中における重要な子会社の異動  
- **NetSales**: 売上高  
- **NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock**: 期末発行済株式数  
- **NumberOfTreasuryStockAtTheEndOfFiscalYear**: 期末自己株式数  
- **OperatingProfit**: 営業利益  
- **OrdinaryProfit**: 経常利益  
- **Profit**: 当期純利益  
- **ResultDividendPerShare1stQuarter**: 配当実績_第1四半期末  
- **ResultDividendPerShare2ndQuarter**: 配当実績_第2四半期末  
- **ResultDividendPerShare3rdQuarter**: 配当実績_第3四半期末  
- **ResultDividendPerShareAnnual**: 配当実績_合計  
- **ResultDividendPerShareFiscalYearEnd**: 配当実績_期末  
- **RetrospectiveRestatement**: 修正再表示  
- **TotalAssets**: 総資産  
- **TypeOfCurrentPeriod**: 当会計期間の種類  
- **TypeOfDocument**: 書類種別  


9. PBRを算出する


最後にPBRを算出してみましょう。
ここで紹介する方法を応用すればPERも算出可能です。

一般的に、株価は「調整後」を使うことが多いと思いますが、
PBRの場合は調整前株価を使うことがポイントです

味の素の2023年3月31日時点のPBRを取得します。
株価は2023年3月31日時点の調整前株価(終値)
1株あたり純資産(BookValuePerShare)は
2023年3月31日決算のものを使います。

code = 2802 # 味の素
fy = "2023-03-31"

def calc_pbr(code, fy):
    # 株価データの取得
    df_quotes_bycode = cli.get_prices_daily_quotes(code)
    # fyに一致する日付の調整前株価を取得する
    fy_price = df_quotes_bycode[df_quotes_bycode["Date"] == fy]["Close"].values[0]
    
    # BPSデータの取得
    df_fins = cli.get_fins_statements(code)
    fy_bps = df_fins[
        (df_fins["CurrentFiscalYearEndDate"] == fy) &
        ((df_fins["TypeOfDocument"] == "FYFinancialStatements_Consolidated_IFRS") |
         (df_fins["TypeOfDocument"] == "FYFinancialStatements_Consolidated_JP"))
    ]["BookValuePerShare"].values[0]
    
    # PBRの計算 株価/BPS
    fy_pbr = fy_price / float(fy_bps)
    return fy_pbr

pbr = calc_pbr(code, fy)
print(f"PBR: {pbr:.2f}")

◾️ 出力結果

PBR: 3.17

うまく取得できましたね!

この記事が気に入ったらサポートをしてみませんか?