韓国株だけ目標株価が出なかった原因は、ティッカーの取引所接尾辞だった
韓国株だけ目標株価が出なかった原因は、ティッカーの取引所接尾辞だった
そういえば、と思い出した。 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枚しかないという判断が付いた。