東証銘柄の株価を取得して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