東証銘柄の株価を取得してGoogleスプレッドを更新する
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 スプレッドの参考になれば幸いです。



Discussion