Valscope開発記 第1回 — 個人で産業分析サービスを作る

公開: 2026-05-11
Valscope開発日記PythonLightGBM

はじめに

Valscope(val.codese.net)は、上場企業の有報データを機械的に整理し、業績の方向性を産業ごとに見やすくするWebサービスです。個人が作れる範囲で「産業分析の入り口」を作ることが目標です。

この記事では、なぜ作ることにしたか・どんな構成にしているか・今どこまで進んでいるかを記録します。

なぜ作るのか

株式投資を続けていると「この企業は業界全体で見てどのくらいの位置にいるのか」を手早く確認したい場面がよくあります。有報を1件ずつ読むのは時間がかかり、無料ツールでは産業横断の比較がしにくい。そこで自分で作ることにしました。

データ源と構成

データは金融庁の EDINET から XBRL 形式で取得しています。対象は上場企業の有価証券報告書(通期)で、2016年度以降を処理対象にしています。

パイプラインの大きな流れはこうなっています。

  1. EDINET API で書類リストを取得
  2. XBRL を解析して財務項目を抽出・Parquet に保存
  3. 企業・業種ごとに集計し、特徴量を生成
  4. LightGBM で翌期の売上方向を予測
  5. Next.js のフロントエンドで閲覧できるようにする

実行環境は Docker + Python で、データ正本はローカルの外付けSSDに置いています。

現在の進捗

2016年度分の XBRL 突合で未処理件数が約2,190件残っており、データ品質の改善が直近の課題です。

つまずいたこと

XBRL の仕様は版によって項目名が変わるため、年度をまたいだ突合が難しい。特に2016〜2018年頃の古い書類は属性の書き方が現在と異なるものがあり、パーサーを都度調整しています。

また Parquet 出力が空になるケースがあり、スコアリング処理でストリーム読み込みに変更することで回避しました。

個人開発ならではの制約

このプロジェクトで一番意識しているのは計算資源の制約です。全上場企業×約10年分のXBRLは数十万ファイル規模になり、何も考えずに処理すると手元のマシンが丸一日固まります。Dockerコンテナに CPU 2コア・メモリ4GB の上限を付け、夜間にバッチを流して結果だけを朝確認する運用に落ち着きました。クラウドで大きなインスタンスを借りれば一瞬ですが、毎月の費用が発生する構成は個人開発の継続性を損なうので、あえてローカル完結にこだわっています。

開発自体はAIコーディング支援と二人三脚です。XBRLパーサーのような「仕様書を読みながら地道に書く」コードはAIが得意ですが、「特定年度の書類だけ項目名が違う」といった現物データの罠は、結局1件ずつ目で確かめるしかありませんでした。自動化できる部分と人間が見るべき部分の線引きを学んだプロジェクトでもあります。

次にやること

月に1〜2回、この開発記で進捗を残していく予定です。

まとめ