その他

GASを活用した株価データ解析:最高株価の日付とその価格を抽出するコード[No112]

スポンサーリンク

この記事では、Google Apps Scriptを活用して、株価データを自動的に取得し、その中から任意で指定した期間内での最高株価を見つけて記録する方法について詳しく解説します。Google SheetsとGoogle Apps Scriptを組み合わせることで、手動の作業を省きながら株価のトレンドを追跡する効果的な手法を学びましょう。

イントロ

株式市場での成功は、正確な情報と計画的な取引に依存しています。この記事では、Google Apps Scriptを使って、自動的に株価データを取得し、最高株価を記録する方法を紹介します。手動の作業を省き、効率的にトレンドを追跡しましょう。

事前に参考になる記事の提案

この記事を読む前に、以下の記事を先に参照することで、理解が深まるでしょう。

no image
ETFや株が特定条件下の時、通知をする仕組みを考える[No111]
SPYD・VYM・HDVなどの高配当ETFを毎月一定額購入していましたが、この定期購入の買い方を変更することにしました。変更後は、自分があらかじめ指定した条件の範囲内になったときに買 ...

ソースコードの紹介と解説

1.スプレッドシートに「SH1」シートを新規で作成する

2.以下のコードを設定して実行する。

以下が、あらかじめ指定した期間内での最高株価とその日付の記録を行うためのGoogle Apps Scriptコードです。

銘柄は高配当ETFのVYMにしています。また、気付きが多くありましたので、コメントを多く残しています。



