株価データを取得する際に次のような悩みを持ったことはないでしょうか。
- そもそも、株価データの入手方法が分からない
- 少なくとも最初はデータ取得にお金をかけたくない
- スクレイピングは面倒
- 入手したデータに信頼性があるかどうか疑問
- 財務情報などのデータも合わせて分析したいけれど、いろいろな場所にあるので、収集するだけですごい作業量
この記事では、上記の解決方法を
- 画像多め
- 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 仕様書」より)
code | date | from /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"])
指定期間の全銘柄の株価データを取得するコード
取得期間を変更したい場合は、StartDate、EndDateを変更してください。
また、J-Quants APIの無料プランの場合は直近12週間分のデータは取得できませんので、ご注意ください。
# 指定期間の全銘柄の株価データを取得
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時間
import requests
# 受け取ったリフレッシュトークンを設定
RefreshToken = r_ref.json()["refreshToken"]
# IDトークン取得
r_token = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={RefreshToken}")
# IDトークン表示
r_token.json()
######### 指定期間の全銘柄株価データ取得 ###########
# 四本値データ保存用 ディレクトリ作成
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.to_pickle(file_name)
# 取得データの表示
df_daily_OHLCV
コード内のコメントを見ていただくと、およそ何をしているか分かるかと思います。
ただ、ページングのところは分かりにくいと思いますので、解説します。
ページングとは
ページングとは、データ量が大きい場合にJ-Quants API側が分割して送信してくるため、それら分割されたデータを正常に受け取るための仕組みです。
手順は次の通りです。
上のプログラム内だと、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"]
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"]
さらに詳細な使い方
次のnote記事でJ-Quants APIを使って毎日、自動で全銘柄の株価、財務情報、信用取引週末残を取得する方法をPythonコード付きで紹介しています。
それらのコードをwindowsのタスクスケジューラを使って毎日実行する方法も説明しています。

公式の仕様書
公式のJ-Quants APIの仕様書は次の場所です。
面白かった投資本
ここまで読んでいただき、ありがとうございます。
最後に読んで面白かった投資本をご紹介できればと思います。
20年以上ヘッジファンドを運用され個人資産800億円超を築いた清原達郎 氏が、後継者がいない、ならばすべてのノウハウを全部世の中に「ぶちまけてしまえ」ということで書いた本です。
清原氏の証券会社就職からヘッジファンド設立、その後の運用での失敗や成功が自伝のように書かれていて、小説のように面白く、一気に読み終えました。
もちろん実践されてきた投資ノウハウも記載されているので、株データ分析のヒントにもなるかと思います。