[{"data":1,"prerenderedAt":518},["ShallowReactive",2],{"content-/kioxia-beat-monitoring-eps-fix":3,"all-pages-for-dir":516,"og-image-/kioxia-beat-monitoring-eps-fix":517},{"id":4,"title":5,"body":6,"category":497,"description":498,"extension":499,"meta":500,"navigation":501,"ogImage":502,"path":503,"project_name":504,"published":505,"publishedAt":506,"seo":507,"stem":508,"tags":509,"todo":502,"unpublished":505,"updatedAt":502,"__hash__":515},"pages/2026-06/2026-06-29/kioxia-beat-monitoring-eps-fix.md","キオクシア(285A) beat-monitoring の EPS フィールドが営業利益で埋まっていた話",{"type":7,"value":8,"toc":487},"minimark",[9,21,24,29,59,62,66,69,72,93,103,106,110,120,131,138,142,156,162,173,176,184,188,191,216,222,238,242,245,260,263,275,278,282,285,368,378,385,435,441,451,455,476,483],[10,11,12,16,17,20],"p",{},[13,14,15],"code",{},"/beat-monitoring/285A"," のページを眺めていたら、コンセンサスバーがほとんど ",[13,18,19],{},"n/a"," になっていて寂しい絵面だった。キオクシア(285A) は日本企業なので、米国・韓国勢のように分析者コンセンサスが秒で揃わない。代わりに「会社が前Qに出したガイダンス」と「実績」を並べれば、ビート/ミスを同じ尺度で見られるはず。今日はその尺度をきちんと埋め直す作業をやった。",[10,22,23],{},"途中で、チャートに見覚えのない 701 という数字がドンと立っていることに気づいた。自分が入れた数値ではない。データ設計のミスマッチを掘り当てるところまで連れていかれて、結局その方が今日の本丸になった。",[25,26,28],"h2",{"id":27},"まずモードの確認-キオクシアは会社の前qガイダンス-vs-実績","まずモードの確認 ― キオクシアは「会社の前Qガイダンス vs 実績」",[10,30,31,34,35,38,39,42,43,46,47,50,51,54,55,58],{},[13,32,33],{},"apps/web/app/data/tripleBeat/285A.json"," の ",[13,36,37],{},"consensusSource"," は既に ",[13,40,41],{},"company-prior-guidance"," になっていて、画面側の ",[13,44,45],{},"BeatExpectationsChart.vue"," / ",[13,48,49],{},"TripleBeatTable.vue"," も、",[13,52,53],{},"quarters[i].revenue.actual"," を ",[13,56,57],{},"quarters[i-1].guidance.revenue.company"," と比較する実装になっていた。ここは触らなくていい。",[10,60,61],{},"足りないのは中身、つまり過去のガイダンス値そのものだった。X-search/FactSet 経由でかき集めた歯抜けの状態で止まっていて、決算説明会資料を見に行けばもっと埋まる、という素直な話。",[25,63,65],{"id":64},"キオクシア-ir-から決算説明会資料-pdf-を取りに行く","キオクシア IR から決算説明会資料 PDF を取りに行く",[10,67,68],{},"まずは直近の Q3 FY26 決算説明会資料 (2026/2/12 開示) を取得しに IR ページを叩いた。HTML が動的レンダリングで PDF URL が直接見えない罠を1回踏んでから raw HTML 経由で URL を引き当てた。",[10,70,71],{},"p.16 に「2026年3月期 第4四半期ガイダンス」スライドがあり、会社が直接出しているレンジが揃っていた:",[73,74,75,84,87],"ul",{},[76,77,78,79,83],"li",{},"売上: 8,450 〜 9,350 億円（中央値 ",[80,81,82],"strong",{},"8,900 億円","）",[76,85,86],{},"Non-GAAP 営業利益: 1,150 〜 1,650 億円（中央値 1,400 億円）",[76,88,89,90,83],{},"Non-GAAP 1株EPS: 569 〜 679 円（中央値 ",[80,91,92],{},"624 円",[10,94,95,96,46,99,102],{},"レンジで開示されているガイダンスは、中央値で取って ",[13,97,98],{},"guidance.revenue.company",[13,100,101],{},"guidance.eps.company"," に入れる方針で進めた。",[10,104,105],{},"ここまでは順調だった。",[25,107,109],{"id":108},"ブラウザを開き直していきなり-701-が立っていた","ブラウザを開き直して、いきなり 701 が立っていた",[10,111,112,113,115,116,119],{},"更新した JSON を読み込ませた状態で ",[13,114,15],{}," を開き直すと、EPS チャートの Q4 FY26 のコンセンサスバーに ",[80,117,118],{},"701"," が立っていた。自分が入れたのは中央値 624 円のはずで、701 という数字に心当たりがない。",[10,121,122,123,126,127,130],{},"最初は「ガイドレンジの上端を拾っているのか、計算式のどこかでズレているのか」と疑ったが、コードを追ってみると、",[13,124,125],{},"impliedQ4Guide"," フォールバック計算という別経路が動いていた。",[13,128,129],{},"eps"," フィールドの数値を一度パースし直して別の係数を掛けて出していて、その結果が 701 だった。",[10,132,133,134,137],{},"なぜそんなフォールバックがあるのか、と ",[13,135,136],{},"parseCurrencyToNumber"," の挙動と一緒に追っていって、ようやく根本原因に行き当たった。",[25,139,141],{"id":140},"根本原因-eps-フィールドに営業利益億円が入っていた","根本原因: EPS フィールドに「営業利益(億円)」が入っていた",[10,143,144,145,147,148,151,152,155],{},"キオクシアの 285A.json は、",[13,146,129],{}," フィールドに ",[80,149,150],{},"1株EPS ではなく、Non-GAAP 営業利益(億円)"," を入れる設計になっていた。",[13,153,154],{},"tableNotes"," には「韓国勢と同じ方式」と書いてあったが、実際には韓国勢は 1株EPS(ウォン) で揃っており、キオクシアだけが営業利益のスケールで埋まっていた。",[10,157,158,159,161],{},"つまり同じ ",[13,160,129],{}," というフィールド名で、",[73,163,164,167,170],{},[76,165,166],{},"米国勢: 1株EPS (USD)",[76,168,169],{},"韓国勢: 1株EPS (KRW)",[76,171,172],{},"キオクシア: 営業利益 (億円)",[10,174,175],{},"という単位混在が起きていて、チャート側がスケールを揃えようと頑張った末に、見覚えのない 701 が立つに至った、という構図だった。フォールバック計算は、この単位ズレを実装側で吸収しようとした副作用だったらしい。",[10,177,178,180,181,183],{},[13,179,129],{}," という名前のフィールドに営業利益を詰めるな、というだけの話ではあるが、",[13,182,154],{}," のコメントが事実と食い違ったまま放置されていたのが致命傷で、後から触る自分自身（あるいは未来の Claude Code）を混乱させていた。",[25,185,187],{"id":186},"案a-vs-案b-キオクシアの数値を-1株eps-に揃える","案A vs 案B ― キオクシアの数値を 1株EPS に揃える",[10,189,190],{},"修正方針は2択あった。",[73,192,193,210],{},[76,194,195,198,199,201,202,205,206,209],{},[80,196,197],{},"案A",": キオクシアの ",[13,200,129],{}," フィールドを 1株EPS(円) に統一する。",[13,203,204],{},"memory-makers"," 側に ",[13,207,208],{},"kioxiaQuarterlyFinancials.ts"," が既にあり、1株EPS の実績はそこから拾える",[76,211,212,215],{},[80,213,214],{},"案B",": チャート側を「キオクシアだけは営業利益スケール」として個別分岐させる",[10,217,218,219,221],{},"案B は実装が分散して複雑になるし、何より「同名フィールドで単位が違う」という構造の歪みを温存することになる。",[13,220,154],{}," の嘘も解消できない。",[10,223,224,225,227,228,34,231,234,235,237],{},"案A で進めた。",[13,226,208],{}," から各 Q の 1株EPS 実績を拾い、",[13,229,230],{},"285A.json",[13,232,233],{},"quarters[*].eps.actual"," を全件 1株EPS(円) に書き換える。",[13,236,101],{}," も同じスケールに合わせる。",[25,239,241],{"id":240},"ガイダンス値の換算-既存の数字が間違っていた件","ガイダンス値の換算 ― 既存の数字が間違っていた件",[10,243,244],{},"ガイダンス側の 1株EPS を埋めるため、Q1 FY26 (2025/8/8) と Q2 FY26 (2025/11/?) の決算説明会資料 PDF も追加で取りに行った。",[10,246,247,248,251,252,255,256,259],{},"ハマったのは、Q1 FY26 (2025/8/8) のガイダンスには Non-GAAP 1株EPS のレンジが",[80,249,250],{},"開示されていなかった","こと（売上・営業利益・当期純利益まで）。なので Q1 FY26 の ",[13,253,254],{},"guidance.eps"," は素直に ",[13,257,258],{},"null"," に倒すしかない。",[10,261,262],{},"Q2 FY26 の方は PDF の p.12 に Q3 FY26 ガイダンスが載っていて:",[73,264,265,268],{},[76,266,267],{},"売上: 5,000 〜 5,500（中央値 5,250 ← 既存と一致）",[76,269,270,271,274],{},"Non-GAAP 営業利益: 1,000 〜 1,400（中央値 ",[80,272,273],{},"1,200"," ← 既存値 1,250 は誤り）",[10,276,277],{},"つまり既存の 285A.json は、ガイダンスの営業利益中央値の段階で既に 50億円ズレていた。EPS フィールドに営業利益を入れる設計だったので、当然 1株EPS への換算もズレていく。換算ミスをそのまま放置して案B で帳尻だけ合わせていたら、構造の歪みも嘘も両方残ったまま月次で増えていたところだった。",[25,279,281],{"id":280},"差分の核心-json-の数値とテストの前提値","差分の核心 ― JSON の数値とテストの前提値",[10,283,284],{},"JSON 側は EPS フィールドを全件 1株EPS(円) に揃えるだけ。サンプルとしては:",[286,287,292],"pre",{"className":288,"code":289,"language":290,"meta":291,"style":291},"language-diff shiki shiki-themes vitesse-light vitesse-light","   \"epsLabel\": \"Non-GAAP 1株EPS（円）\",\n   \"quarters\": [\n     {\n       \"quarter\": \"Q2 FY26\",\n-      \"eps\":      { \"actual\": \"¥872億\" },\n+      \"eps\":      { \"actual\": \"¥77.22\" },\n       \"guidance\": {\n-        \"eps\": { \"company\": \"¥1,250億\" }\n+        \"eps\": { \"company\": \"¥138.96\" }\n       }\n     }\n   ]\n","diff","",[13,293,294,302,308,314,320,326,332,338,344,350,356,362],{"__ignoreMap":291},[295,296,299],"span",{"class":297,"line":298},"line",1,[295,300,301],{},"   \"epsLabel\": \"Non-GAAP 1株EPS（円）\",\n",[295,303,305],{"class":297,"line":304},2,[295,306,307],{},"   \"quarters\": [\n",[295,309,311],{"class":297,"line":310},3,[295,312,313],{},"     {\n",[295,315,317],{"class":297,"line":316},4,[295,318,319],{},"       \"quarter\": \"Q2 FY26\",\n",[295,321,323],{"class":297,"line":322},5,[295,324,325],{},"-      \"eps\":      { \"actual\": \"¥872億\" },\n",[295,327,329],{"class":297,"line":328},6,[295,330,331],{},"+      \"eps\":      { \"actual\": \"¥77.22\" },\n",[295,333,335],{"class":297,"line":334},7,[295,336,337],{},"       \"guidance\": {\n",[295,339,341],{"class":297,"line":340},8,[295,342,343],{},"-        \"eps\": { \"company\": \"¥1,250億\" }\n",[295,345,347],{"class":297,"line":346},9,[295,348,349],{},"+        \"eps\": { \"company\": \"¥138.96\" }\n",[295,351,353],{"class":297,"line":352},10,[295,354,355],{},"       }\n",[295,357,359],{"class":297,"line":358},11,[295,360,361],{},"     }\n",[295,363,365],{"class":297,"line":364},12,[295,366,367],{},"   ]\n",[10,369,370,371,373,374,377],{},"(実際の対応は全 Q 分。",[13,372,101],{}," は会社の前Qガイドの 1株EPS 中央値、",[13,375,376],{},"actual"," は 実績の 1株EPS。)",[10,379,380,381,384],{},"テスト側 (",[13,382,383],{},"apps/web/tests/kioxia-consensus-source.test.ts",") は、前提値を 1株EPS スケールに書き換えるだけで通る。",[286,386,388],{"className":288,"code":387,"language":290,"meta":291,"style":291},"-  it('Q3 FY26 EPS のコンセンサスは Q2 FY26 の eps ガイド (¥1,250億)', () => {\n+  it('Q3 FY26 EPS のコンセンサスは Q2 FY26 の 1株EPS ガイド (¥138.96)', () => {\n     const guide = parseCurrencyToNumber(q2.guidance!.eps!.company)\n     const actual = parseCurrencyToNumber(q3.eps.actual)\n-    expect(guide).toBe(1.250e11)\n-    expect(actual).toBe(1.447e11)\n+    expect(guide).toBe(138.96)\n+    expect(actual).toBe(165.28)\n   })\n",[13,389,390,395,400,405,410,415,420,425,430],{"__ignoreMap":291},[295,391,392],{"class":297,"line":298},[295,393,394],{},"-  it('Q3 FY26 EPS のコンセンサスは Q2 FY26 の eps ガイド (¥1,250億)', () => {\n",[295,396,397],{"class":297,"line":304},[295,398,399],{},"+  it('Q3 FY26 EPS のコンセンサスは Q2 FY26 の 1株EPS ガイド (¥138.96)', () => {\n",[295,401,402],{"class":297,"line":310},[295,403,404],{},"     const guide = parseCurrencyToNumber(q2.guidance!.eps!.company)\n",[295,406,407],{"class":297,"line":316},[295,408,409],{},"     const actual = parseCurrencyToNumber(q3.eps.actual)\n",[295,411,412],{"class":297,"line":322},[295,413,414],{},"-    expect(guide).toBe(1.250e11)\n",[295,416,417],{"class":297,"line":328},[295,418,419],{},"-    expect(actual).toBe(1.447e11)\n",[295,421,422],{"class":297,"line":334},[295,423,424],{},"+    expect(guide).toBe(138.96)\n",[295,426,427],{"class":297,"line":340},[295,428,429],{},"+    expect(actual).toBe(165.28)\n",[295,431,432],{"class":297,"line":346},[295,433,434],{},"   })\n",[10,436,437,438,440],{},"冒頭にも一文コメントを追加した。「2026-06-29: EPS フィールドを『営業利益（億円）』→『Non-GAAP 1株EPS（円）』に統一。米国勢($/株)・韓国勢(W/株) と同じスケールに揃えた」と。",[13,439,154],{}," の嘘もここで上書きしておかないと、同じ罠を別の誰かが踏みなおす。",[10,442,443,446,447,450],{},[13,444,445],{},"pnpm test:run apps/web/tests/kioxia-consensus-source.test.ts"," で ",[80,448,449],{},"9 tests pass","。",[25,452,454],{"id":453},"今日の教訓-フィールド名と中身の不一致は数か月単位で人を惑わせる","今日の教訓 ― フィールド名と中身の不一致は数か月単位で人を惑わせる",[73,456,457,462,465,470,473],{},[76,458,459,461],{},[13,460,129],{}," という名前のフィールドに営業利益を詰めるな。事故は確定で起きる",[76,463,464],{},"データ設計のミスマッチは、画面の違和感（見覚えのない 701）として出てくる。チャート側のロジックを疑う前に、データの単位を一回疑う",[76,466,467,469],{},[13,468,154],{}," に「韓国勢と同じ方式」と書いてあっても、コメントは嘘をつく。実データを並べて確かめる",[76,471,472],{},"案A（構造を正す）と案B（個別分岐で吸収する）の選択は、長期で見るとほぼ案A 一択。分岐は数か月後の自分を確実に殺しに来る",[76,474,475],{},"日本企業の決算ガイダンスを取り込むときは、IR の PDF を直接見にいくのが結局いちばん早い。X-search 経由のサマリーは抜けが多い",[10,477,478,479,482],{},"beat-monitoring 全 30 銘柄のうち、日本企業はキオクシアだけなので、この単位混在は今のところ他の銘柄には波及していない。今後 日本銘柄を追加するときは、最初から 1株EPS(円) スケールで埋めて、",[13,480,481],{},"epsLabel"," で単位を明示することにする。",[484,485,486],"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);}",{"title":291,"searchDepth":304,"depth":304,"links":488},[489,490,491,492,493,494,495,496],{"id":27,"depth":304,"text":28},{"id":64,"depth":304,"text":65},{"id":108,"depth":304,"text":109},{"id":140,"depth":304,"text":141},{"id":186,"depth":304,"text":187},{"id":240,"depth":304,"text":241},{"id":280,"depth":304,"text":281},{"id":453,"depth":304,"text":454},"dev","「会社の前Qガイダンス vs 実績」モードでキオクシアを整備していたら、チャートに突然 701 という見覚えのない数字が立った。原因はデータ設計のミスマッチで、EPS フィールドに営業利益(億円)を入れていた。","md",{},true,null,"/kioxia-beat-monitoring-eps-fix","mdx-playground",false,"2026-06-29T00:00:00.000Z",{"title":5,"description":498},"2026-06/2026-06-29/kioxia-beat-monitoring-eps-fix",[510,511,512,513,514],"キオクシア","285A","beat-monitoring","EPS","データ設計","ZpVo_UptTuv5cvJyPybgu3Ejv-AvTNd3VCMmtlSRex0",[],"https://log.eurekapu.com/og/blog/kioxia-beat-monitoring-eps-fix.png?v=2026-06-29T00%3A00%3A00.000Z&title=%E3%82%AD%E3%82%AA%E3%82%AF%E3%82%B7%E3%82%A2(285A)%20beat-monitoring%20%E3%81%AE%20EPS%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%8C%E5%96%B6%E6%A5%AD%E5%88%A9%E7%9B%8A%E3%81%A7%E5%9F%8B%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E8%A9%B1&author=Kei%20Komatsu&sig=4ea86021388e2d90",1782885017059]