function getDate() {

  try {

    //■■■
    // スプレッドシートのシートを取得します
    var sheet = SpreadsheetApp.getActiveSheet();
    // var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SH1');

    // sheet.clear();
    // sheet.getDataRange().clear();
    // sheet.clearContents();
    // sheet.clearFormats();
    // sheet.getRange("B2").clearFormat();
    // sheet.clearNotes();
    // sheet.clear({ contentsOnly: true, formatOnly: true });
    // sheet.getDataRange().clear({ contentsOnly: true, formatOnly: true });
    // sheet.getDataRange().setNumberFormat("0");

    //◇◇◇◇◇
    //■今度、記事で紹介をする予定。
    // シートにデータが1列以上ある場合

    // var startNumber = 1;
    // var numColumns = 26;

    // for (var i = 0; i < numColumns; i++) {
    //   sheet.getRange(1, 1 + i).setValue(startNumber + i);
    // }

    // SpreadsheetApp.flush();

    // if (sheet.getLastColumn() > 0) {
    //   console.log("★データあり");
    //   var lastC = sheet.getLastColumn();
    //   sheet.insertColumns(lastC, lastC);
    //   sheet.deleteColumns(1, lastC);
    //   sheet.deleteColumns(lastC);
    //   sheet.insertColumns(lastC - 1, 1);
    // } else { // シートにデータがない場合
    //   console.log("★データなし");
    //   // 10列目から10列分の列を挿入
    //   sheet.insertColumns(10, 10);
    //   // 1列目から10列目までの列を削除
    //   sheet.deleteColumns(1, 10);
    // }
    //◇◇◇◇◇

    SpreadsheetApp.flush();

    var lastC = sheet.getLastColumn();
    console.log("★lastC:", lastC);
    if (lastC > 0) {
      console.log("★データあり");
      sheet.deleteColumns(1, lastC - 1);
      sheet.insertColumns(1, lastC - 1);
      sheet.deleteColumns(lastC);
      sheet.insertColumns(1);
    } else {
      console.log("★データなし");
      sheet.insertColumns(1, 10);
      sheet.deleteColumns(1, 10);
    }
    //◇◇◇◇◇
    // Utilities.sleep(5000);

    SpreadsheetApp.flush();

    // 数式の再計算とデータの取得を待つ
    Utilities.sleep(5000);

    // 取得する株式のシンボル(ティッカー)を指定します
    var ticker = "VYM";
    var startDate = new Date();

    // 過去30日間のデータを取得するための開始日を設定します
    startDate.setDate(startDate.getDate() - 30);

    // Google Finance関数を使用して株式データを取得するためのクエリを作成します
    var query = '=GOOGLEFINANCE("' + ticker + '", "all", "' + Utilities.formatDate(startDate, "Asia/Tokyo", "yyyy-MM-dd") + '", "' + Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd") + '", "DAILY")';

    // クエリをA1セルにセットします
    var cell = sheet.getRange('A1');
    cell.setFormula(query);
    // // var tempcell = cell.setFormula(query);

    // キャッシュをクリアしてスプレッドシートを更新
    SpreadsheetApp.flush();

    // console.log("★cell:", cell.getValues());
    // // console.log("★tempcell:",tempcell.getValues());

    // console.log("★getFormula():" + cell.getFormula());
    // console.log("★getValues():" + cell.getValues());
    //■■■
    // var ticker2 = "VYM";
    // var startDate2 = new Date();

    // // 過去30日間のデータを取得するための開始日を設定します
    // startDate2.setDate(startDate2.getDate() - 30);

    // // GOOGLEFINANCE関数を使用して株価データを取得
    // var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SH1');
    // sheet.getRange('A1').setValue('=GOOGLEFINANCE("' + ticker2 + '", "all", "' + Utilities.formatDate(startDate2, "Asia/Tokyo", "yyyy-MM-dd") + '", "' + Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd") + '", "DAILY")');

    // SpreadsheetApp.flush();
    //■■■

    // フォーミュラが再計算されてデータが取得されるのを待ちます
    Utilities.sleep(3000);

    // **************************************************
    // データが入力されている最後の行と最後の列を取得します
    var lastRow = sheet.getLastRow();
    var lastColumn = sheet.getLastColumn();

    // A1セルから最後の行と最後の列までのデータ範囲を取得します
    var dataRange = sheet.getRange(1, 1, lastRow, lastColumn);
    var data = dataRange.getValues();

    // 変数の値をコンソールに出力 / 取得したデータを出力します
    // console.log("★ticker:", ticker);
    // console.log("★startDate:", startDate);
    // console.log("★query:", query);
    // console.log("★data(全表示):",data);

    // データが配列かどうかを確認し、適切に処理します
    if (Array.isArray(data)) {
      // データが2次元配列(複数行と複数列)の場合、各セルの値をログとして出力します
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          // console.log("★data[" + row + "][" + col + "]:",data[row][col]);
          // console.log("★data[" + row + "]:", data[row]);
        }
      }
    } else {
      // データが単一の値の場合、直接ログとして出力します
      console.log("★data:", data);
    }
    // **************************************************
    // var data1 = sheet.getRange(1, 1, lastRow, lastColumn).getValues();
    // var flatData1 = data1.slice(1).map(function (row) {
    //   return row[0];
    // });
    // // 配列flatData1の要素の値をコンソールに出力
    // console.log("★1:",flatData1);
    // **************************************************
    // // 2次元配列を1次元配列に変換します
    // var flatData2 = data.reduce(function(acc, row) {
    //   return acc.concat(row);
    // }, []);

    // // 結果を出力
    // console.log("★2:",flatData2);
    // **************************************************
    // // データを1次元配列に変換
    // var flatData3 = dataRange.getValues().map(function (row) {
    //   return row[0]; // 行の最初の要素だけを残す
    // });

    // // コンソールに出力
    // console.log("★3:",flatData3);
    // **************************************************
    // // データを1次元配列に変換
    // var flatData4 = dataRange.getValues().flat();

    // // コンソールに出力
    // console.log("★4:",flatData4);
    // **************************************************
    // // データを取得
    // var dataRange5 = sheet.getDataRange();
    // var data5 = dataRange5.getValues();

    // // データを単純な形式に変換して出力
    // var result5 = [];
    // for (var i = 0; i < data5.length; i++) {
    //   var rowData5 = data5[i];
    //   if (rowData5[0] instanceof Date) {
    //     result5.push([rowData5[0], rowData5[1], rowData5[2], rowData5[3], rowData5[4], rowData5[5]]);
    //   }
    // }

    // // 結果を出力
    // console.log("★5:",result5);
    // **************************************************

    // // dataの要素をコンソールに出力
    // for (var i = 0; i < data.length; i++) {
    //   for (var j = 0; j < data[i].length; j++) {
    //     console.log("★data[" + i + "][" + j + "]:", data[i][j]);
    //   }
    // }

    var maxPrice = 0;
    var maxPriceDate = "";

    for (var i = 1; i < data.length; i++) {
      if (data[i][4] > maxPrice) {
        maxPrice = data[i][4];
        maxPriceDate = data[i][0];
      }
    }

    sheet.getRange('G1').setValue("株価が最高な日付");
    sheet.getRange('H1').setValue("その時の株価");
    sheet.getRange('G2').setValue(maxPriceDate);
    sheet.getRange('H2').setValue(maxPrice);

  } catch (e) {
    console.log("★エラーが発生しました:" + e);
  }
}

3.シートで実行結果を確認する。各列名の意味は以下の通りです。
  ・Date: 取引日付(日次データの場合、指定した期間内の日付が記載されます)。
  ・Open: 始値(取引日の最初の取引価格) /指定した日付の始値
  ・High: 高値(取引日の最高取引価格)  /指定した日付の高値
  ・Low: 安値(取引日の最低取引価格)   /指定した日付の安値
  ・Close: 終値(取引日の最後の取引価格) /指定した日付の終値
  ・Volume: 出来高(取引日の取引数量)  /指定した日付の取引量

4.実際に実行結果を確認する。実行日付は2023/08/26です。過去1カ月の間での最高点は、2023/07/31で正しいことがわかります。

https://www.google.com/finance/quote/VYM:NYSEARCA?hl=ja

確認すると、G列とH列に正しい情報であることがわかる。

このコードは、株価データの取得から最高株価の抽出、Google Sheetsへの記録までを実行します。

まとめと今後の展望

この記事では、Google Apps Scriptを利用して株価データを自動的に取得し、最高株価を記録する手法を学びました。自動化されたトラッキングにより、投資の意思決定をより根拠に基づかせることができます。今後は、このスクリプトをカスタマイズしてさらなる機能を追加することも考えられます。

参考サイト/関連サイト

-

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他