Google App Script 投資 自動化

【GAS】米国株決算発表予定メールから決算予定日にカレンダー登録

はじめに

米国株個別投資をやっていると、日本と違い決算発表予定日が4半期ごとにあり、銘柄ごとに発表日が分散するので、発表情報を入手して決算予定日を確認するのが結構手間に感じる人はいるかと思います。これについて、ひと手間減らすために、決算発表予定メールに記載されている決算予定日をGoogleカレンダーに自動登録する仕組みを考えました。

楽天証券では、銘柄情報通知サービスがあり、保有銘柄やお気に入りに登録されている銘柄の決算発表予定日前に通知メールを受け取ることができます。この内容をもとにGoogle Apps Scriptを使用してカレンダーに自動登録します。

また、Google App Scriptについては以下の記事を参照ください。

ここで紹介する内容は、以下の条件を満たす方が対象となります。

対象読者

  • 楽天証券の口座を保有している
  • 楽天証券の銘柄情報通知メール設定において配信希望としている
  • 楽天証券からの配信メールにGmailを指定している
  • 決算予定日をGoogleカレンダーに自動登録させたい

楽天証券の銘柄情報通知メール設定は、以下の画面で行うことができます。

  • マイメニュー
    • メールサービス
      • 銘柄情報通知メール
        • 登録・変更する

お気に入りに登録されている銘柄の決算発表予定日も確認したい場合は、「お気に入り登録銘柄の配信」にもチェックを入れます。

決算発表予定日をGoogleカレンダーに自動登録する

ほとんどの処理はこれまで公開したカレンダー登録と同様です。

主な違いは以下の3点です。

  • メール検索文字が楽天証券からの銘柄情報通知サービスである
  • メール本文内容解析
  • カレンダーに登録する文字は「決算発表(銘柄コード)」です

以下では、異なる部分のみについて説明します。

未処理メールの抽出

楽天証券からの積立完了メールを抽出します。

メールの抽出条件の構文は、Gmailの抽出条件に設定できる構文と同じです。

// 処理済み後に付けるラベル名(ラベルが存在しなければ自動的に作られる)
var LABEL = '自動処理済';

// GMail検索文字列(楽天カードからの請求予定金額情報)
var SEARCH_QUERY = 'is:unread -label:' + LABEL + ' from:service@rakuten-sec.co.jp subject:米国株式の決算発表予定日をお知らせします(銘柄情報通知サービス)';

イベント内容説明

  • メールのプレーンテキストをmessage.getPlainBody()で取得します。
  • announceDateに決算発表予定日を格納。
  • イベントタイトルは「決算発表(銘柄コード)」。
  • イベント色はCalendarApp.EventColor.REDで指定する赤色。
  • カレンダーに登録後、該当メールに「自動処理済」のラベルをputLabel()で付与します。
function registAnnounceDayInformationToCalendar() {

  // デフォルトカレンダーを取得
  var calendar = CalendarApp.getDefaultCalendar();

  var threads = GmailApp.search(SEARCH_QUERY, 0, 1);
  if (threads.length === 0) {
    Logger.log("メールが見つかりません");
    return;
  }

  for(var k in threads){
    var thread = threads[k]
    var messages = thread.getMessages();
    for (var j in messages){
      var message = messages[j];
      var body = message.getPlainBody();    // HtmlメールからPlain textの本文を取得する

      // 楽天証券からの決算発表予定日情報メールの内容確認
      var rows = body.split("\n");
      for (var i in rows) {
        var row = rows[i];

        // 決算情報取得
        // ex)ダウ・インク(DOW):2021/10/20
        var ret = row.match(/.*(\w*):\d{4}\/\d{2}\/\d{2}/gi);
        if(ret){
          var ticker = ret[0].match(/\([A-Z]*\)/gi);
          var announceDate = new Date(ret[0].match(/\d{4}\/\d{2}\/\d{2}/));
          var title = '決算発表' + ticker[0];

          // Googleカレンダーに登録
          if(title && announceDate){
            if(checkConflict(calendar, announceDate, title) == false){
              var event = calendar.createAllDayEvent(title, announceDate);
              event.setColor(CalendarApp.EventColor.PALE_RED);
              //event.removeAllReminders();   // 予定なので通知させる
            }
          }
        }
      }

      // 処理済みメールとしてラベルを付ける
      libCtrlMail.putLabel(thread); 
    }
  }
}

checkConflict()とputLabel()関数は、libCtrlCalendarとlibCtrlMailを参照ください。

実行結果

Googleカレンダーには以下のように登録されます。

最後に

メールが通知手段になっているけれども、確認手段として一つ一つのメールを見て回るのは面倒だし、必要な情報にたどり着くまでに「探す」手間が必要となるため、本当に面倒くさくなります。その結果、決算発表を確認しなくなってしまうことが考えられます。

情報の一元化は、効率向上の一つの手段だとほんと思います。「手間を惜しまず」という言葉はある意味正しいのですが、手間をかけなくても目的を達成する手段があるのであれば、採用しない理由はないですよね。

では、今日も良い一日を。

-Google App Script, 投資, 自動化
-, , , , ,