開発financial-data

朝6:39に /add-ticker AMAT を叩いた瞬間から、beat-monitoring に銘柄が4本積み上がる一日が始まった。AMAT→JX金属(5016)→LITE→AXTIと走らせて、間にLargan(3008)とDelta(2308)の月次売上取り込みを挟んだ。記事的にはルーチンの「銘柄追加」だが、Lumentumの数字を眺めていたら「予想 vs 実績のギャップ分析こそ本丸では」と方針を切り替える瞬間がきて、午後はテーブル数字をチャート化するUI改修まで派生した。

なぜこの4本を一気に積んだか

そもそもAMATは「WFE(Wafer Fab Equipment)」セクターが既存のSECTOR_ORDERに無く、AVGOと同じく初回は安全に「ビート継続・成長期待」に置く判断を要した。続くJX金属(5016)は東証銘柄だが、285A(キオクシア)・4062(イビデン)・005930(Samsung)の前例があるので構造的には問題なし。LITE(Lumentum)とAXTIに繋がる流れは、JX金属の追加リサーチで「InP基板の納入先 = Lumentumがメイン、AXTIはCoherent側」という棲み分けに気づいたのがきっかけ。「これは横串で並べないと意味がない」と判断して、午前のうちに2本追加した。

/add-ticker の中身

スキルが7ステップに分かれており、ざっくり次の流れで進む。

  • Step 1-3: 重複チェック、tickerMeta.ts 更新、決算ビート履歴JSON作成(サブエージェントに委譲)
  • Step 4: summaries.ts 再生成
  • Step 5: Koyfin API → Turso 取り込み → valuation.ts 再生成
  • Step 6-7: dev検証

Step 5の Koyfin API 経路でいつも詰まるので、AXTI のターンでは agent-browser でユーザー Chrome の Console から JS を貼って estimates と price の JSON を %TEMP% に落とす運用に切り替えた。テンプレ JS は1〜2行で済む形にしてある。

const m = document.cookie.split(';').find(s => s.includes('auth_token='));
// fetch → blob → download。あとは Turso 取り込みスクリプトに渡すだけ

JX金属のときは Koyfin 経由で取れた価格データが朝の Yahoo Finance ジオブロックを補ってくれた。AMAT も同じパターンで、Yahoo がドル建て終値を返してくれなかったので Koyfin の p_candle_range を 2023/11〜直近で一括取得して決算日終値を抽出するスクリプトに切り替えた。

AMAT (Applied Materials)

時価総額 ~$450B、半導体製造装置の主役。リサーチで返ってきた changePct がいくつかの四半期で実測と方向違いになっていて、Q1 FY25 / Q4 FY25 / Q2 FY26 の3本で訂正が入った。Koyfin の実測値を Source of Truth にする判断は前例どおりなのでブレなかったが、リサーチエージェントが書いた event 説明文も方向に合わせて書き直した。

途中で .env を読む PowerShell を Claude Code に書かせようとしたら auto-mode 分類器に弾かれた。1Password CLI を使う案を試したが、Personal vault に Turso の認証情報が登録されていなくて不発。最終的に Bash 経由でユーザーが ! プレフィックスで直接打って通った。この経路は別セッションでも詰まるので、memo/2026-06-17/migrate-koyfin-secrets-to-1password.md に1Password移行の指示書を残した(別セッションの Claude Code が頭から実行できる構成)。

JX金属(5016) — InP 基板 1,200億円投資の銘柄

朝の「JX金属、光通信向け基板の投資を15億円から1200億円へ」というニュースが起点。/add-ticker を流しつつ、深掘り記事 jx-inp-1200oku-capex.md を並行で立ち上げた。要点だけ書く:

  • 予想PER 25.8倍 / 予想EPS 173円(FY27 GAAPコンセンサス、現株価4,466円)
  • 1,200億円は FY26 通期営利1,750億円の 約7割、CapEx 638億円の 約1.9倍
  • 5/11のCB発行2,500億円は ENEOS HDからの自己株TOB(1,949億円)用、差額827億円がフォーカス事業の生産能力拡大用 — つまりCB資金 = InP投資原資ではない
  • InP基板の納入先は JX金属 → Lumentum (LITE) がメイン、AXT → Coherent側 という棲み分けを X-search で確認

JX金属のときの寄り道で、SVG2本(縦タイムライン・資金フロー)を jx-inp-timeline.svg / jx-cb-fund-flow.svg として書き起こした。これがあるとモーダル表示で本文に貼った時に時系列が一発で頭に入る。

LITE (Lumentum Holdings) — EPSガイダンスを出していない銘柄

光通信 AI 向けの主役だが、追加直後にユーザーから「Xサーチでちゃんとアナリスト予想を取ってくれ、ギャップ分析が一番重要」と方針が落ちてきた。ここが今日の核心

LITE は EPS ガイダンスを出さず、売上ガイダンスのみ開示する会社。リサーチで埋めた analystEstimate.eps は Yahoo Finance や公開記事からのざっくり値で、point-in-time の Bloomberg / FactSet コンセンサスとずれていた。X-search で4並列のサブエージェントに2四半期ずつ振って、各四半期の (1)売上実績コンセンサス (2)EPS実績コンセンサス (3)次Q売上ガイダンスコンセンサスを取り直した。

修正例:

  • Q4 FY24: 売上 cons 302.6M → **301.1M** (FactSet)、EPS cons 0.03 → **0.02**
  • 次Q売上ガイダンスコンセンサス n/a → $311.4M など、ガイダンス上振れ率まで埋まる

