見出し画像

J-Quants API への接続

J-Quants API

ご注意:2023/04/03 より正式に運用が開始されました。正式版の接続URLは、β版と異るので読み替えて下さい。なお β版の運用は、2023/04/10で終了とのことです。
(正式版のリフレッシュトークン取得をChatGPTに聞いてExcelVBAに書き直した話は、こちら。)


東証が個人向けにデータ取得のAPIをβ版で公開しています。

取得できるデータは、
1)銘柄情報
2)株価情報
3)マーケット情報
4)財務情報
です。
株価情報は日足ヒストリカル情報ですが、画期的な試みだと思います。

API利用のサンプルプログラムもサイトに載せてあり、APIの構造もhttp+jsonで簡単にアクセスできそうです。
と思いながらも初心者の私は幾つか引っ掛かってしまいました(笑
接続の過程を備忘録もかねて書いて行きたいと思います。


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

APIの仕様を開くと初めに「サービスへの登録とリフレッシュトークンの取得」をするように書かれています。
サービスへの登録はブラウザを使いホームページ上で行いました。もちろん人力です。

で、最初の課題「リフレッシュトークンの取得」です。
「リフレッシュトークン取得API」のリンクを開き、読みます。

>[post] https://api.jpx-jquants.com/v1/token/auth_user
リフレッシュトークンを取得します

とあります。
pythonの公式サンプルプログラムは、

import requests
import json

data={"mailaddress":"<YOUR EMAIL_ADDRESS>", "password":"<YOUR PASSWORD>"}
r_post = requests.post("https://api.jpx-jquants.com/v1/token/auth_user", data=json.dumps(data))
r_post.json()

となっていました。

私の環境ではrequestsが入って無かったので、urllib3で試しました。しかし知識がなく、urlに「data」部分をどう接続して送れば良いか分からず挫折。諦めてrequestsをpipでインストールしました。
Excel vbaでのAPI利用に課題が残ってしまいました。

追記 2023.05.19
ChatGPTに聞いてUrllib3で接続できました。記事はこちら
Excel vbaでのJ-Quants API利用もできました。記事はこちら


改めてサンプルプログラム通りのrequestsを使って実行してみました。

data={"mailaddress":"<YOUR EMAIL_ADDRESS>", "password":"<YOUR PASSWORD>"}
r_post_rftoken = requests.post("https://api.jpx-jquants.com/v1/token/auth_user", data=json.dumps(data))
print(r_post_rftoken.text)

取得した返値は、
{"refreshToken": "eyJjdHkiOiJKV1QiL(長〜い文字列のため省略)9-p2UI9dKZqH9a7A9nR_g"}
とjson形式のテキストデータでした。
これで簡単にリフレッシュトークンが取得できました。

リフレッシュトークンは、これで良し!
次は「IDトークン取得API」です。

IDトークンの取得API

先ずは公式サンプルプログラム。

import requests
import json

REFRESH_TOKEN = "YOUR refreshtokenID"
r_post = requests.post(f"https://api.jpx-jquants.com/v1/token/auth_refresh?refreshtoken={REFRESH_TOKEN}")
r_post.json()

サンプルコードをそのまま使って走らせたコード(前のリフレッシュトークンから続いています。)

REFRESH_TOKEN = r_post_rftoken.text
r_post_id_token = requests.post(f"https://api.jpx-jquants.com/v1/token/auth_refresh?refreshtoken={REFRESH_TOKEN}")
print(r_post_id_token.text)


エラーが出てしまいました。エラーメッセージは
{"message": "Your refresh token may be incorrect or expired."}
うーん、なぜでしょう。
走らせたコードは、ほとんどサンプルコードのまま・・・のはず。

いろいろ試し、分かったこと。
リフレッシュトークンは、返されたテキスト全体の
{“key” : “value”}
ではなく、
“value”
の値のみでした(""も不要ですからvalueですねw)。

コードを書き直しました。

dic_rftoken = json.loads(r_post_rftoken.text)  # 辞書型に変換

REFRESH_TOKEN = dic_rftoken.get('refreshToken')    # リフレッシュトークンのvalueを取得
r_post_idtoken = requests.post(f"https://api.jpx-jquants.com/v1/token/auth_refresh?refreshtoken={REFRESH_TOKEN}")
dic_idtoken = json.loads(r_post_idtoken.text)  # 辞書型に変換
str_idtoken = dic_idtoken.get('idToken')    # IDトークンのvalueを取得
print(str_idtoken)

これでJ-Quantsでデータを取得する準備が整いました。

今回のツボ

使うのは、返値の
{“key” : “value”}
ではなく、
“value”
のみ。""も不要。
分かってみれば当たり前ですね(笑

今回のコード(ログイン処理)

最終的なコードは、以下になりました。

import requests
import json

data={"mailaddress":"<YOUR EMAIL_ADDRESS>", "password":"<YOUR PASSWORD>"}
r_post_rftoken = requests.post("https://api.jpx-jquants.com/v1/token/auth_user", data=json.dumps(data))

# IDトークン取得
dic_rftoken = json.loads(r_post_rftoken.text)  # 辞書型に変換
REFRESH_TOKEN = dic_rftoken.get('refreshToken')    # リフレッシュトークンのvalueを取得
r_post_idtoken = requests.post(f"https://api.jpx-jquants.com/v1/token/auth_refresh?refreshtoken={REFRESH_TOKEN}")
dic_idtoken = json.loads(r_post_idtoken.text)  # 辞書型に変換
str_idtoken = dic_idtoken.get('idToken')    # IDトークンのvalueを取得


本記事上の私が作成したプログラムは自由にご使用ください。但し、この記事のソフトウェアを使用したことによって生じたすべての障害・損害・不具合等に関して、私と私の関係者および私の所属するいかなる団体・組織とも、一切の責任を負いません。各自の責任においてご使用ください。


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