SIGNATE日本取引所グループ ニュース分析チャレンジ[追加データ取得編]

4 min read読了の目安(約3700字

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]

脚注
  1. 前記事 ↩︎

  2. J-Quants API ↩︎

  3. 次の記事 ↩︎