J-Quants API(無料プランあり)を使用した株価・財務データ取得(Python)

株価データを取得する際に次のような悩みを持ったことはないでしょうか。

株価データを取得する際の悩み
  • そもそも、株価データの入手方法が分からない
  • 少なくとも最初はデータ取得にお金をかけたくない
  • スクレイピングは面倒
  • 入手したデータに信頼性があるかどうか疑問
  • 財務情報などのデータも合わせて分析したいけれど、いろいろな場所にあるので、収集するだけですごい作業量

この記事では、上記の解決方法を

  • 画像多め
  • Pythonコード付き

で説明します。

目次(このページで分かること)

J-Quants APIとは

J-Quants APIは個人投資家向けに株価・財務などの金融データを配信するサービス日本取引所グループ公式)です。

日本取引所グループは東京証券取引所、大阪取引所、東京商品取引所等を運営する取引所グループです。

本家本元のデータですので、信頼性については一番ではないでしょうか。

価格プラン表(無料プランあり

(「J-Quants API」より)

なお、無料プランはデータ提供期間が過去2年分[12週間遅延]になっています。

またプラン表を見ていただくとわかりますが、株価・財務データ以外にも上場銘柄一覧や決算発表予定日など様々なデータを取得できます。

株価・財務データ取得までの手順(Pythonコード付き)

J-Quants APIに登録

まずはJ-Quants APIに登録します。

J-Quants API」のページを開き、「J-Quants APIに登録する」ボタンを押します。

次に登録用のメールアドレスとパスワードを入力し、登録ボタンを押します。

メールが送られてきます。

メールの記載内容に従ってユーザ登録を完了します。

この画面でメールアドレスとパスワードを入力すると、下のプラン選択画面が開きます。

プラン登録

この記事では一番左の無料プランを選択しています。

名前と住所を入力して申し込みます。

以上でプラン登録は終わりです。

次にデータを取得するためのトークン(証明書のようなもの)を取得していきます。

リフレッシュトークンとIDトークンの取得

株価や財務データなどを取得するためにはIDトークンが必要になります。

そして、IDトークンを取得するためにはリフレッシュトークンが必要になります。

登録したメールアドレスとパスワードを使ってリフレッシュトークンは取得できます。

次がリフレッシュトークンを取得するPythonコードです。

なお、リフレッシュトークンの有効期間は1週間だそうです。

# リフレッシュトークン取得
import requests
import json

# 登録したメールアドレス、パスワードを設定
# EMAIL_ADDRESSに登録メールアドレス、PASSWORDにパスワードを入力
mail_password={"mailaddress":"EMAIL_ADDRESS", "password":"PASSWORD"}

# リフレッシュトークン取得
r_ref = requests.post("https://api.jquants.com/v1/token/auth_user", data=json.dumps(mail_password))

# リフレッシュトークン取得の表示
print(r_ref.json())

次に、取得したリフレッシュトークンを用いてIDトークンを取得します。

なお、IDトークンの有効期間は24時間だそうです。

# IDトークン取得
import requests

# 受け取ったリフレッシュトークンを設定
RefreshToken = r_ref.json()["refreshToken"]

# IDトークン取得
r_token = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={RefreshToken}")

# IDトークン表示
print(r_token.json())

株価データ取得

実際にIDトークンを使用して、株価データを取得してみます。

# 株価四本値の取得
import requests
import pandas as pd

# 取得したIDトークンを設定
idToken = r_token.json()["idToken"]
headers = {'Authorization': 'Bearer {}'.format(idToken)}

# 銘柄コード、期間を指定
code_ = "8697" 
from_ = "2022-12-01"
to_ = "2023-02-28"

# 株価四本値の取得
re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?code={code_}&from={from_}&to={to_}", headers=headers)

# pandasデータフレームに変換
df_daily_OHLCV = pd.DataFrame(re_daily_OHLCV.json()["daily_quotes"])

# 'Date'をdatetime型へ変換
df_daily_OHLCV['Date'] = pd.to_datetime(df_daily_OHLCV['Date'])

ここでは取得する際のパラメータとして「code」、「from」、「to」を指定して、指定された銘柄について指定された期間分のデータを取得しています。

指定パラメータの組合せとレスポンス結果は次のとおりです。(「J-Quants API 仕様書」より)

codedatefrom /toレスポンスの結果
指定された銘柄について全期間分のデータ
指定された銘柄について指定された期間分のデータ
全上場銘柄について指定された日付のデータ

取得した株価データ(Open、High、Low、Closeの四本値)をローソク足でグラフ化すると次のようになります。

財務データ取得

同様に財務情報を取得するPythonコードは次のとおりです。

# 財務情報の取得
import requests
import pandas as pd

# 取得したIDトークンを設定
idToken = r_token.json()["idToken"]
headers = {'Authorization': 'Bearer {}'.format(idToken)}

# 銘柄コードを指定
code = "8697" 

# 株価四本値の取得
statements = requests.get(f"https://api.jquants.com/v1/fins/statements?code={code}", headers=headers)

# pandasデータフレームに変換
df_statements = pd.DataFrame(statements.json()["statements"])

指定期間の全銘柄株価データ取得(Python)

指定期間の全銘柄の株価データを取得するPythonコードです。

コード全体

import requests
import json
import pandas as pd
import datetime as dt
import os

# 登録したメールアドレス、パスワードを設定
# EMAIL_ADDRESSに登録メールアドレス、PASSWORDにパスワードを入力
mail_password={"mailaddress":"EMAIL_ADDRESS", "password":"PASSWORD"}

# リフレッシュトークン取得
r_ref = requests.post("https://api.jquants.com/v1/token/auth_user", data=json.dumps(mail_password))



######### IDトークン取得 ###########
# IDトークンの有効期間は24時間

# 受け取ったリフレッシュトークンを設定
RefreshToken = r_ref.json()["refreshToken"]

# IDトークン取得
r_token = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={RefreshToken}")




######### 指定期間の全銘柄株価データ取得 ###########
# 四本値データ保存用 ディレクトリ作成
os.makedirs('./OHLCV', exist_ok=True)


# 取得したIDトークンを設定
idToken = r_token.json()["idToken"]
headers = {'Authorization': 'Bearer {}'.format(idToken)}

# 最初と最後の日付を設定 無料プランの場合は過去2年12週間遅延
StartDate = dt.date.today() - dt.timedelta(days=2*365)
EndDate = dt.date.today() - dt.timedelta(days=12*7)

# 四本値データ格納用 pandas DataFrame初期化
df_daily_OHLCV = pd.DataFrame()

# 最初の日付から最後の日付まで全銘柄の四本値を取得
for i in range((EndDate - StartDate).days + 1):
    # 対象日付を指定
    TargetDate = StartDate + dt.timedelta(days=i)

    # 進捗を示すため取得中の日付を出力
    print(TargetDate.strftime('%Y-%m-%d'))

    # 株価四本値の取得
    re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?date={TargetDate.strftime('%Y-%m-%d')}", headers=headers)
    # 株価四本値データを抽出
    daily_OHLCV_data = re_daily_OHLCV.json()["daily_quotes"]

    # ページング
    # レスポンスに"pagination_key"がある場合はwhile内の処理を実行
    while "pagination_key" in re_daily_OHLCV.json():
        # レスポンスのなかから"pagination_key"を抽出
        pagination_key = re_daily_OHLCV.json()["pagination_key"]

        # "pagination_key"を出力
        print(pagination_key)

        # "pagination_key"をプラスして株価四本値を継続取得
        re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?date={TargetDate.strftime('%Y-%m-%d')}&pagination_key={pagination_key}", headers=headers)

        # 継続取得した株価四本値データを足す
        daily_OHLCV_data += re_daily_OHLCV.json()["daily_quotes"]


    # pandasデータフレームに変換し、df_daily_OHLCVへ結合する
    df_daily_OHLCV = pd.concat([df_daily_OHLCV, pd.DataFrame(daily_OHLCV_data)])


# 'Date'をdatetime型へ変換
df_daily_OHLCV['Date'] = pd.to_datetime(df_daily_OHLCV['Date'])

# データ保存用ファイル名設定 最初の日付ー最後の日付
file_name = './OHLCV/'+'OHLCV' + StartDate.strftime('%Y%m%d') + '-' + EndDate.strftime('%Y%m%d') + '.pickle'

# データをpickle形式で保存 
# 読み出しは df_daily_OHLCV = pd.read_pickle(filename) などとします。
df_daily_OHLCV.to_pickle(file_name)

ページングの解説

コード内のコメントを見ていただくと、およそ何をしているか分かるかと思いますが、ページングのところは分かりにくいと思いますので、解説します。

ページングとは、データ量が大きい場合にJ-Quants API側が分割して送信してくるため、それら分割されたデータを正常に受け取るための仕組みです。

手順は次の通りです。

STEP
まずは普通に株価データの取得を要求

上のプログラム内だと、for文の中の次の箇所に当たります。

    # 株価四本値の取得
    re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?date={TargetDate.strftime('%Y-%m-%d')}", headers=headers)
    # 株価四本値データを抽出
    daily_OHLCV_data = re_daily_OHLCV.json()["daily_quotes"]
STEP
レスポンス(受信データ)に”pagination_key”がある場合は、継続データがあるので、”pagination_key”をパラメータに含めて再度データ取得を要求する。

while文で最初のレスポンス内に”pagination_key”があった場合の処理を書いています。

requests.getのところで”pagination_key”を設定して再度データを要求しています。

    # ページング
    # レスポンスに"pagination_key"がある場合はwhile内の処理を実行
    while "pagination_key" in re_daily_OHLCV.json():
        # レスポンスのなかから"pagination_key"を抽出
        pagination_key = re_daily_OHLCV.json()["pagination_key"]

        # "pagination_key"を出力
        print(pagination_key)

        # "pagination_key"をプラスして株価四本値を継続取得
        re_daily_OHLCV = requests.get(f"https://api.jquants.com/v1/prices/daily_quotes?date={TargetDate.strftime('%Y-%m-%d')}&pagination_key={pagination_key}", headers=headers)

        # 継続取得した株価四本値データを足す
        daily_OHLCV_data += re_daily_OHLCV.json()["daily_quotes"]

さらに詳細な使い方

J-Quants APIのさらに詳細な使い方については、次をご覧ください。

四本値、財務情報以外のデータ取得方法についても記載があります。

ご意見・ご感想をください
葉っぱ

サイトをご訪問いただき、ありがとうございました。
このサイトの作成者の葉っぱです。
分かりやすく、面白いサイトを作るため、ご意見・ご感想をいただけると嬉しいです。
いただく際は次のTwitterのDM、もしくはページ下部の「お問い合わせ」からお願いいたします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次(このページで分かること)