📑
SIGNATE日本取引所グループ ニュース分析チャレンジ[追加データ取得編]
SIGNATE日本取引所グループ ニュース分析チャレンジ[環境構築編][1]の続き
J-Quants APIからデータを取得
コンペ期間中はJ-Quants API[2]を使い最新のデータを手に入れることができる
まずJ-Quants APIに登録しrefreshtokenを手に入れる
以下のコードで株価のヒストリカルデータを手に入れられる
import os
import json
import time
import requests
import base64
import pandas as pd
def call_refresh_api(refreshtoken: str):
"""
idTokenをリフレッシュするメソッド。
Parameters
----------
refreshtoken : str
refreshtoken。ログイン後の画面からご確認いただけます。
Returns
-------
resjson : dict
新しいidtokenが格納されたAPIレスポンス(json形式)
"""
headers = {"accept": "application/json"}
data = {"refresh-token": refreshtoken}
response = requests.post(
"https://api.jpx-jquants.com/refresh", headers=headers, data=json.dumps(data)
)
resjson = json.loads(response.text)
return resjson
# 1h有効なtoken get
refreshtoken = "サイトでゲットした自分のrefreshtokenをstrで入れる"
ret = call_refresh_api(refreshtoken)
id_token = ret['idToken']
def call_jquants_api(params: dict, idtoken: str, apitype: str, code: str = None):
"""
J-QuantsのAPIを試すメソッド。
Parameters
----------
params : dict
リクエストパラメータ。
idtoken : str
idTokenはログイン後の画面からご確認いただけます。
apitype: str
APIの種類。"news", "prices", "lists"などがあります。
code: str
銘柄を指定するAPIの場合に設定します。
Returns
-------
resjson : dict
APIレスポンス(json形式)
"""
datefrom = params.get("datefrom", None)
dateto = params.get("dateto", None)
date = params.get("date", None)
includedetails = params.get("includedetails", "false")
keyword = params.get("keyword", None)
headline = params.get("headline", None)
paramcode = params.get("code", None)
nexttoken = params.get("nextToken", None)
headers = {"accept": "application/json", "Authorization": idtoken}
data = {
"from": datefrom,
"to": dateto,
"includeDetails": includedetails,
"nextToken": nexttoken,
"date": date,
"keyword": keyword,
"headline": headline,
"code": paramcode,
}
if code:
code = "/" + code
r = requests.get(
"https://api.jpx-jquants.com/" + apitype + code,
params=data,
headers=headers,
)
else:
r = requests.get(
"https://api.jpx-jquants.com/" + apitype, params=data, headers=headers
)
resjson = json.loads(r.text)
return resjson
#month = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
month = ["01", "02", "03"]
day = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18',
'19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31']
results = []
for m in month:
for d in day:
next_flg = True
next_token = None
while next_flg:
date = f"2021-{m}-{d}"
print(date)
paramdict = {}
paramdict["date"] = date
paramdict["includedetails"] = "True"
paramdict["nextToken"] = next_token
ret = call_jquants_api(paramdict, id_token, "prices")
results.append(pd.DataFrame(ret['prices']))
if 'nextToken' in ret.keys():
next_token = ret['nextToken']
else:
next_flg = False
time.sleep(1)
df = pd.concat(results, axis=0)
ポイントはnextTokenが存在する場合その日の株価データの続きがあるのでnextTokenを設定してapiを叩くことで続きが手に入るということ。
date = f"2021-{m}-{d}" ここを修正すれば任意の日付の株価データが手に入ります。
Local Codeのlistと日付をチェックして取得できているかは各自チェックしてください[
つづく[3]
Discussion