【株価】国内株式を安値買いしたい【Webアプリ】

お久しぶりです。skkです。

最近NISAで資産形成にハマっていますが、成長投資枠で日本株の高配当株に投資してみようかということで、現在および過去30日の保有株の株価を取得しグラフで表示するアプリを作りました。

アプリのスクリーンショット

最初に、アプリ(Webブラウザで動作)のスクリーンショットを貼っておきます。

画面1 – 初期画面
画面2 – 「株価データを取得」ボタンクリック後からグラフ表示までの待ち状態
画面3 – 株価データ返却後グラフ表示された状態

自身の保有株について、1ヶ月の株価を取得しグラフで表示します。
グラフにマウスホバー時、tooltipでその時の株価が表示されます。
(中外製薬が一気に落ちたので買いました)

システム構成

システム構成は以下のようになっています。

  • フロントエンド:React(Cloudflare Pagesへ静的ホスティング)
  • バックエンド:Go(契約しているレンタルサーバで、デーモンプロセスで動作)
  • 株価取得API:Yahoo Finance API(非公式)※1
  • DB:なし

フロントエンドから「株価データを取得」ボタンより、バックエンドのAPIからYahoo Finance APIを内部的に呼び出し、フロントエンドに返却します。

※1 公式のYahoo Finance APIは2017年に廃止されており、今回使用しているAPIエンドポイントは、非公式のものであり、いつ制限や封鎖がされるかは不明であることに注意

フロントエンドについて

chatgptさんに人生相談したら、flutterとかswiftとか色々手出し過ぎじゃない?どれか一つを極めたら市場価値が上がるかもよ?っていう返答いただきましたので、今回もReactです。

とはいいつつ、今回のフロントエンドの役割は、

  • バックエンドのAPI呼び出し
  • グラフ表示

しかしていません。フロントエンド側だけでもあとでGithubに上げておきます。

グラフ表示で用いているライブラリは、Chart.jsです。
Chart.jsで表示できるグラフには、折れ線グラフ以外にも以下があります

  • 棒グラフ
  • バブルチャート
  • 円グラフ
  • 散布図
  • 上記を組み合わせたグラフ等々

バックエンドについて

APIリクエストは一旦nginxで受けて、リバースプロキシ先をGoのサービスにしています。
基本的には、FastAPIの環境を構築したときと同様で、異なるのはリバースプロキシ先だけだったので比較的簡単でした。
なぜGoのしたかというと、今の会社にいる限り触れる機会がない言語だったからです。

Yahoo Finance APIに渡すティッカー(銘柄の番号で日本株の場合は大抵数字4桁)と企業名を、Goのサービスと同一ディレクトリに置き渡しています。ファイルの形式は以下の通りです。

4519,中外製
5401,日本製鉄
6301,コマツ
7164,全国保証
7203,トヨタ自
...

数字4桁に.Tを付与した後、APIで株価を取得して、過去30日分の株価をティッカーごとに以下のようなJSON形式で返却します。timeはタイムスタンプでフロント側で変換します。priceはその時の株価でそのまま使います。

{
	"1605": {
		"ticker": "1605.T",
		"name": "INPEX",
		"prices": [
			{
				"time": 1751932800,
				"price": 2050.5
			},
			{
				"time": 1752019200,
				"price": 2100.5
			}
		]
	},
        "5401": {
		"ticker": "5401.T",
		"name": "日本製鉄",
		"prices": [
			{
				"time": 1751932800,
				"price": 2761
			},
			{
				"time": 1752019200,
				"price": 2784
			}
		]
	}
}

Yahoo Finance APIを呼び出すときの注意事項

以下の方法は抜け道的な方法で推奨はしません。節度を守ったリクエスト頻度にしてください。

このアプリを作成するときに以下のエラーがよく発生しました。

401 Unauthorized
429 Too Many Requests

主要な原因は下の方のエラーで、一定時間内のリクエストが多すぎるというエラーです。
Goのプログラムからリクエストを送信しているので、ボットと判断された可能性が高いです。
そのため、リクエストヘッダにuseragentを設定することで、ブラウザからアクセスしていると判断され緩和されました。

まとめ

今回は、Yahoo Finance API(非公式)を使って株価を取得しグラフ化するところまで実装しました。
今後は、フロントエンド側がまだ開発用のURLになっているので独自ドメインに紐づけるのと、節度を守った定期間隔で動かしてみたいなと思っています。
でも、自分は特定口座を持っていないので指値注文ができないので、少しでも安値買いしてbuy and holdしたい所存です。

では、また。

コメント

タイトルとURLをコピーしました