エンジニアリング

へたれエンジニアが積立投資で使えそうな5%下落ルールをLineで通知するマンをGASで作ってみた

どーもへたれです。
私、積立投資をコツコツやっています。

いつ何があるかわからない不安定な昨今、コツコツ自衛しないといかんですよね・・・とVTIとオールカントリー(全世界株式)あたりを積立しております。

そんな中でyoutubeでちょこちょこ投資系の動画も見ているのですが、その中で特に参考にしているのが「【投資塾】知らないより知っていた方が役立つ話」さん です。


こちらのチャンネルの動画は過去のチャートのバックテストをして検証を頻繁にやっており雰囲気ではなく過去のデータからの積み上げの内容が多く、面白いです。

その中でも「-5%ルール」の動画は実際に試しています。
こちらの動画です。

こちらのルールは明確明朗なルールです。

  1. 前週から-5%の価格の下落があったら買う

これだけです。

毎日、チャートを見るのとかは忙しくてなかなか出来ないので、こちらの買いシグナルがたった時にLineで通知してみることにしました。

システム要件

こんな感じで作ろうと思います。

  1. 株価はgoogleスプレッドシートでGOOGLE FINANCE関数を使って取得する
  2. 計算はGASでやる(別にスプシでやるでも良い・・・後で気づいた)
  3. 夕方17:00ごろにGASのタイマートリガー起動で計算を行う
  4. Line通知はLINE Notifyを使って実施

※ここで、スプシの登録方法やLine Notifyのやり方は記載しません。

ってことで早速作っていきましょう。

スプレッドシートの構築

こんな感じのスプレッドシートを作ってみました。

株価取得の関数はこんな感じにしてます(VTIのところだけピックアップ)

=GOOGLEFINANCE("NYSEARCA:VTI","close",today()-2)
=GOOGLEFINANCE("NYSEARCA:VTI","close",today()-9)

-2にしているのは、時差対策です。起動日-2日にしないとアメリカ市場の終値が取得できないからです。
1週間前の日付は基準日-9日にすることで取得してます。

上記から、リアルタイムというよりは実情よりは少し遅れてます。
ただ、投資信託なので、リアルタイム性が一定薄くても良いかなと。底を拾いきることは難しいと思うからです。

GASのコードを書く

こんな感じで書いてみました。

function myFunction() {
  let date = new Date();
  Logger.log("起動日:" + Utilities.formatDate( date, 'Asia/Tokyo', 'yyyyMMdd: hh:mm:ss'));

  const startUpProcess = flag => {
    if(flag){
      throw "月なので処理を終了します";
    }
  }
  //今日日付が 火〜日かを判定
  startUpProcess(flag = .includes(date.getDay()));

  //google スプレッドシートから各種株価指数を取得する
  const ss =  SpreadsheetApp.openByUrl("スプシのURL"); 
  const sheet = ss.getSheetByName("スプシのシート名");
  const ggss = {
    "nasdaqtoday" : sheet.getRange("D3").getValue(),
    "nasdaqdate"  : sheet.getRange("C3").getValue(),
    "nasdaq1weekAgo" : sheet.getRange("F3").getValue(),
    "nasdaq1weekdate"  : sheet.getRange("E3").getValue(),
    "vtitoday" :  sheet.getRange("D5").getValue(),
    "vtidate" :  sheet.getRange("C5").getValue(),  
    "vti1weekAgo" :  sheet.getRange("F5").getValue(),
    "vti1weekdate" :  sheet.getRange("E5").getValue(),
  }

  //デバックログとして値を出力
  Object.keys(ggss).forEach(key => Logger.log('key:' + key + ' value:' + ggss[key]));

  //実際の値計算
  //小数点のシフト
  const syousu = (val,num) => Math.floor(val * Math.pow(10,num)) / Math.pow(10, num);
  //-5%の割り出し
  const calhikaku = (today, ago) => 1 - (today / ago);
  //実際の計算
  const calKabuPercent = (today,ago) => syousu(calhikaku(today,ago),3) * 100;


  //どちらかが5%以上になったらLineを送信
  if(calKabuPercent(ggss.nasdaqtoday,ggss.nasdaq1weekAgo) >=5 || calKabuPercent(ggss.vtitoday,ggss.vti1weekAgo) >= 5) {
      let lineMessageText = "■-5%ルールが発動しています! \n" + "NASDAQ100(当週/前週(比較値))\n" + ggss.nasdaqtoday + " / " + ggss.nasdaq1weekAgo + "(" + 
                                                                                          calKabuPercent(ggss.nasdaqtoday,ggss.nasdaq1weekAgo)+ "%)\n" + 
                                                                                          "VTI((当週/前週(比較値))\n"  + ggss.vtitoday  + " / " + 
                                                                                          ggss.vti1weekAgo +  "(" + calKabuPercent(ggss.vtitoday, ggss.vti1weekAgo) + "%)";
      lineSendFunction(lineMessageText);

  } else {
    //lineSendFunction( "本日は-5%超えはありませんでした");
    //必要なときだけアラートを鳴らす
  }
}


function lineSendFunction(lineMessageText) {
  let token = "tokenをいれる";
  let options = {
    "method" : "post",
    "headers" : {
      "Authorization" : "Bearer "+ token
    },
    "payload" : {
      "message" : lineMessageText
    }
  }
  let lineUrl = "https://notify-api.line.me/api/notify";
  UrlFetchApp.fetch(lineUrl, options);  
}

月曜日は処理を動かしても値が取得出来ないため、終了をさせてます。
それ以外は5%の下落が見えたらLineを送るシンプルな内容です。

処理を書いたら時間起動で設定すれば完了です。

実際に動かしてみた

こんな感じで-5%の通知が発生すればLineで教えてくれます。
これで、資産形成が・・・少しは良くなる・・・はず??