メモリ半導体の月次先行指標を拡充 - DRAM/NAND価格・シンガポールNODX・台湾外銷訂単を毎朝チェーンへ

開発financial-data

統計公表スケジュールのページを開いて、カレンダーの並びを眺めていた。韓国の旬報、台湾の総輸出、SIA、日本の機械受注。メモリ半導体の先行指標として8系統を追いかけているが、これで足りているのかを確かめたことは一度もない。Micron や NVIDIA の決算より先に動く月次統計が、まだどこかに埋まっているのではないか。

そこで Claude Code に deep-research ワークフローを走らせた。追跡済みの8系統を除外条件に入れ、8つの観点に分けて並列調査させる構えである。

13系統の洗い出しと、価格系の空白

第1ラウンドは104エージェント・約24分で戻ってきた。ただし1回では終わらなかった。TrendForce の契約価格が無料でどこまで見えるのかが未確定のまま残ったので、契約価格ページを直接確認する追試を挟んだ。結論は「当期スナップショットのみ無料で見える」。履歴はログインしても追えない形式だった。

第2ラウンドは途中でセッション制限に当たり、取得エージェント6つが失敗した。検証まで届いたのは米国統計の領域だけで、中国・AIサーバー/DC・ASEAN は取得段階で落ちている。リセットを待って追試させ、2ラウンド合計でおよそ210エージェントに一次ソースをライブ検証させた。

成果は未追跡の先行指標13系統。追加価値順のランキング付きで memo/2026-07-19/semiconductor-leading-indicators-survey.md に残してある。

いちばんの発見はランキングの中身ではなく、偏りのほうだった。今追っている8系統は輸出額も受注も売上も、すべて「数量系」である。価格系がゼロ本。DRAM の値段を毎日見られる場所があるのに、うちのサイトには1本も入っていなかった。

しかも TrendForce のスポット価格は、無料で毎日更新されるのに履歴が残らない。今日の値は明日には上書きされて消える。取り始めた日からしか資産にならないデータで、放置した日数分だけ穴が空く。「毎日取れるの?スポットが」と聞き返して、その場で DRAM/NAND のスポット・契約価格の取得を決めた。

どれを組み込み、どれを見送ったか

13系統を全部実装する体力はない。追加価値順の上位5つだけを実装対象に切った。

  • TrendForce の DRAM/NAND スポット・契約価格
  • シンガポール NODX(非石油地場輸出の電子製品・IC)
  • 台湾 MOEA の外銷訂単(輸出受注)
  • 台湾メーカー月次売上の欠け(MediaTek)
  • 米国の受注系列(GA30)

残りの8系統は調査メモに置いて見送った。必要になったらランキングごと引っ張り出せばいい。

契約価格には但し書きが要る。データの再配布には規約の壁があるので、価格ページは公開せず dev 環境限定にして、ナビの導線も dev のときだけ出す。具体的な価格数値は外に書き出さない運用である。

TrendForce パーサでまず1本

進め方は「ざっくり計画 → 取得実験 → 今取れるベースでページ化 → 過程をスラッシュコマンドに固定」。DRAM/NAND × スポット/契約の4ページの HTML 構造を確認させてから、パーサを書かせた。

最初のパーサは前日比の記号を取りこぼした。▲ が ▲ のような実体参照のまま埋まっていて、デコード処理が抜けていたからである。スクラッチパッドに保存した実 HTML でスモークテストを回して気づき、修正。Codex レビューを挟み、フィクスチャとテスト23件を固めてからページ実装に進んだ。

仕上げに全体のテストを流すと155ファイル・18,602件がパスした。触った composable のカバレッジを確認させ、dev 限定ルートの分岐テストも1件足した。

「5つあったじゃないですか」

価格の1本が形になった報告を受けたところで、手が止まった。候補は5つあったはずだ。1個だけ組み込んで終わりなのか、5つ全部取るのか。聞き直して、残りもその日のうちに実装させることにした。

