💹

J-Quants API を GAS で使う (2) 銘柄毎に最新の終値を書き込む

2023/12/23に公開

この記事は JPX 総研さんが提供している J-Quants API を GAS (Google Apps Script) で利用する方法を説明するシリーズの第二回目です。

前回の記事では、下準備として ID トークンを取得する実装例を説明しました。

https://zenn.dev/seratch/articles/aa2adaab185758

今回は GAS のスクリプトを実行してシート内にある銘柄コード毎に最新の終値を隣のセルに書き込むということをやってみましょう。

新しいシートを作る

こんな感じのシートを新しく作ります。

スプレッドシートの名前は何でもよいですが、ここで使用するシートの名前は「銘柄管理」としています。別の名前でも構いませんが、以下に示すコード例はこの命名を前提としているので、別のものにする場合はコード内の該当箇所も同じように書き換えてください。

シートで実行するスクリプトを用意する

コードエディタを開いて

前回の記事で用意した issueIdToken() 関数をコピーしてきて、あらかじめ用意されている myFunction() 内で呼び出してみることにしましょう。

function myFunction() {
  const idToken = issueIdToken();
}
function issueIdToken() {
  // そのままコピペして貼り付けます

画面上はこんな感じになるはず:

次は、スクリプトプロパティを設定するために画面の左側の「⚙️(歯車)」アイコンをクリックし、下までスクロールします。

スクリプトプロパティの設定画面を開いたら J-Quants API を利用するために作成したアカウントのログイン情報を J_QUANTS_USERJ_QUANTS_PASSWORD として設定して保存します。

そのまま「Run」ボタンから myFunction を実行してみてください。おそらくスクリプトに権限を与える必要があると言われると思いますので、画面上の流れに従って権限を許可してみてください。



権限を付与すると、実行できるようになっているはずです。

ある銘柄の最新の終値を取得してみる

株価四本値 API を使って、トヨタ自動車 (7203) の最新の終値を取得してみましょう。myFunction() を以下のように書き換えて実行してみます。

function myFunction() {
  const idToken = issueIdToken();
  const headers = { 'Authorization': `Bearer ${idToken}` };
  const code = "7203"; // トヨタ自動車
  const closePrice = _fetchLatestClosePrice(code, headers);
  console.log(closePrice);
}

// 銘柄コードとリクエストヘッダーを受け取って最新の終値を返すメソッド
function _fetchLatestClosePrice(code, headers) {
  // 株価四本値 API - https://jpx.gitbook.io/j-quants-ja/api-reference/daily_quotes
  const endpoint = 'https://api.jquants.com/v1/prices/daily_quotes';
  const to = _formatDate(new Date());
  const tenDaysAgo = new Date(); // 土日祝日を考慮して少し多めに取ってくる
  tenDaysAgo.setDate(tenDaysAgo.getDate() - 10);
  const from = _formatDate(tenDaysAgo);

  // パラメーターつきの API URL
  const url = `${endpoint}?code=${code}&to=${to}&from=${from}`;
  // ID トークンをリクエストヘッダーに含めてリクエストを実行
  const apiResponse = UrlFetchApp.fetch(url, { headers });
  const body = JSON.parse(apiResponse.getContentText());
  // console.log(JSON.stringify(body, null ,2));
  const quotes = body.daily_quotes;
  if (quotes) {
    quotes.reverse(); // 降順にして最新のものを一番先頭に
    for (const q of quotes) {
      if (q && (q.AdjustmentClose || q.Close)) {
        return Number.parseFloat(q.AdjustmentClose || q.Close);
      }
    }
  }
  return null;
}

// 株価四本値 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 myFunction() {
  const idToken = issueIdToken();
  const headers = { 'Authorization': `Bearer ${idToken}` };
  const sheetName = '銘柄管理'; // シートの名前と同一であること
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  // まとめてセルの値情報を持ってくる
  const codeCells = sheet.getRange(2, 1, sheet.getDataRange().getLastRow() - 1); // ヘッダー行をスキップしています
  const codes = codeCells.getValues();
  for (let i = 0; i < codes.length; i++) {
    const code = codes[i][0].toString();
    if (!code) { // 銘柄コードが設定されていない行があったらそれ以降は処理スキップ
      break;
    }
    const closePrice = _fetchLatestClosePrice(code, headers);
    // 銘柄コードが書かれているセルの右隣のセルに取得した値を書き込む
    sheet.getRange(i + 2, 2).setValue(closePrice);
  }
}

