💹

J-Quants API を GAS で使う (4) 銘柄毎に予想配当利回りを書き込む

2023/12/25に公開

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

これまでの記事では、下準備として API 呼び出しに必要となる ID トークンを取得し、

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

GAS スクリプトを用意して Google スプレッドシートのデータ更新をできるようにして、

https://zenn.dev/seratch/articles/3dca8c0c04d0ae

同じシートにカラムを追加して RSI を書き込むようにしました。

https://zenn.dev/seratch/articles/244db0270510c6

今回は GAS のスクリプトを実行してシート内にある銘柄コード毎に D 列に一株あたり配当予想、E 列に予想配当利回りを表示させてみましょう。

シートに列を追加

D 列、E 列を追加します。

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

一株あたり予想配当を取得

コードエディタを開いて、前回の記事でつくった myFunction() を更新しましょう。

財務情報 API の「一株あたり配当予想_翌事業年度合計」(取得できない場合は「一株あたり配当予想_合計」)を使います。

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, rsi] = _fetchLatestClosePriceAndRSI(code, headers);
    // 銘柄コードが書かれているセルの右隣のセルに取得した値を書き込む
    sheet.getRange(i + 2, 2).setValue(closePrice); // 最新の終値
    sheet.getRange(i + 2, 3).setValue(rsi); // RSI

    const dividend = _fetchForecastDividend(code, headers);
    if (typeof dividend !== 'undefined') { // 取得できなかった場合は手入力
      sheet.getRange(i + 2, 4).setValue(dividend); // 一株あたり予想配当額
    }
  }
}

// 銘柄コードとリクエストヘッダーを受け取って、一株あたり予想配当額を返すメソッド
function _fetchForecastDividend(code, headers) {
  // 財務情報 API - https://jpx.gitbook.io/j-quants-ja/api-reference/statements
  const endpoint = 'https://api.jquants.com/v1/fins/statements';
  const response = UrlFetchApp.fetch(`${endpoint}?code=${code}`, { headers });
  const statements = JSON.parse(response.getContentText()).statements.reverse();
  const latestQ = statements[0];
  const latestFY = statements.find(s => s.TypeOfCurrentPeriod === "FY");
  let dividend = undefined;
  if (latestQ) {
    // 一株あたり配当予想_翌事業年度合計 || 一株あたり配当予想_合計
    dividend = latestQ.NextYearForecastDividendPerShareAnnual || latestQ.ForecastDividendPerShareAnnual;
  }
  if (!dividend && latestFY) {
    dividend = latestFY.NextYearForecastDividendPerShareAnnual || latestFY.ForecastDividendPerShareAnnual;
  }
  // 配当予想が含まれない場合は undefined を返す
  return dividend;
}

そのまま「Run」ボタンから myFunction を実行してみてください。以下のように値が設定されます。

ただ、この記事投稿時点での 7203 (トヨタ自動車)のように、この API から配当情報を取得できない場合もあります。その場合は、別の情報源から調べて値を手動で設定します。このコードは、将来 API から値が応答されるようになれば、その値で自動更新します。

なお、私はプレミアムプランを契約していないので(🙇)使うことができないのですが、プレミアムプラン限定の配当金情報 API という便利なものも用意されています。プレミアムプランの方はシンプルにこれを呼び出すようにすればよいでしょう。

予想配当利回りを計算

株価と一株あたり予想配当がわかったので、予想配当利回りを計算できるようになりました。これはスプレッドシート上の数式を設定するだけで計算できます。四捨五入して小数点第二位まで表示するものは以下のようになります。

=IF(D2<>0, ROUND(D2/B2*100, 2), "")

これを同じ列の全ての行に設定します。

これで予想配当利回りも表示できるようになりました。ここでは最新の終値のみで計算していますが、私の自分用シートでは、取得価額に対する利回りも表示したりしています。

実際に運用するために

この記事を見て「自分もスプレッドシートを使ってデータ管理をしたい」という方は、予めカラムの設計を意識しておくと、後からメンテするのが楽になるかもしれません。

今回の例で言うと「一株あたり予想配当」の金額を日々チェックしたいという人はあまりいないと思います。実際にシートを作っていくとき、このような元データはもっと後ろの方の列に追いやって、ただ他のセルから参照するだけにしたくなるでしょう。その際、今回の例のように最初に D 列に置いていて、あとからガチャガチャ移動すると GAS コードや数式での参照がズレてしまって、面倒なことになりがちです。なので、あらかじめ後ろに置くとどんどん拡張していくときに作業効率が良くなります。

また、元データを後ろに置いておく場合、間にバッファーとして使っていない列を一定数置くとよいかもしれません。こうしておくと、列を増やした場合にも元データの列の始まりを一定の場所(X 列とか)に固定できるので、コード内の参照を変更する手間を大幅に軽減できます。

あとは、少し複雑にはなりますが、元データシートとメインで閲覧するシートを分けるという方法でもよいでしょう。

終わりに

いかがだったでしょうか?このシリーズは一旦終わりとなります。

もっと高度な記事はマケデコ Advent CalendarJ-Quants API の公式アカウント で公開されているので、参考にしてみてください。それでは!

Discussion