[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"content-/earnings-dynamics-ntm-aggregation":3,"all-pages-for-dir":266,"og-image-/earnings-dynamics-ntm-aggregation":267},{"id":4,"title":5,"body":6,"category":247,"description":248,"extension":249,"meta":250,"navigation":251,"ogImage":252,"path":253,"project_name":254,"published":255,"publishedAt":256,"seo":257,"stem":258,"tags":259,"todo":252,"unpublished":255,"updatedAt":252,"__hash__":265},"pages/2026-06/2026-06-23/earnings-dynamics-ntm-aggregation.md","earnings-dynamics に NTM 4Q合計バッジを追加し、コンセンサス取得の取りこぼしを修正した",{"type":7,"value":8,"toc":238},"minimark",[9,13,26,33,36,39,55,58,62,68,87,90,97,107,110,113,129,132,139,146,149,164,183,189,193,223,226],[10,11,12],"h2",{"id":12},"なにをやったか",[14,15,16,20,21,25],"p",{},[17,18,19],"code",{},"/earnings-dynamics/MU"," のページに、アナリスト予想の先4Q合計（NTM, Next Twelve Months）をチャート右上にバッジ表示する仕組みを追加した。\n同じ日に、Koyfin から日次で取り込んでいるコンセンサス推定が ",[22,23,24],"strong",{},"MU 以外で更新されていない","疑惑を調べて、取得スコープの不備を直した。",[14,27,28,29,32],{},"両方とも ",[17,30,31],{},"apps/web/app/data/earningsDynamics/*.ts"," 配下のデータと、チャートコンポーネントに関わる作業。",[10,34,35],{"id":35},"きっかけ",[14,37,38],{},"朝、ページを開いて気づいたのが2つ。",[40,41,42,49],"ol",{},[43,44,45,48],"li",{},[22,46,47],{},"集計欄が欲しい",": focusQuarter から先4Qの売上・EPS をチャート上で見られるが、「合計いくらに見直されているか」が一目で分からない。決算までにコンセンサスがどれだけ動いたかは、4Qを足した数字で見たい。",[43,50,51,54],{},[22,52,53],{},"数字が動かない",": MU の予想は毎日少しずつ削れているのに、NVDA や SNDK は数日前のスナップショットからピクリとも動いていない。「日次で取り込むパイプライン」のはずなのに、これはおかしい。",[14,56,57],{},"順に潰した。",[10,59,61],{"id":60},"ntm-バッジの実装","NTM バッジの実装",[14,63,64,67],{},[17,65,66],{},"EarningsChart"," 側で、focusQuarter から +3Q 先まで（合計4四半期分）の estimate を sum するロジックを足した。\n表示は売上と EPS 両方。",[69,70,71,81],"ul",{},[43,72,73,76,77,80],{},[22,74,75],{},"売上",": ",[17,78,79],{},"$174.6B"," 程度の絶対値",[43,82,83,86],{},[22,84,85],{},"EPS",": 4Q合計 EPS",[14,88,89],{},"ユーザーからの当初の希望は EPS だけだったが、売上も並べてみると「売上はあまり動かないが、EPS が大きく見直されている」みたいな構造が一目で読めるので、両方出すことにした。",[14,91,92,93,96],{},"加えて、",[22,94,95],{},"初回スナップショット（snapshot_date が最古の日）からの差分","もバッジに添えた。",[98,99,104],"pre",{"className":100,"code":102,"language":103},[101],"language-text","NTM (4Q合計, focus + 3先)\n売上: $174.6B  (+12.66B vs 2026-05-19)\nEPS : ...\n","text",[17,105,102],{"__ignoreMap":106},"",[14,108,109],{},"最初は asOf（最新日）と窓開始の差分を出していたが、両者が同点になるケースが多く revision がゼロに見えてしまった。基準日を「該当銘柄で存在する最古のスナップショット日」に切り替えてようやく動きが見える形になった。",[14,111,112],{},"実装の要は2つ:",[69,114,115,126],{},[43,116,117,118,121,122,125],{},"focusQuarter のラベル（例: ",[17,119,120],{},"Q2 FY27","）から +3Q 先までを ",[17,123,124],{},"nextQuarterFromLabel"," で順に拾い、estimate 配列を引き当てる",[43,127,128],{},"NTM 計算は、先4Q全てに estimate が揃っているときだけ表示する（欠損があれば素直に出さない）",[10,130,131],{"id":131},"取得スコープの不備を直した",[14,133,134,135,138],{},"NTM の確認をしている途中で、別の問題に気づいた。\nNVDA や SNDK の ",[17,136,137],{},"estimates"," 配列の最新 snapshot 日が数日前で止まっている。MU は 6/23 まで毎日入っている。",[14,140,141,142,145],{},"ここで一度立ち止まって、取り込みスクリプトの実装を読み直した。\n原因はシンプルで、",[22,143,144],{},"Koyfin から日次バッチで取得するときの対象銘柄リストが MU 系に偏っていて、他の銘柄を回せていなかった","。スクリプト側は「日次で全銘柄を取り込めば自然に積み上がる」設計のはずだったが、運用パスのどこかで MU 以外が落ちる経路になっていた。",[14,147,148],{},"検証は次の手順:",[40,150,151,154,161],{},[43,152,153],{},"Chrome の Koyfin タブを開き直して、KID マップから全銘柄分を取得",[43,155,156,157,160],{},"取得した JSON をローカルで生成スクリプトに食わせて、各銘柄の snapshot_date 末尾が ",[17,158,159],{},"2026-06-23"," になるか確認",[43,162,163],{},"ならない銘柄について、スクリプト側のスコープ条件を直す",[14,165,166,167,170,171,174,175,178,179,182],{},"ハマったのは ",[17,168,169],{},".env"," の置き場所。",[17,172,173],{},"apps/web/.env.local"," には Turso の URL/TOKEN が入っていなくて、",[17,176,177],{},"turso-replicas/.env"," のほうに本物があった。\nNode 22 の ",[17,180,181],{},"--env-file="," で turso-replicas 側を直接読ませて実行したら、全銘柄が一発で 6/23 まで反映された。",[14,184,185,186,188],{},"修正後の TS データを ",[17,187,31],{}," に再生成して、変更をコミットして終了。",[10,190,192],{"id":191},"学び気づき","学び・気づき",[69,194,195,201,207],{},[43,196,197,200],{},[22,198,199],{},"「日次取り込みで自然に積み上がる」設計は、運用時にスコープが欠けていないか目視で確かめないと、サイレントに止まる","。MU だけ動いていたのは、たまたま MU が手動確認の対象だったから。",[43,202,203,206],{},[22,204,205],{},"NTM バッジの基準日選び","は、最新と窓開始が同点になりやすいので、「最古スナップショット起点」のほうが体感に合う。決算前にコンセンサスがどれだけ削れた/積まれたかを読むのが目的なら、これで十分。",[43,208,209,214,215,218,219,222],{},[22,210,211,213],{},[17,212,169],{}," の場所は地味に毎回詰まる","ので、",[17,216,217],{},"make-diary"," のワークフロー側に「TS 再生成ステップは turso-replicas の .env を ",[17,220,221],{},"--env-file"," で読む」と明文化しておいた。次セッションの自分が同じ場所で詰まらないように。",[10,224,225],{"id":225},"残課題",[69,227,228,231],{},[43,229,230],{},"スクショ撮影と SVG 図解は未対応。NTM バッジは見た目調整の余地あり（バッジの位置・色・revision の正負で色変えるか等）。",[43,232,233,234,237],{},"取り込みスクリプトの「対象銘柄リストが欠ける」経路は応急処置のみ。",[22,235,236],{},"根本的にはマニフェスト駆動で「全銘柄を必ず回す」CI に直す","べき。今日はそこまでやらず、運用ワークフローに「make-diary 末尾で TS 再生成 + 差分コミット」を入れて、毎朝の検出に振った。",{"title":106,"searchDepth":239,"depth":239,"links":240},2,[241,242,243,244,245,246],{"id":12,"depth":239,"text":12},{"id":35,"depth":239,"text":35},{"id":60,"depth":239,"text":61},{"id":131,"depth":239,"text":131},{"id":191,"depth":239,"text":192},{"id":225,"depth":239,"text":225},"dev","/earnings-dynamics/MU でアナリスト予想の先4Q合計（NTM）をチャート右上に表示できるようにした。あわせて、MU 以外のスナップショットが日次で更新されていない取得スコープの問題を直した。","md",{},true,null,"/earnings-dynamics-ntm-aggregation","financial-data",false,"2026-06-23T00:00:00.000Z",{"title":5,"description":248},"2026-06/2026-06-23/earnings-dynamics-ntm-aggregation",[260,261,262,263,264],"earnings-dynamics","NTM","Koyfin","アナリスト予想","可視化","16HkrVBtXWBPv1Yq7IENTdk4Y5fVU6IoAAZ-csXveqE",[],"https://log.eurekapu.com/og/blog/earnings-dynamics-ntm-aggregation.png?v=2026-06-23T00%3A00%3A00.000Z&title=earnings-dynamics%20%E3%81%AB%20NTM%204Q%E5%90%88%E8%A8%88%E3%83%90%E3%83%83%E3%82%B8%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%80%81%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%B3%E3%82%B5%E3%82%B9%E5%8F%96%E5%BE%97%E3%81%AE%E5%8F%96%E3%82%8A%E3%81%93%E3%81%BC%E3%81%97%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=e3ccab6efa5805df",1782364625408]