お久しぶりです。skkです。
最近NISAで資産形成にハマっていますが、成長投資枠で日本株の高配当株に投資してみようかということで、現在および過去30日の保有株の株価を取得しグラフで表示するアプリを作りました。
アプリのスクリーンショット
最初に、アプリ(Webブラウザで動作)のスクリーンショットを貼っておきます。



自身の保有株について、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したい所存です。
では、また。

コメント