韓国株だけ目標株価が出なかった原因は、ティッカーの取引所接尾辞だった

開発financial-data

韓国株だけ目標株価が出なかった原因は、ティッカーの取引所接尾辞だった

そういえば、と思い出した。 LINE に届くポートフォリオ通知の銘柄カードで、SK ハイニックスだけ目標株価と乖離率が出ていない。 Micron、NVIDIA、AMD、SNDK のカードには2行とも並んでいる。 その4銘柄はたしか金融データサービスAから取っていたはずで、だとすると SK ハイニックスはそこで取れなかったということなんだろうか。

そこを確かめるところから Claude Code に追わせた。

目標株価はどこから来ているのか

まず、目標株価と乖離率がどこに出ているのかをコードで探させた。 apps/web 側には見当たらず、見つかったのは LINE 通知の銘柄カードのほうだった。 目標株価、乖離率、データの基準日の3つがそこに並んでいる。

値の出どころは金融データサービスAではなかった。 GAS(Google Apps Script)が書き出す JSON で、取得元は別の金融データサービスBだった。 最初の疑問は、前提のところで外れていたことになる。

試しに1件だけ取らせてみると、000660.KS の目標株価は金融データサービスBから返ってきた。 値そのものは取れる。 では、なぜカードに出ないのか。

どの関数を実行すればいいのか

値が取れるなら、GAS を一度回してみるのが早い。 「これ私の方で GAS を実行して、うまくいくかどうか見たらいいんすかね」と聞いたら、それがいちばん早いと返ってきた。

ただ、どの関数を実行すればいいのかが分からない。 エディタは開いていたので、Chrome DevTools で見てもらうことにした。

ここで一度つまずいている。 Node に MSYS 形式のパス(/c/Users/...)を渡して失敗した。 前にも踏んでいる罠なので、C:/ 形式に直してもらって先へ進んだ。

読んでもらった結果、実行すべき関数は mainDailyJob だった。 コメントに「トリガーにはこれを設定」とあり、中で fetchAndWriteNvdaData を呼んでいる。 ただし、手で実行するのは勧められなかった。 全銘柄を取り終えると sendLineSummaryIfConfigured が走り、message/broadcast でボットの友だち全員に「アナリスト予想サマリー」が飛ぶ。 今朝の分と同じものがもう1通届くことになる。

「多分ね、成功してますよ」

止められはしたものの、こちらはもう実行したあとだった。 そう伝えて、GAS の JSON を取り直させた。

実際、GAS 側は成功していた。 全40銘柄を取り終えて send_data に書き込むまで、2分ほど待つことになった。

待ったあとで、出力 JSON の切り出しを誤るという寄り道が1回入った。 凝った切り出しはやめて、プレビューの中で「目標株価」「乖離率」が出る銘柄を数えるだけの方法に切り替えてもらった。

数えた結果は4枚。 LINE には送らない dry-run で、目標株価の行が付いたカードは Micron などの米国株4枚だけだった。 GAS は書き込めているのに、SK ハイニックスのカードには相変わらず出ない。

実行済みなのに出ない理由

ここで自分は、実行の順番を取り違えていた。 「まだあなたの方で実行してないですもんね」と言ったのだが、そうではなかった。

GAS が 000660.KS の行を書き込んだあと(08:00 ごろ)に、dry-run は回してもらっていた。 そのとき JSON も取り直している。 通知スクリプトは毎回その URL を読みに行く作りで、fetchAnalystSummary はキャッシュせずに fetchJson(config.url) を呼ぶ。 新しい値は、確かに読まれている。

それでもカードに出ないのは、値が無いからではなく、名前が合わずに結びつかないからだった。 通知スクリプトと同じ手順で照合してもらうと、引くキーによって結果が変わる。 取引所の接尾辞が付いたままのキーで引いていたので、行はあるのに引き当たらない。

照合キーの取引所接尾辞

直したのは、照合キーから取引所の接尾辞を外す1点だけだった。 テストを2件足して全件回すと、66件すべて通った。 差分の規模と、改行コードが崩れていないかまで確かめてもらってから、LINE には送らない dry-run を回させた。 SK ハイニックスのカードに、目標株価と乖離率の行が付いている。

そこまで見てから、コミットと push を頼んだ。 8e5f9f4(fix: アナリスト予想の照合キーから取引所の接尾辞を外し、韓国株のカードにも目標株価を出す)で、origin/master との差は無くなった。

学び

  • 「出ない」の原因は、値が無いか、値が結びつかないかのどちらかになる。今回は後者だった。GAS 側の成功を確かめただけでは、切り分けは終わらない。
  • 自分は「まだ実行していないから出ない」と推測したが、外れていた。実行済みかどうかは、実行した側に時刻で確かめさせるほうが早い。
  • Node に MSYS 形式のパスを渡すと失敗する。何度目かの再発なので、最初から C:/ 形式で渡す。
  • 出力の切り出しに凝って失敗したら、数えるだけの方法に落とす。今回は「目標株価」「乖離率」が出る銘柄を数えただけで、4枚しかないという判断が付いた。
#GAS#金融データAPI#LINE通知#ティッカー#SKハイニックス#デバッグ