どうも、しゅん@Trade Techです。
今回は日本取引所グループ(JPX)の会社であるJPX総研が提供しているJ-Quants API を利用して、Pythonコード上から株価データを取得する方法について解説します。
取得可能なデータの内容や、無料プラント有料プランの違いについても触れていますので、参考にどうぞ。
A. J-Quants API(無料プラン)のアカウント登録
J-Quants APIを利用するためには、アカウント登録が必要です。無料プランもありますので、まずはこちらを登録してみるのをオススメします。登録手順は以下の通りです。
1. ユーザー登録
まずは以下の公式ページにアクセスし、「サインアップ」または「J-Quants API に登録する」からアカウント登録を進めていきましょう。
J-Quants API
https://jpx-jquants.com/
以下のようなユーザー登録ページになりますので、メールアドレスとパスワードを入力します。
パスワードについては「12文字以上かつ英大文字/小文字/数字がそれぞれ1つ以上入っている」必要がありますので、エラーが出る場合はパスワードを長くしたり大文字や数字を入れるなどしてみてください。
仮登録が完了しました。入力したメールアドレス宛にメールが届いていますので確認しましょう。
「[J-Quants API] ご登録手続きのご案内」という件名でメールが届いていると思いますので、メール本文にある「登録用URL」をクリックしましょう。
2. サインインとプランの選択
ここまで手続きを進められれば、ユーザー登録は完了です。以下のようにサインインページが表示されますので、先ほど入力したメールアドレスとパスワードでサインイン(ログイン)してみましょう。
初回サインイン時のみ、以下のようなプラン選択ページになります。今回は無料プランを登録するので、一番左の「無料(Free)」プランを選択しましょう。スクロールしていくと「無料に登録」というボタンがありますので、クリックしてください。
決済ページが表示されますが、今回は無料プランですので左側はすべて「\0」になっているはずです。名前と住所の入力は必須なので、右側にそれぞれ入力し、同意チェックを入れて申し込みましょう。
以上で手続きは完了です。完了すると以下のようなユーザーページが表示されます。(今後サインインした時はこちらのページが最初に表示されます)
Pythonコードから株価データを取得するには?
アカウント登録ができたので、次はPythonコードを書いてJ-Quants APIから日足の株価データを取得してみましょう。サンプルコードも用意したので、Google Colaboratoryなどに貼り付けながら実行してご確認ください。
今回はGoogle Colaboratory上でPythonコードを実行していきます。まだ触ったことのない方は、以下の記事を参考にGoogle Colaboratory環境を用意してから進めてみてください。
※本記事内のコードは連続して実行していくことを想定しています。コードごとにセルへ貼り付けて実行してみてください。
1. リフレッシュトークンの入手
J-Quants API を利用する場合は、取得したいデータごとに定められたURLに、パラメータなどの値を渡す必要があります。正しいURLとパラメータを渡せば、欲しいデータがJSON形式で返ってきます。
どのデータを取得する際にも必ず必要なのが「IDトークン」です。これはAPIを利用するための”鍵”のようなもので、データを取得する際には毎回必ず必要です。
取得方法はいくつかありますが、今回はユーザーページから入手できる「リクエストトークン」を使ってみましょう。J-Quants API にサインインし、トップページ左側にある「リフレッシュトークンを取得する」ボタンをクリックしましょう。
ページ上部に以下のような表示がされれば、リフレッシュトークンがコピーされた状態になっています。
2. IDトークンの取得
続いて、リフレッシュトークンを使ってAPI経由でIDトークンを取得してみましょう。Pythonコードは以下の通りです。refresh_token = ‘******’ の ****** を消して、先ほどコピーしたリフレッシュトークンを貼り付けてから、実行してみてください。
import time
import requests
import json
import pandas as pd
# id token取得
refresh_token = '******'
try:
res = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={refresh_token}")
id_token = res.json()['idToken']
except:
print("idTokenの取得に失敗しました。")
else:
headers = {'Authorization': 'Bearer {}'.format(id_token)}
print("API使用の準備が完了しました。")
「API使用の準備が完了しました。」と出力されれば、IDトークンの取得は完了です。
こちらのコードでやっていることは、以下の通りです。
(1) 「IDトークン取得」APIから取得したデータ(JSON形式)を変数resに取得
(2) resの中にある要素「idToken」の値を変数id_tokenに取得
(3) 変数headersにid_tokenを追加したテキストを格納
変数headersは今後株価データを取得する際に渡すパラメータとなります。
3. 指定銘柄の株価データを取得
IDトークンが取得できたので、株価データを取得してみましょう。今回は「7203 トヨタ自動車」の日足データを取得してみたいと思います。以下のPythonコードを実行してみてください。
# 取得する銘柄コード
code = '7203'
# APIのURL
api_url = f"https://api.jquants.com/v1/prices/daily_quotes?code={code}"
# 株価データを取得
res = requests.get(f"{api_url}", headers=headers)
data = res.json()["daily_quotes"]
# ページネーションがあれば追加取得
while "pagination_key" in res.json():
print("pagination wait..")
time.sleep(1)
pagination_key = res.json()["pagination_key"]
res = requests.get(f"{api_url}&pagination_key={pagination_key}", headers=headers)
data += res.json()["daily_quotes"]
# 取得したデータをDataFrame化
df = pd.DataFrame(data)
# データを出力表示
display(df)
以下のように株価データが表形式で出力されます。(僕はスタンダードプランに契約しているので直近10年分のデータが取得されています。無料プランの場合は、過去2年分かつ12週間前までのデータのみになるはずです)
こちらのコードでは、以下のような手順になっています。
(1) 取得する銘柄コードとAPIのURLを定義
(2) requests.getにAPIのURLと銘柄コード、IDトークン入りのheadersを指定してデータ取得し変数resに格納
(3) res変数の中から株価データが入っている「daily_quotes」要素を探して変数dataに格納
(4) 追加のデータがあればページネーションの仕組みで追加取得
(5) 取得した株価データをPandasのDataFrameに変換
(6) displayで株価データを出力表示
4. データの加工
取得した株価データについて、銘柄コードを4桁にしたり、必要な列のみを抽出したり、といった加工をしてみましょう。
銘柄コードを4桁にする
J-Quants API の銘柄コードは5桁となっております。ほとんどの場合は末尾1桁が不要ですので、4桁に変更してみましょう。以下のPythonコードを実行してみてください。
# 銘柄コードを4桁にする
df['Code'] = df['Code'].str[0:4]
display(df)
Code列が4桁になりました。Code列が文字列型なので、このように書くと「0文字以上4文字目未満」の文字列に切り取ってくれます。
Date列をindex化
Date列を日時型にしてindex化してみましょう。以下のPythonコードを実行してみてください。
# Date列の型を変換
df['Date'] = pd.to_datetime(df['Date'])
# Date列をindex化
df = df.set_index('Date')
display(df)
pd.to_datetimeを使うと、列を日時型に変換できます。日時型にしておくと日付や時刻に関する命令が書きやすくなります。
またインデックスを設定したことで、出力データの左端が太字のDate列になっていると思います。
インデックスというのは、その行の1つのデータを表す「行の名前」のようなもの。初期では0から始まる行番号が設定されていますが、set_indexを使うことでDate列がインデックス化されました。
必要な列のみに絞り込む
J-Quants API から取得したデータは、かなり多くの列があります。必要な列のみを扱った方がデータ量も少なくなり見やすいので、列を絞り込んでみましょう。
今回は銘柄コードと、調整済みの始値/高値/安値/終値/出来高のみにしてみましょう。以下のPythonコードを実行してみてください。
# 必要な列のみ取得
df = df[['Code', 'AdjustmentOpen', 'AdjustmentHigh', 'AdjustmentLow', 'AdjustmentClose', 'AdjustmentVolume']]
display(df)
銘柄コードはCodeですが、価格と出来高についてはCloseやVolumeなどではなく、”Adjustment”とついた方を使っています。OHLCV値については”Adjustment”が付いていないものと付いているものがありますが、付いていない方は未調整の株価(=当時の株価)、付いている方は株式分割/併合で調整済みの株価になります。
今回はチャートを表示させたいので、調整済みの方を使うことにします。
列名を変更
“Adjustment”と毎回書くのは面倒くさいので、消しましょう。列名を変更するにはrenameというDataFrameの関数が使えます。以下のPythonコードを実行してみてください。
# 列名の変更
df = df.rename(columns={'AdjustmentOpen': 'Open',
'AdjustmentHigh': 'High',
'AdjustmentLow': 'Low',
'AdjustmentClose': 'Close',
'AdjustmentVolume': 'Volume'})
display(df)
rename関数のパラメータcolumnsに、変更前と変更後の列名をそれぞれ対に書けば変更が可能です。
5. 終値チャートの表示
データの取得と加工ができたので、終値チャートを表示してみましょう。matplotlibライブラリを使うと、簡単にグラフを表示することができます。以下のPythonコードを実行してみてください。
# 終値チャートの表示
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(16, 9))
df['Close'].plot()
plt.grid(True)
plt.show()
終値チャートがグラフに表示されました。
df[‘Close’].plot() で、終値をチャート表示しています。
6. ローソク足チャートを表示
終値チャートは表示できましたが、株価データを扱うならローソク足チャートも表示させてみたいと思います。ローソク足チャートはmatplotlibでは表示できないので、外部ライブラリを使って実現してみましょう。
今回はmplfinanceというライブラリを利用します。Google Colaboratoryの場合は、1つ新しいセルを用意して以下のコードを実行してみてください。
!pip install mplfinance
こんな感じで英語がいっぱい出てきてびっくりするかもしれませんが、ご安心を。しばらく待って最後の行に「Sucessfully installed mplfinance-~」と表示されれば、インストールが完了しています。
続いてまた新しいセルを用意し、以下のPythonコードを実行してみてください。
# ローソク足チャートを表示
import mplfinance as mpf
df_1y = df[df.index >= '2023-07-01'].copy()
mpf.plot(df_1y, type='candle', figratio=(16, 9), mav=(5, 25, 75), volume=True, style='yahoo')
このようなローソク足チャートが表示されるはずです。
データが多すぎるとローソク足がつぶれてしまって確認しづらいので、今回は「2023-07-01」以降のデータにしてみました。コードのこの部分を変更すると、別の期間でも表示できます。
実際にローソク足チャートを表示しているのは最後の行にあるmpf.plotです。いくつかパラメータがありますが、mavに任意の数値をカンマ区切りで指定することで、移動平均線を自動計算し表示してくれます。(今回は5日/25日/75日の移動平均線を表示)
またvolume=Trueを削除すると、出来高無しのローソク足チャート表示に変更できます。
おわりに
以上、J-Quants API から株価データを取得しローソク足チャート表示するまでを、Pythonコードで書く手順について解説しました。
J-Quants API を利用すると、JPX公式の株価データが取得できますし、株価以外にもファンダメンタル情報などの様々なデータが取得可能です。まずは無料プランで慣れてみて、必要なら有料プランの利用も検討してみてください。
また今回の内容を動画で観ながら学習したい方は、以下の動画チュートリアル講座にもご登録ください。(講座登録いただくと、Pythonをはじめとした株式投資に役立つプログラミングやWebサービスなどの情報を不定期にメールでもお送りさせていただきます)
コメント