GASで作る一括投資の-5%ルールアラート
記事の内容
- 一括投資を行うタイミングになると、週末Gmailにメールが届くGASの紹介
こんな人向けの記事
- 一括投資を行うタイミングのチェックを自動化したい方
- 資産の現金比率が高すぎるため、一括投資のタイミングを伺っている方
目次
前提となる-5%ルールとは
【投資塾】知らないより知っていた方が役立つ話さんが提案されている投資方法になります。
具体的には週末同士の終値を比較し、5%下落したタイミングで一括投資する手法です。
データ分析結果等、詳細は動画を参照ください。
-5%ルールについて
騰落率の確認作業の弊害
ただ、実際やってみるとなかなか難しい事がわかります。
確認作業の弊害
- 単純に計算するのが面倒くさい。
- 騰落率が5%弱だった場合、まぁいいかとルールを厳守出来ない可能性がある。
- 週末になると株価が気になって仕事に身が入らない。
そのため、GASで機械的に判断してしまおうというのが狙いです。
スプレッドシート設定
スプレッドシート設定
シート名
コードをそのまま使用する場合:SPX
銘柄変えたりする場合は変数:stockNameと一致させてください。
列
スクレイピング先のテーブル書式に則り、以下様になっています。
A:日付 B:始値 C:高値 D:安値 E:終値 F:前日変動 G:前日変動率 H:先週比変動率
Google Apps Script
SPXAlart.gs
TARGET_DROP_RATE = -5; // 騰落率(%)
TAEGET_VALUE_COLUMN = 5; // 終値の行
//列 1:日付 2:始値 3:高値 4:安値 5:終値 6:前日変動 7:前日変動率 8:先週比変動率
//スプレッドシート名はstockNameと一致させてください。(このまま使う場合は「SPX」)
//土曜日に実行する前提のプログラム
function send_message(rate,stockName){
var recipient = Session.getActiveUser().getUserLoginId();
var subject = "一括購入アラート!";
var body = stockName + " 騰落率は" + Math.round(rate*100*100) / 100 + "%です\n";
GmailApp.sendEmail(recipient, subject, body);
}
function AlartSPX() {
let stockName = "SPX"; // 通知を設定する銘柄
// 株価を取得するシートを開く
const workbook = SpreadsheetApp.getActive();
const sheet= workbook.getSheetByName(stockName);
// 株価の時系列データの取得
let URL = "https://nikkeiyosoku.com/spx/data/";
let html = UrlFetchApp.fetch(URL).getContentText("UTF-8");
let stock_data_table = Parser.data(html)
.from('<tbody class="text-right">')
.to('</table>')
.build();
// tr区切りでList化
let stock_data_tr = Parser.data(stock_data_table)
.from('<tr>')
.to('</tr>')
.iterate();
// 処理行の初期値を設定
let row_now = 2;
// ループを回して、株価の時系列データをスプレッドシートに書き込む
for(let i=0; i<stock_data_tr.length; i++){
// スプレッドシートの日付取得
let date_first_row = dayjs.dayjs(sheet.getRange(row_now, 1).getValue()).format('YYYY/MM/DD');
// Listより日付を取得
let stock_data_td_day = Parser.data(stock_data_tr[i])
.from('<td>')
.to('</td>')
.build();
if(date_first_row !== stock_data_td_day) {
// 株価データを取得
let stock_data_td = Parser.data(stock_data_tr[i])
.from('<td>')
.to('</td>')
.iterate();
// スプレッドシートに書き込み
sheet.insertRows(row_now, 1);
sheet.getRange(row_now, 1).setValue(stock_data_td_day);
for(let j=0; j<stock_data_td.length; j++){
let inputValue = stock_data_td[j]
//ゴミ取り
inputValue = inputValue.replace("<span class=\"rise\">","")
inputValue = inputValue.replace("<span class=\"fall\">","")
inputValue = inputValue.replace("</span>","")
inputValue = inputValue.replace("+","")
sheet.getRange(row_now, j+1).setValue(inputValue);
}
}
row_now++;
}
//休場日がない場合、7行目が終日データ
let lastWeek_row =7
const lastWeek_day = dayjs.dayjs(sheet.getRange(lastWeek_row, 1).getValue()) ;
//週末日検索
for (let i=lastWeek_row; i>=2; i--){
let upperCell_day = dayjs.dayjs(sheet.getRange(i-1, 1).getValue()) ;
if (upperCell_day.diff(lastWeek_day,"d")!=1){
lastWeek_row = i
break
}
}
// 最新データと週末データより騰落率を計算
const price_now = sheet.getRange(2, TAEGET_VALUE_COLUMN).getValue();
const price_lastWeek = sheet.getRange(lastWeek_row, TAEGET_VALUE_COLUMN).getValue();
const value_rate = (price_now - price_lastWeek) / price_lastWeek;
//騰落率記入
sheet.getRange(2, 8).setValue(value_rate).setNumberFormat('0.00%');
// 騰落率が設定値を下回っていたらメールを送る
if(value_rate*100 < TARGET_DROP_RATE) {
send_message(value_rate,stockName);
}
}
appsscript.json
{
"timeZone": "Asia/Tokyo",
"dependencies": {
"libraries": [
{
"userSymbol": "Parser",
"version": "8",
"libraryId": "1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw"
},
{
"userSymbol": "dayjs",
"version": "1",
"libraryId": "1ShsRhHc8tgPy5wGOzUvgEhOedJUQD53m-gd8lG2MOgs-dXC_aCZn9lFB"
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
トリガー設定
土曜日に実行するようにしてください。
アラート
こんな感じでメールが届きます。
備考
- 土曜日に実行する前提のプログラムとなっています。
- スクレイピングによりSPXのデータを取得しています。
- -4、-3%ルールを行いたいかたは、プログラムの騰落率の値を変更してください。
- SPX以外の銘柄で行いたい場合は、スクレイピング先に合わせたコードの修正を行ってください。