• #メモリー半導体
  • #DRAM
  • #Nuxt
  • #データ可視化
  • #Vue
開発financial-data

メモリーメーカー動向ハブを新設し、DRAM市場シェアの推移を可視化した一日

朝、コーヒーを淹れる前にハンドオフメモを5本開いた。昨日の積み残しがどこまで残っているのか、記憶だけで判断せずにファイルを並べて読む。残っていたのは大小5件。一番の大物が「メモリーメーカー動向ハブ」のUIで、ページが丸ごと存在しないまま放置されていた。

まずは小物から片付ける。億り人記事はもう仕上がっていたので、ハンドオフメモ上で完了マークを打ち込んだ。チェックボックスに x を入れるだけの作業だが、メモから1行消えると次に進む足が軽くなる。

データ層は揃っていた。足りないのはページだった

メモリーメーカーハブは、最初に「何が無いのか」を切り分けるところから入った。Claude Codeに既存実装を読ませると、データ層・純粋関数・SVGチャートはすでに前のセッションで組み上がっていた。欠けているのは画面だけ。つまりページを5枚書けば動く状態だった。

手本にしたのは beat-monitoring ページ。同じハブ構造を持っているので、構成をそのまま下敷きにできる。Claude Codeに手本と改変対象の3ファイル(index.vue / breadcrumbs.ts / nuxt.config.ts)を読ませてから、ページ実装に入らせた。

実装の前に既存テストをバックグラウンドで流しておいた。9件パス。データ層の足場が固いことを確認してから上物を載せる。ハブページ、動的ルートの個別ページ、チャート2種とデータ表を順に組み、トップにカードを追加し、パンくずを通し、prerender seed を足す。nuxt.config.ts は Read していなかったので一度編集を弾かれた。該当箇所を読み直してから書き直す。

検証で「Home > メモリーメーカー > サムスン電子」のパンくずが出て、404 が 404 を返すところまで確認できたとき、画面が形になったと実感した。テストは16件まで増えてすべてパスしていた。

サムスンとSK Hynixで決算データの形が違った

午後、SK Hynix をハブの2社目として足す段になって、データの形が噛み合わない問題にぶつかった。

サムスン電子は「四半期・セグメント別」の損益でデータを持っている。一方 SK Hynix の手元データは「年次・連結損益」型。粒度も切り口も違う。同じ型に無理やり押し込むと、どちらかが破綻する。ここでデータ種別を1つ拡張する判断をした。年次・連結損益を扱う種別を新設し、純粋関数(年次系列ビルダー)を utils に追加して、個別ページの script で annual データセットを取り出せるようにする。

// 年次系列を組む純粋関数を1本追加して、
// 四半期型と年次型を別系列として扱えるようにした

ここで判断が要ったのが FY2018〜2020 の粗利だった。手元 memo に推定値はあったが、推定を確定値のフリで載せると後で自分が騙される。確定値のみを表に出し、FY2018〜2020 の粗利は null にして「—」表示にした。APIキーが取れたら埋める前提で、空欄は空欄のまま残す。

DART を取りに行くのをやめた判断

途中で「DART だからこれって何ですか」という会話があった。DART は韓国の企業決算開示システムで、日本でいう EDINET にあたる。SK Hynix の確定粗利はそこから取れる。

ただ、外部取得には OpenDART の APIキーが要る。今その場で取りに行くと作業が止まる。手元 memo のデータだけで2社目を立てれば、画面としては今日中に成立する。外部取得は諦め、手元データで進めて、確定に必要なキーの件は進捗メモに「残作業」として書き残した。完璧を待つより、空欄を明示して形にする方を選んだ。

dev で SK Hynix ページを開くと最初は 2050 バイトしか返らず、ルートだけ 404 だった。HMR が新規ルートを拾っていなかった。dev サーバーをポート指定で再起動すると 23369 バイトで復活し、FY2023 の赤字の谷と FY2024-25 の急回復が両チャートに描かれた。FY2018-2020 の粗利は狙いどおり「—」で並んでいた。

過去8四半期の DRAM 市場シェアを可視化した

別のタイミングで「過去8四半期分の DRAM シェアの推移を TrendForce から取れるか」という相談が来た。TrendForce のシェアランキングは四半期ごとに同じ「DRAM Supplier Revenue Ranking」を無料公開していて、各リリースが「当四半期+前四半期」の2四半期分を載せる。つまり3〜4本拾えば 2Q24〜1Q26 の8四半期が全部そろう。

集めた表画像から公表シェアをそのまま採って、memory-makers 配下に DRAM シェアのページを1枚新設した。シェア折れ線・シェア構成・売上規模の3チャートと2テーブルを並べる。系列が7本に増えたので、StackedBarChart の凡例を複数行折り返しに対応させた。既存の3系列利用に回帰が出ないことも確認した(viewBox 高さ 390 のまま)。

1点だけ無視できない断絶があった。TrendForce は 1Q25 から中国勢(CXMT等)をカバーに追加したため、「Others」が 4Q24 の 0.5% から 1Q25 の 4.6% に跳ねている。Big3 のシェアも分母が増えた分だけ薄まる。グラフを見る人がここで誤読しないよう、注記を入れた。

TrendForce のシェアは推計値だと裏を取った

朝のうちに、マイクロンのセグメント利益の数字の裏付けも取っていた。TrendForce の Micron「1Q26 $21,750M」が何の数字なのかを Micron 公式開示で突き合わせる。

掘ってみると、Micron の開示セグメントは技術別(DRAM/NAND)ではなく市場別(Cloud Memory / Core Data Center / Mobile and Client / Automotive and Embedded)だった。つまり「DRAM の利益」という開示自体が存在しない。DRAM 単独の売上は 10-Q の「技術別売上」テーブルで突き合わせられるが、TrendForce の四半期はカレンダー四半期で、Micron は8月決算なのでズレる。

結論として、TrendForce の数字は各社の公表値そのままではなく、TrendForce が独自にカレンダー四半期へ組み替えた推計値だと確認できた。ページの注記もこの理解に合わせて「推計値」と明記した。途中で SEC.gov が WebFetch を 403 で弾いてきたが、正しい User-Agent を付けた curl に切り替えたら 10-Q を取れた。

終わりに

最後にコミットを分けた。メモリーメーカー分と億り人分は性質が違う作業なので、混ぜずに2コミットに切る。ステージ内容を一つずつ確認し、別作業の成果物(research_* 等)が紛れていないことを確かめてから打った。

今日の学びは2つ。1つは、データの粒度が違うときに無理やり同じ型へ寄せず、種別を足す方が後で破綻しないということ。もう1つは、外部ソースを取りに行けないときに空欄を「—」で明示して先に形を作れば、APIキーが揃ったあとに埋めるだけで済むということ。推定値で穴を埋めて自分を騙すより、空欄のまま残す方が後の自分に優しい。