保存したらまた myFunction() を実行してみてください。

おそらくシートのデータへのアクセスを許可するよう促されると思いますので、上でやった手順と同様にこのスクリプトに権限を付与してください。

実行して正常に処理できたら、以下のように株価が書き込まれるはずです。

自動実行するトリガーを追加

手動で実行して動いていることが確認できたので、最後に毎日自動で実行されるように設定しておきましょう。

トリガーの設定画面に移動して、右下にある追加ボタンからトリガーを設定します。

こんな感じで、日次で夜中や早朝に実行するようにしておくとよいと思います。

保存すると以下のような画面表示になるはずです。

なお、当日の四本値は、大引け後しばらく経ってからでないと取得できないので、当日中に更新したい場合は夕方以降にスケジュールしておく方がよいと思います(もしかすると当日で取得できるタイミングは契約プランによって違うかもしれませんが)。

実際にどのように使っているか

いかがだったでしょうか?この記事で Google スプレッドシートで J-Quants API を使うために必要な準備の手順は網羅できているはずです。

最後に、私が実際にはどういう風に GAS を使っているのか、簡単に紹介してみたいと思います(私がやっていることが他の方に有益かどうかはわかりませんが、やれることのイメージはつきやすくなるのかなと思います)。

実際に使っている自分用のスプレッドシートでは、最新の終値だけではなく、色々と自分が見たい情報を一覧できるようにしています。

株価については、株価四本値 API を使って、銘柄毎に自分の取得価額(これは手動で書き込み)と最新の終値の比較、過去数日・一ヶ月・三ヶ月・半年・一年・五年での最高値との単純な比較、RSI(14 日線)の自動計算などを日次で自動更新しています。

それに加えて、財務情報 API から、特に EPS、BPS、発行済株式数、一株あたり配当予想、当期純利益、営業 CF、年間売上高、純資産などを取得しています。これらを元データとしてセルに書き込むようにした上で、それらを参照する数式を使って、予想配当利回り、時価総額、ROE、PER、PBR、PSR、YoY 増収率(直近 FY とその前年の比較)、営業利益率(直近 FY)をある程度ざっくりな値で自動更新しています。

あくまで "ざっくり" な計算ではあるのですが、自分が傾向を見るためだけのものであり、値も大きくずれているわけでもないので、そこは許容しています。(あとはプレミアムではないプランで契約しているという事情もあったりします・・スミマセン)

なお、ROE や PBR の正確な計算方法は J-Quants API の公式アカウントから解説記事が公開されているので、そちらを参考にするのがよいと思います。

https://qiita.com/j_quants/items/976071fbc0366eb5ab9f

あとは JPX のサイトの情報、会社四季報オンラインの情報を手動で持ってきて、JPX 日経インデックス400 の銘柄かどうかを表示したり、従業員一人当たり売上高を計算したりもしています。

さらに見やすくするために条件付き書式で色付けしていて、今日時点だと以下のような感じになっています。実際には、このスクリーンショットのさらに左側には銘柄コードと銘柄名、さらに右側には自分のメモなどがついています。ものぐさなので、銘柄コードから四季報オンラインのページにリンクを自動で貼るようにしたりとか、細かい使い勝手も工夫しています。

青方面の色が私にとって好ましいというような意味になっていますが、適宜見直して調整しています。数字の単位は率だったり億円だったり色々ですが、自分にとって見やすいようにしています。また、私自身の知識・経験がまだ発展途上なので、表示項目も適宜見直しをしています。来年には違った一覧になっているかもしれません。

ちなみに今日時点で約 600 銘柄を管理していますが、普段はそんなに見ないので、その中でも最近上昇している銘柄、注目している銘柄・保有している銘柄などの一覧に簡単にフィルターできるようにしてあります。

ということで、大した分析をしているわけではないのですが、これから API を使ってみようと思っている方に「こういうこともできるんだなー」というイメージを持つための参考になれば幸いです。

さて、ここで割と細かくやっていることを書いた結果、自分の中ではもう満足してしまった感が若干あるのですが・・あともう一つくらいはこのネタで記事を書いてみようかなと思います。私が自分用にやっている計算のうち、誰かの役に立ちそうなものをピックアップしてシンプルな実装例を紹介する予定です。

Discussion