[{"data":1,"prerenderedAt":486},["ShallowReactive",2],{"content-/beat-monitoring-guidance-and-stock-charts":3,"all-pages-for-dir":484,"og-image-/beat-monitoring-guidance-and-stock-charts":485},{"id":4,"title":5,"body":6,"category":464,"description":465,"extension":466,"meta":467,"navigation":468,"ogImage":469,"path":470,"project_name":471,"published":472,"publishedAt":473,"seo":474,"stem":475,"tags":476,"todo":469,"unpublished":472,"updatedAt":469,"__hash__":483},"pages/2026-05/2026-05-29/beat-monitoring-guidance-and-stock-charts.md","ビートモニタリングに通年ガイダンス・EPSビート率・直近株価を足した日",{"type":7,"value":8,"toc":455},"minimark",[9,13,17,21,24,60,166,172,192,199,203,206,213,224,227,230,243,256,275,279,282,309,312,354,364,368,376,386,389,395,398,426,429,451],[10,11,5],"h1",{"id":12},"ビートモニタリングに通年ガイダンスepsビート率直近株価を足した日",[14,15,16],"p",{},"決算モニタリングのページに、3つの可視化を足した。通年ガイダンスの軌跡チャート、次QのEPSビート率の推移、そして各銘柄の直近株価。どれも「数字を取ってくる」ところが本番で、チャートを描く側はほぼ既存の仕組みに乗せるだけだった。逆に言うと、半日のほとんどは数字の出どころを潰す作業に溶けた。",[18,19,20],"h2",{"id":20},"通年ガイダンスをチャートに足す",[14,22,23],{},"これまでのチャートは「次Q売上ガイド」「次QのEPSガイド」しか描いていなかった。会社が出す通年（full-year）の見通しは持っていなかったので、その軌跡を足したかった。",[14,25,26,27,31,32,35,36,35,39,35,42,35,45,48,49,51,52,55,56,59],{},"チャートコンポーネントは ",[28,29,30],"code",{},"ChartCfg","（",[28,33,34],{},"key"," / ",[28,37,38],{},"title",[28,40,41],{},"unit",[28,43,44],{},"rows",[28,46,47],{},"lineSeries","）という汎用の設定オブジェクトを受け取る形になっていて、新しい系列を増やすときは新しい ",[28,50,34],{}," を1つ生やすだけで済む設計だった。これを活かして ",[28,53,54],{},"guide-fy-rev","（通年売上ガイド）と ",[28,57,58],{},"guide-fy-eps","（通年EPSガイド）の2キーを追加した。",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"language-vue shiki shiki-themes vitesse-light vitesse-light","\u003CBeatExpectationsChart\n  v-if=\"hasFullYearGuidance\"\n  :only=\"['guide-fy-rev', 'guide-fy-eps']\"\n  :show-header=\"false\"\n/>\n","vue","",[28,68,69,82,101,142,159],{"__ignoreMap":66},[70,71,74,78],"span",{"class":72,"line":73},"line",1,[70,75,77],{"class":76},"shFtX","\u003C",[70,79,81],{"class":80},"sHkkW","BeatExpectationsChart\n",[70,83,85,88,91,94,98],{"class":72,"line":84},2,[70,86,87],{"class":80},"  v-if",[70,89,90],{"class":76},"=",[70,92,93],{"class":76},"\"",[70,95,97],{"class":96},"s4oTP","hasFullYearGuidance",[70,99,100],{"class":76},"\"\n",[70,102,104,107,111,113,115,118,122,125,127,130,133,135,137,140],{"class":72,"line":103},3,[70,105,106],{"class":76},"  :",[70,108,110],{"class":109},"senZ8","only",[70,112,90],{"class":76},[70,114,93],{"class":76},[70,116,117],{"class":76},"[",[70,119,121],{"class":120},"sMJiu","'",[70,123,54],{"class":124},"sdGka",[70,126,121],{"class":120},[70,128,129],{"class":76},",",[70,131,132],{"class":120}," '",[70,134,58],{"class":124},[70,136,121],{"class":120},[70,138,139],{"class":76},"]",[70,141,100],{"class":76},[70,143,145,147,150,152,154,157],{"class":72,"line":144},4,[70,146,106],{"class":76},[70,148,149],{"class":109},"show-header",[70,151,90],{"class":76},[70,153,93],{"class":76},[70,155,156],{"class":80},"false",[70,158,100],{"class":76},[70,160,162],{"class":72,"line":161},5,[70,163,165],{"class":164},"sG7-3","/>\n",[14,167,168,171],{},[28,169,170],{},"v-if=\"hasFullYearGuidance\""," を付けたのは、通年ガイドを公表していない銘柄では2枚のチャートをまるごと出さないため。データを持つ銘柄だけ描画する。",[14,173,174,175,181,182,186,187,191],{},"DELL のデータで言うと、通年売上ガイドが各発表のたびに ",[28,176,180],{"className":177},[178,179],"language-math","math-inline","97B → … → ","167B へ更新され、通年EPSガイドは ",[28,183,185],{"className":184},[178,179],"7.80 から ","17.90 まで伸びている。1株のバーが1回の決算発表時点の通年見通しを表すので、横に並べると「会社が自分のレンジをどう引き上げていったか」がそのまま軌跡になる。最後のQ1 FY27で通年売上を ",[28,188,190],{"className":189},[178,179],"140B → ","167B へ一気に引き上げた点が、バーの段差で一目で分かる。",[14,193,194,195,198],{},"各バーの下には対象会計年度のラベル（FY25 / FY26 / FY27）を出すようにした。通年ガイドは途中で対象年度が切り替わる（FY26を見ていたのが、ある四半期からFY27の見通しに変わる）ので、ラベルが無いと「何年度の数字か」が読めなくなる。データ側に ",[28,196,197],{},"fullYearLabel"," を持たせて、バーごとに添える形にした。",[18,200,202],{"id":201},"epsビート率を8四半期つなぐ","EPSビート率を8四半期つなぐ",[14,204,205],{},"次に、次QのEPSガイドがコンセンサス予想をどれだけ上回ったか（ビート率）を、過去8四半期分つなげて見えるようにした。問題はコンセンサス予想で、これは自前では持っていない。",[14,207,208,209,212],{},"Web（CNBC / LSEG / MarketBeat など）を主軸に、X（Twitter）サーチで補完して各四半期のコンセンサスを拾い集めた。ここで自分に課したのは「取れなかった値は埋めない」というルール。投稿者がどのデータソースを引いているかで数字は多少ブレるので、複数ソースが収束するところだけ採用し、決まらないものは ",[28,210,211],{},"n/a"," のままにした。捏造して埋めると、あとでチャートの傾きを信じられなくなる。",[14,214,215,216,219,220,223],{},"結果、DELL では -9% 〜 +62% のレンジで8四半期がつながった。直近のQ1 FY27では次QのEPSガイドがコンセンサスを約 +62% 上回っていて、これがビート率チャートの右端で跳ね上がっている。整合性を守るユニットテストも足して、",[28,217,218],{},"beatPct"," が ",[28,221,222],{},"(company − consensus) / consensus × 100"," の手計算と 0.3pt 以内で一致するか8四半期すべてで検証するようにした。",[18,225,226],{"id":226},"単一ソース依存だった銘柄を複数ソースで取り直す",[14,228,229],{},"ある半導体メモリ銘柄（SNDK）のアナリスト予想が、単一ソース頼みになっていて怪しかった。x-search スキルで5四半期分を並列に取り直し、複数ソースで相互検証させた。",[14,231,232,233,237,238,242],{},"ここで効いたのが「数字が割れたところを潰す」やり方だった。多くの四半期は4〜5ソースが ",[28,234,236],{"className":235},[178,179],"0.1〜0.2 程度の幅に収束していたが、**Q1 FY26 のEPS予想だけ2倍近く割れていた**。手元の旧データは ","0.58（MarketBeat）。一方でX投稿群は「",[28,239,241],{"className":240},[178,179],"1.22 が38%ビート」と言っていて、逆算すると予想は ","0.88 になる。乖離が大きすぎたので、ここだけ追加で検索をかけた。",[14,244,245,246,255],{},"FactSet を明示する高品質なソースが複数出てきて、",[247,248,249,250,254],"strong",{},"正しいコンセンサスは ",[28,251,253],{"className":252},[178,179],"0.88、旧データの ","0.58 は誤り","だと決着した。訂正してデータに反映。1ソースを鵜呑みにしていたら、ビート率が実態と逆向きに出るところだった。",[14,257,258,259,262,263,266,267,270,271,274],{},"この作業では細かいハマりも踏んだ。バックグラウンド検索の出力先を相対パスで書いたら、永続cwdの違いでリダイレクト先のディレクトリが無く、検索は走ったのに結果が捨てられていた（絶対パスで再実行して回収）。さらに抽出スクリプトでは、",[28,260,261],{},"ls"," 系は ",[28,264,265],{},"/c/"," を解釈するのに Windows ネイティブの Python は ",[28,268,269],{},"C:/"," 形式を要求する点と、標準出力が cp932 で落ちる点を踏んで、",[28,272,273],{},"PYTHONIOENCODING=utf-8"," を設定して通した。",[18,276,278],{"id":277},"直近株価をkoyfin内部apiから取る","直近株価をKoyfin内部APIから取る",[14,280,281],{},"株価反応チャートの末尾に、決算とは独立した「直近株価」の点を1つ足したかった。決算後の翌日終値だけだと「今いくらか」が分からないので、現在地を1点だけ中立色・小サイズで添える設計にした。",[61,283,287],{"className":284,"code":285,"language":286,"meta":66,"style":66},"language-js shiki shiki-themes vitesse-light vitesse-light","// 直近株価を末尾に1点だけ足す（決算とは無関係の「現在地」。ビート率は無いので null=中立色）\nconst ls = data.value.latestStock\n// ...\nbeatPcts.push(null)\n","js",[28,288,289,294,299,304],{"__ignoreMap":66},[70,290,291],{"class":72,"line":73},[70,292,293],{},"// 直近株価を末尾に1点だけ足す（決算とは無関係の「現在地」。ビート率は無いので null=中立色）\n",[70,295,296],{"class":72,"line":84},[70,297,298],{},"const ls = data.value.latestStock\n",[70,300,301],{"class":72,"line":103},[70,302,303],{},"// ...\n",[70,305,306],{"class":72,"line":144},[70,307,308],{},"beatPcts.push(null)\n",[14,310,311],{},"肝心の価格時系列は、Koyfin の内部APIのどのキーに入っているかが分からず、ここが一番試行錯誤した。",[313,314,315,327,334,341],"ul",{},[316,317,318,319,322,323,326],"li",{},"最初に当てた ",[28,320,321],{},"KOY_103"," 系のキーは全弾き（",[28,324,325],{},"no-value","）",[316,328,329,330,333],{},"別のキー候補（",[28,331,332],{},"f_ccc"," 系）も外れ",[316,335,336,337,340],{},"エンドポイント自体を変えて ",[28,338,339],{},"/api/v3/data/graph"," を当てると、ようやくヒット",[316,342,343,344,353],{},"その中の ",[247,345,346,349,350],{},[28,347,348],{},"p_candle_range"," の ",[28,351,352],{},"adjClose"," が正解だった",[14,355,356,357,359,360,363],{},"NVDA で直近終値 $214.25 が取れた瞬間に経路が確定したので、取り込みスクリプトを ",[28,358,348],{}," ベースに書き換え、14銘柄の直近終値（2026-05-28時点）を一括取得して、各銘柄のJSONに ",[28,361,362],{},"latestStock","（日付＋終値）を付与した。",[18,365,367],{"id":366},"_33倍の異常値はdom照合してから採用する","3.3倍の異常値はDOM照合してから採用する",[14,369,370,371,375],{},"取り込み中、ある銘柄（ALAB）が3週間で約3.3倍（",[28,372,374],{"className":373},[178,179],"105 → ","349）になっていて、最初は取得ミスを疑った。倍率がおかしいときは値を信じる前に出どころを確認する。",[14,377,378,379,381,382,385],{},"Koyfin のリアルタイムクオートと ",[28,380,348],{}," の中身をDOMと突き合わせて照合したところ、これは取得バグではなく",[247,383,384],{},"決算後の実際の急騰","だと確認できた。裏が取れてから採用した。異常値を見たら「まずデータを疑い、画面の数字と照合し、本物だと確認してから入れる」という順番を守れたのは良かった。",[18,387,388],{"id":388},"テスト",[14,390,391,392,394],{},"通年ガイダンスのデータ整合性を守るユニットテストを足し、EPSビート率の整合テストも追加した。全22件がパス。チャートはこのデータを描くだけなので、データ側の構造崩れと ",[28,393,218],{}," の手計算ズレをテストで止められれば、画面の傾きは信じられる。",[14,396,397],{},"主な検証項目:",[313,399,400,406,415,423],{},[316,401,402,403,405],{},"通年売上ガイドの ",[28,404,218],{}," が手計算と一致（数値コンセンサスがある四半期のみ）",[316,407,408,409,31,411,414],{},"通年ガイドを持つ四半期には必ず ",[28,410,197],{},[28,412,413],{},"FY2x"," 形式）がある",[316,416,417,418,422],{},"通年EPSガイドが ",[28,419,421],{"className":420},[178,179],"7.80 → … → ","17.90 へ単調増加",[316,424,425],{},"次QのEPSガイドが8四半期すべてでコンセンサス＋ビート率を持ち、手計算と一致",[18,427,428],{"id":428},"学び",[313,430,431,437,440,448],{},[316,432,433,434,436],{},"チャートの設定を ",[28,435,34],{}," 単位の汎用オブジェクトにしておくと、系列を足すコストが「キーを1本生やす」だけになる。可視化の仕事の重さは描画側ではなく、ほぼ常にデータ収集側に寄る",[316,438,439],{},"アナリスト予想は1ソースを鵜呑みにすると逆符号の事故が起きる。割れたところだけ追加検索して潰すと費用対効果が高い（全部を多重検証する必要はない）",[316,441,442,443,349,445,447],{},"外部APIのキー名は推測ではなく、当てて外して当て直して特定するしかない。",[28,444,348],{},[28,446,352],{}," にたどり着くまで3〜4回外した",[316,449,450],{},"倍率の異常値は取得バグの可能性をまず疑い、画面の数字と照合してから採用する",[452,453,454],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}",{"title":66,"searchDepth":84,"depth":84,"links":456},[457,458,459,460,461,462,463],{"id":20,"depth":84,"text":20},{"id":201,"depth":84,"text":202},{"id":226,"depth":84,"text":226},{"id":277,"depth":84,"text":278},{"id":366,"depth":84,"text":367},{"id":388,"depth":84,"text":388},{"id":428,"depth":84,"text":428},"dev","決算モニタリングページに通年売上/EPSガイドの軌跡チャートを追加し、EPSビート率を8四半期つなぎ、Koyfin内部APIから14銘柄の直近終値を一括取得して可視化した作業ログ。","md",{},true,null,"/beat-monitoring-guidance-and-stock-charts","mdx-playground",false,"2026-05-29T00:00:00.000Z",{"title":5,"description":465},"2026-05/2026-05-29/beat-monitoring-guidance-and-stock-charts",[477,478,479,480,481,482],"決算ビート","データ可視化","Koyfin","x-search","ガイダンス","ファクトチェック","KCwZwwM5m-xSFHpTGf6EFMQIjGOmpuxmKtzRY4VE_wk",[],"https://log.eurekapu.com/og/blog/beat-monitoring-guidance-and-stock-charts.png?v=2026-05-29T00%3A00%3A00.000Z&title=%E3%83%93%E3%83%BC%E3%83%88%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E9%80%9A%E5%B9%B4%E3%82%AC%E3%82%A4%E3%83%80%E3%83%B3%E3%82%B9%E3%83%BBEPS%E3%83%93%E3%83%BC%E3%83%88%E7%8E%87%E3%83%BB%E7%9B%B4%E8%BF%91%E6%A0%AA%E4%BE%A1%E3%82%92%E8%B6%B3%E3%81%97%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=aabd2f4df92e151b",1782528844158]