残り4本も進め方は同じで、先に実装計画を memo に落とし、Codex のレビューを回しながら並行で実装させた。

  • シンガポール NODX: 公式ページは JS レンダリングで中身が空。SingStat の API を直接叩かせたら、1997年1月〜2026年6月の354ヶ月×15系列が1リクエスト・189KB で取れた。最新は6月分(7/17公表)。テスト13件パス、ページも200を返した。
  • MediaTek (2454): 台湾メーカーの月次売上は FinMind 経由で取っているが、登録簿を調べさせると欠けていたのは MediaTek 1社だけだった。追加してインポートし、generate スクリプト2本にも足した。
  • 台湾 外銷訂単: MOEA の統計を data.gov.tw の公開 CSV から取得。テストの期待値に 89.48 と書いて落ちた。浮動小数点上の 89.475 は実際にはわずかに小さく、toFixed(2) は 89.47 を返す。期待値のほうを直した。
  • GA30: 実装は済ませたが、先方サーバーがダウンしていて初回のデータ取得だけ持ち越した。復旧したら取るだけの状態にしてある。

毎朝チェーンへの組み込み

取得を自分の記憶に頼ると必ず途切れる。既存の統計更新と同じく独立したスラッシュコマンドにしたほうが保守しやすいはずだ、と価格取得を決めた時点で注文を付けておいた。/make-diary の毎朝チェーンには統計更新の Step がすでに並んでいるので、同じ形で差し込んだ。

/make-diary チェーン Step 11.8 / 11.85 / 11.87
  → /update-memory-prices        # TrendForce DRAM/NAND 価格
  → /update-singapore-nodx       # シンガポール NODX
  → /update-taiwan-export-orders # 台湾 外銷訂単

各統計は独立したスラッシュコマンドに切り出した。チェーン本体に手順をベタ書きせず、1統計=1コマンドで持つ。取得先の仕様が変わっても、コマンド1本の修正で済む形である。

更新頻度は揃っていない。価格は毎営業日、NODX と外銷訂単は月次公表である。それでも毎朝回る場所に全部置いておけば、日次も月次も取りこぼさない。

表示確認とコミット

追加したページのローカル URL を並べてもらい、1枚ずつスクリーンショットで確かめた。

  • /memory-makers/memory-prices(dev 限定)
  • /memory-makers/singapore-nodx
  • /memory-makers/taiwan-export-orders

NODX はチャート3枚・内訳・月次テーブルまで描画。外銷訂単も同様に揃っていた。途中、dev サーバーが新ページのルートを認識せず、ポートからプロセスを特定して再起動する場面が2回あった。ついでに、今日手を入れた公表スケジュールと輸出統計のページも開き、隣接要素が壊れていないことまで見た。

コミットは /commit で機能単位に分割させた。セッション開始前からあった無関係な変更には触れさせず、mdx-playground に4コミット。銘柄リスト側のリポジトリは差分が想定より大きかった(+24行)ので、中身を確認させてからコミットした。学習ゲートには掛かったが、今日は理由付きの LEARN_SKIP で通した(スキップログには残る)。

ユーザーレベルの ~/.claude リポジトリも忘れずに。今日新設したスラッシュコマンド4本と既存コマンドへの追記をコミットさせ、別セッション由来で残っていた2ファイルも内容を確認させたうえで粒度を分けてコミット。git status が空になるまで片付けた。

学び

  • 追跡網の偏りは、中から見ていても気づけない。外から13系統を並べられて初めて「価格系がゼロ」だと分かった
  • 履歴を公開しないデータは、観測を始めた日が資産の起点になる。「あとで整備しよう」が一番高くつく
  • 1統計=1スラッシュコマンドでチェーンに刺す型は、今回4本増やしても崩れなかった。統計を足すコストが「コマンドを1本書く」に固定された

明日の朝チェーンが回れば、DRAM 価格の最初の1行が積まれる。残っているのは GA30 の初回取得だけで、これは先方サーバーの復旧待ちである。