東証銘柄の株価を取得してGoogleスプレッドを更新する

13325 ワード

TL;DR

東証銘柄の時価情報を取得して、Google スプレッドを更新するまでを、TypeScript で実装した時のメモです。このネタは、友人・知人から時々相談されますので、メモとして公開することにしました。

外国銘柄、特に米国株の時価は、Google Fincance API で簡単に取得できますので、Google スプレッドの中で直接利用できます。しかし、東証銘柄の時価は Google Finance API からは取得できない(過去には取得できましたが)ため、Yahoo Finance API を利用し実装しています。

  • 東証に上場している企業の株価を API で取得する方法
  • Google スプレッドを更新する方法
  • node + TypeScript で実装する場合のサンプル

東証銘柄の株価を取得する方法

東証のリアルタイム時価は有償サービスですので、無償で取得できる株価は遅延時価です。以前は、東証銘柄の時価を取得できる API が複数存在していましたが、ここ数年は廃止が続いています。そのような状況の中で、次の点を評価し、今回は Yahoo Finance API(US)を利用することにしました。

  • 安定した提供を期待できる
    Apple 標準の「株価アプリ」への情報提供元であり、廃止されるリスクが低い。
  • npm パッケージで API が提供されている

以下のサンプルは、将来 Yahoo Finance API を利用できなくなる可能性を考慮し、独自の finance-api で抽象化しています。 このため、若干分かり難くなっていますが、処理の実体は latestQuote の部分です。

また今回は、東証以外の時価を取得する必要があったため、事前に Map<市場,銘柄コード[]>の形で取得対象銘柄を設定し、非同期で結果を処理する仕組みにしています。 Yahoo Finance API は、銘柄コードのサフィックスにマーケットを付与する仕様ですが、サンプルでは東証(TSE)を表すサフィックス「.T」にしてあります。

import { FinanceApi, quote } from './finance-api';
export class Yahoo extends FinanceApi {

    constructor(symbols: Map<string, string[]>) {
        super(symbols);
    }

    public quotes(market: string): Promise<quote>[] {
        return (this.symbols.get(market) ?? [])
            .map((symbol: string) => this.latestQuote({ market, symbol }));
    }

    private async latestQuote({ market, symbol }: { market: string; symbol: string; }): Promise<quote> {
        var yahooFinance = require('yahoo-finance');
        var suffix: string = market === "TSE" ? ".T" : "";
        return yahooFinance.quote(
            {
                symbol: symbol + suffix,
                modules: ['price']
            }).then((quotes: any) => {
                var price = quotes.price;
                var quote: quote = {
                    symbol: symbol,
                    name: price.shortName,
                    longName: price.longName,
                    open: price.regularMarketOpen,
                    high: price.regularMarketDayHigh,
                    low: price.regularMarketDayLow,
                    close: price.regularMarketPrice,
                    closeYest: price.regularMarketPreviousClose,
                    volume: price.regularMarketVolume,
                    ccy: price.currency,
                };
                return quote;
            });
    }
}

Googleスプレッドを更新する方法

Google スプレッドの更新方法は、さまざまなサイトにサンプルがありますので、詳しい説明をしません。 ここでは、普段 Excel を利用している人に向けて、混乱しがちな『用語の違い』と『考え方の違い』を説明します。

  • 用語の違い
    • Excel のワークブックは、スプレッドシート
    • Excel のワークシートは、シート
  • 考え方の違い
    • ワークシートを取得して操作ではなく、スプレッドシートを取得して操作
      Google スプレッドでは、シート単位での操作ではなく、スプレッドシートから シート名!A1 で処理の範囲を指定します。
      この部分は、Excel に慣れた人には分かり難いのではないでしょうか。

この違いを意識すれば、以下のサンプルは容易に理解できるでしょう。

public update(quote: quote): void {
    var range: string = quote.symbol + "!G3";
    var param: sheets_v4.Params$Resource$Spreadsheets$Values$Update = {
        spreadsheetId: this.spreadsheetid,
        range: range,
        valueInputOption: "RAW",
        requestBody: {
            majorDimension: "ROWS",
            range: range,
            values: [[quote.close]]
        }
    };
    this.spreadSheets
        .values
        .update(param)
        .then(result => result.status);
    }

まとめ

Yahoo Finance API と Google スプレットを用いて、東証銘柄の株価を取得する方法を簡単に説明しました。実際には、東証以外の株価も取得し、GAS を利用して各種分析を回していますので、Yahoo Finance API も GAS の中で実行しています。

サンプルコードに直すのに、大胆にコードを減らしたため、分かり難くなっていますが、国内株の株価取得や Google スプレッドの参考になれば幸いです。