数字を並べて見たら、ユーザーが「ちょっと失速気味って感じなんですよね」とつぶやいた。実際、Q1〜Q3 FY26 で売上ビート率・EPSビート率・次Qガイド上振れ率の3指標が同時に減衰している。3列同時の減衰は失速の典型シグナルだと体で覚えた。

AXTI (AXT Inc) — InPの小型プレイヤー

JX金属(シェア10%)とは規模が桁違いで、AXTIの売上は88M〜260Mレンジ、InPが売上の50%。設備投資のコミット規模で並べるとJX金属の1,200億円が群を抜いて突出する。jx-inp-axt-capex-compare.svg を JX 記事側に追加して可視化した。

AXTIの追加作業自体はトラブル続きだった。Chrome DevTools MCPの9222ポートが壊れた残骸として残っていて応答せず、temp profile で起動し直したが Koyfin auth_token がない未ログイン状態。ユーザーが PC を再起動して仕切り直し、memo/2026-06-17/add-ticker-axti-resume.md に状態を残してから午後 11:38 の別セッションで再開した。再開後は agent-browser でユーザー Chrome の Console から JS を叩いて Koyfin の estimates / price JSON を %TEMP% に落とす運用が安定。AXTI は price=$92.91、ntm_pe=202.20倍 という派手な数字で着地。

Largan(3008) と Delta(2308) の月次売上取り込み(脇道)

朝の Largan 関連ニュース「CPOで3世代先取り」を見て、memory-makers/makers の assembly カテゴリに追加して月次売上29ヶ月分(2024-01〜2026-05)を取り込んだら、ユーザーが「数字で見ると全然って感じ」「3世代進んでるって言ってる割に月次伸びてない」と即座に違和感を表明。記事の高揚感と月次売上の現実のギャップを、グラフ1枚で叩き返せたのが今日いちばん気持ちよかった瞬間。

Vera Rubin の 800V HVDC 記事(午後)では、Delta(2308.TW) / Niko Precision(8255.TW) / 松川精密(7788.TW) の3社を新カテゴリ「AIサーバー電源(800V HVDC・電源モジュール・制御部品)」として追加。最初は makers.ts に会社情報だけ入れて個別ページのチャートが描画されないハマりがあったが、update-tw-monthly-revenue スキルを叩いて 3 社分の月次売上を FinMind から取って TS データ生成までやらせた。松川精密は2025-08上市の関係で10ヶ月分のみ。

EPS前四半期比増減率をチャート化(全銘柄共通)

LITEの失速を数字テーブルで見た流れで、「個別の銘柄ページの数字、全部チャートにしてくれ」とユーザーから一言。TripleBeatPctChart.vue を新規作成して [ticker].vueTripleBeatTable 直下に挿入した。2枚に分割:

  • チャート①「短期サプライズ系」: 売上ビート率 / EPSビート率 / 次Qガイド上振れ率 / 株価騰落率
  • チャート②「成長率系」: 売上 YoY(EPSは基準金額が小さい初期で +200% 等に飛ぶので①寄せ)

全銘柄共通で適用されるので、AMAT / JX金属 / LITE / AXTI 含む 36 銘柄ぶんがいきなりビジュアル化された。

朝の MCP 不調 → PC再起動の一幕

8:45 の AXTI 追加で chrome-devtools MCP が連続タイムアウト。9222 直接叩いたら応答なしで「壊れた残骸 9222」状態。Chrome を temp profile で起動し直したが Chrome 本体のタブも全部開かなくなったらしく、ユーザーが PC を一度再起動。memo/2026-06-17/add-ticker-axti-resume.md に状態を残してから午後 11:38 の別セッションで再開、agent-browser で復活した。

CLAUDE.md の Chrome Remote Debugging ルールに「壊れた残骸 9222 が居座る現象」が固定化されているが、今日もこのパターンで詰まった。残骸が居座らないように「デバッグ Chrome は使い終わったら閉じる」が恒久対策。実運用でこれが守れない瞬間が積み重なって今日の再起動になった。

学びメモ

  • ガイダンス開示がない銘柄(LITE等)は、X-search で point-in-time のセルサイドコンセンサスを取らないとギャップ分析が成立しない。リサーチエージェントの一次出力で済ませると、コンセンサス値が現代の事後値で揃ってビート判定がブレる。
  • 3指標(売上/EPS/次Qガイド)が同時に減衰したら失速確定。1指標ならノイズ、2指標で警戒、3指標で構造変化。
  • 記事の高揚感(「3世代先取り」)は月次売上のグラフ1枚でひっくり返せる。数字を取り込む順序として、ニュース → 月次グラフ → 印象修正、が定型ワークフローになりつつある。
  • テーブルの数字行はチャートにすると一発で減衰が見える。EPS 前四半期比増減率をテーブルで見ても脳が処理しきれないが、折れ線にすると右肩下がりが3本同時に重なって見える。
  • Koyfin API 経由の運用は agent-browser + Console JS が一番安定。chrome-devtools MCP は壊れた残骸9222問題が再発しやすいので、AXTI のターンで切り替えた agent-browser 経路を AMAT / LITE 含めデフォルトにしていい。

明日以降のメモ

  • LITE の失速トレンドを記事化(Q1〜Q3 FY26の3指標減衰、Lumentumの800G→1.6T移行の遅れと結びつける)
  • AXTI ntm_pe=202倍の解釈(InP構造転換進行中の純利益伏在を見るか、過熱と見るか)
  • Largan(3008) CPO の月次売上 vs 株価反応を別記事で(高揚感とギャップの定型例として残す)
  • 1Password 経由の Turso 認証情報移行(memo/2026-06-17/migrate-koyfin-secrets-to-1password.md を別セッションで実行)
  • デバッグ用 9222 Chrome は使い終わったら必ず閉じる運用を体に染み込ませる