【GAS】J-Quants APIを使って株価情報を取得する

GAS(Google Application Script)に戻る

目次

概要

最近は資産形成のため株を買う人も増えているだろう。
証券会社や個人ブログなどをみれば株価情報や推移を見ることはできるが、
システム化してデータを取得するとなると手間になるうえ、過去の情報になればなるほど内容も曖昧になってくる。

そこで、株式会社JPX総研が提供しているJ-Quants APIを使用して情報を取得する。
ただし、有料会員でないとリアルタイムの情報を取得できないため、役立てるなら有料会員になった方がいいと思われる。

手始めにフリーでできる範囲でやってみる。
プランごとに何ができるかはこちらを参照。

ソースコード

function myFunction() {
  const idToken = issueIdToken();
  const headers = { 'Authorization': `Bearer ${idToken}` };
  const code = "7203"; // 例として、トヨタ自動車の銘柄番号
  const closePrice = _fetchLatestClosePrice(code, headers);
  console.log(closePrice);
}

function issueIdToken() {
  const user = "[登録したメールアドレス]"
  const password = "[パスワード]";
  const tokenAuthuserApiUrl = 'https://api.jquants.com/v1/token/auth_user'

  // // リフレッシュトークン取得用の API を呼び出してトークン文字列を変数に代入
  const refreshTokenRequest = JSON.stringify({ 'mailaddress': user, 'password': password });
  const refreshToken = JSON.parse(UrlFetchApp.fetch(tokenAuthuserApiUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: refreshTokenRequest,
  }).getContentText()).refreshToken;

  const tokenAuthRefreshApiUrl = `https://api.jquants.com/v1/token/auth_refresh?refreshtoken=${refreshToken}`
  const idToken = JSON.parse(UrlFetchApp.fetch(tokenAuthRefreshApiUrl, {
      method: 'post',
      }).getContentText()).idToken;

      console.log(`Got an idToken: ${idToken.substring(0, 30)}...`)
      return idToken;
}

// 株価四本値 API に渡す日付の形式に変換する
function _formatDate(dt) {
  const y = dt.getFullYear().toString();
  const m = ('00' + (dt.getMonth() + 1)).slice(-2);
  const d = ('00' + dt.getDate()).slice(-2);
  return `${y}${m}${d}`;
}

// 銘柄コードとリクエストヘッダーを受け取って最新の終値を返すメソッド
function _fetchLatestClosePrice(code, headers) {
  const pricesDailyQuotesApiURl = 'https://api.jquants.com/v1/prices/daily_quotes';

  const to = new Date();
  to.setDate(to.getDate() - 90);
  const toDate = _formatDate(to);
  
  const from = new Date();
  from.setDate(from.getDate() - 100);
  const fromDate = _formatDate(from);

  const pricesDailyQuotesApiWithCode = `${pricesDailyQuotesApiURl}?code=${code}&to=${toDate}&from=${fromDate}`;
  const apiResponse = UrlFetchApp.fetch(pricesDailyQuotesApiWithCode, { headers });
  const body = JSON.parse(apiResponse.getContentText());
  const dailyQuotes = body.daily_quotes;
  if (dailyQuotes) {
    dailyQuotes.reverse(); // 降順にして最新のものを一番先頭に
    for (const dailyQuote of dailyQuotes) {
      if (dailyQuote && (dailyQuote.AdjustmentClose || dailyQuote.Close)) {
        return Number.parseFloat(dailyQuote.AdjustmentClose || dailyQuote.Close);
      }
    }
  }
  return null;
}

詳細

まず、下準備としてアカウント登録などを行う必要がある。
詳細は公式ページのAPI使用までの流れを参照。

その後は以下のコードを参照。

function issueIdToken() {
  const user = "[登録したメールアドレス]"
  const password = "[パスワード]";
  const tokenAuthuserApiUrl = 'https://api.jquants.com/v1/token/auth_user'

  // // リフレッシュトークン取得用の API を呼び出してトークン文字列を変数に代入
  const refreshTokenRequest = JSON.stringify({ 'mailaddress': user, 'password': password });
  const refreshToken = JSON.parse(UrlFetchApp.fetch(tokenAuthuserApiUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: refreshTokenRequest,
  }).getContentText()).refreshToken;

  const tokenAuthRefreshApiUrl = `https://api.jquants.com/v1/token/auth_refresh?refreshtoken=${refreshToken}`
  const idToken = JSON.parse(UrlFetchApp.fetch(tokenAuthRefreshApiUrl, {
      method: 'post',
      }).getContentText()).idToken;

      console.log(`Got an idToken: ${idToken.substring(0, 30)}...`)
      return idToken;
}

API(https://api.jquants.com/v1/token/auth_user)に必要なデータ(登録したメールアドレスとパスワード)を渡す。渡し方は以下の部分だ。

const tokenAuthuserApiUrl = 'https://api.jquants.com/v1/token/auth_user'
const refreshTokenRequest = JSON.stringify({ 'mailaddress': user, 'password': password });
const refreshToken = JSON.parse(UrlFetchApp.fetch(tokenAuthuserApiUrl, {
  method: 'post',
  contentType: 'application/json',
  payload: refreshTokenRequest,
}).getContentText()).refreshToken;

こうすると、refreshTokenにAPIを呼び出すのに必要なトークンを取得できる。
今回は指定した銘柄の株価を取得してみよう。

const idToken = [上記で取得したトークン];
const headers = { 'Authorization': `Bearer ${idToken}` };
const code = "7203"; // 例として、トヨタ自動車の銘柄番号
const closePrice = _fetchLatestClosePrice(code, headers);
const pricesDailyQuotesApiURl = 'https://api.jquants.com/v1/prices/daily_quotes';

const to = new Date();
to.setDate(to.getDate() - 90);
const toDate = _formatDate(to);
  
const from = new Date();
from.setDate(from.getDate() - 100);
const fromDate = _formatDate(from);

const pricesDailyQuotesApiWithCode = `${pricesDailyQuotesApiURl}?code=${code}&to=${toDate}&from=${fromDate}`;
const apiResponse = UrlFetchApp.fetch(pricesDailyQuotesApiWithCode, { headers });
const body = JSON.parse(apiResponse.getContentText());
const dailyQuotes = body.daily_quotes;
if (dailyQuotes) {
  dailyQuotes.reverse(); // 降順にして最新のものを一番先頭に
  for (const dailyQuote of dailyQuotes) {
    if (dailyQuote && (dailyQuote.AdjustmentClose || dailyQuote.Close)) {
      return Number.parseFloat(dailyQuote.AdjustmentClose || dailyQuote.Close);
    }
  }
}

株価を取得するためのAPIのURLは「https://api.jquants.com/v1/prices/daily_quotes」。
そして、「code」に銘柄の番号を、「to」と「from」に取得する期間を設定する。

例えば、トヨタの2025/2/19~2025/3/1までの株価を取得する場合は以下のようになる。

https://api.jquants.com/v1/prices/daily_quotes?code=7203&to=20250301&from=20250219

すると、以下の部分で株価を取得できる。

Number.parseFloat(dailyQuote.AdjustmentClose || dailyQuote.Close);

参考ページ

GAS(Google Application Script)に戻る