リンクをコピーしました

個人用に作っていた 日本株スクリーニング(yfinance × わが投資術) の続きという感じです。

(気が付けばzenn下の記事を投稿して半年以上経っていた)

EDINET ベースの財務スクリーナー エディスク(edisuku) をオープンソースとして公開しました。
EDINET DBという便利なサイトも出てきたし、今回作ったのをまとめても微妙かなと思いましたが、まあ出してみるだけ無料なので公開してみました。

きっかけ — Sakana AI の EDINET データを見て

yfinance スクリーナーを作っていたとき、Sakana AI が EDINET のデータも用意して分析していたのを見て、「一回時間を見つけたらやってみよう」と思っていました。

EDINET は金融庁が公開している有価証券報告書などの開示データです。
これは一旦作ってみるのも楽しいかなと思って、作ってみました。

参考にしたのは Sakana AI の edinet2dataset です。
データ取り込みパイプライン(apps/wrapper)はこちらを参照しつつ、自分の用途に合わせて組み直しています(クレジットは CREDITS.md に記載)。

個人用にAIフル回しで作ったが、ぐちゃぐちゃだった

実際に手を動かし始めたのは今年の3月あたりでしょうか。
自分用なのでAI フル回しで一気に prototype を作り、とりあえず動くものはすぐできました。

ただ、正直なところコードも構成もぐちゃぐちゃですし、メンテもよくわからん。といった感じだったので。。
まとめつつ、作り直したのが今回作ったものです。

エディスクでできること

edisuku.com では、EDINET から取得した開示データをもとに、次のような分析が出来るかと思います。

  • EDINET 自動収集 — 有価証券報告書・四半期報告書などから XBRL/TSV をパースし、財務データを抽出
  • スクリーニング — ROE・PER・PBR・配当利回り・時価総額など 20 以上の指標で銘柄を絞り込み
  • 時系列チャート — 売上・営業利益・純利益・配当の推移を 10 年分以上表示
  • 財務諸表ビューア — BS / PL / CF を時系列で横並び比較(EDINET 原典へのリンク付き)
  • 大株主分析 — 株主構成・持株比率の変化をレポート単位で追跡

ランディングページのキャプチャはこんな感じです。

エディスクのスクリーナー画面

公開時点では 上場企業 3,900 社超・10 年分の四半期データをカバーしています(サイト上の統計表示ベース)。

アーキテクチャ — GHA で日次更新、Cloudflare で全部サーブ

構成の概要は README にもあるとおり、ざっくり次の流れです。

EDINET API

apps/wrapper(Python: 取得・解析)
  ↓ SQLite delta
Cloudflare D1
  ↓ drizzle
apps/api(Hono on Workers)
  ↓ hono/client(型安全)
apps/web(Vike + React on Workers)

ユーザー

データ取得(GitHub Actions)

daily-refresh.yml が日次更新の要です(現状は workflow_dispatch で手動実行、本番向け cron はコメントアウト済み)。

  1. D1 から既知の doc_id を取得
  2. ingest_daily.py で EDINET から当日提出分を取得・パース
  3. publish_to_d1.py で SQLite の差分を SQL に変換し、D1 へ反映
  4. company_metrics を再構築し、スクリーナー用の指標テーブルを更新
  5. KV のメトリクススナップショットを無効化(次回リクエストで再生成)

Python の wrapper は pnpm workspace の外に置き、取得・解析だけを担当させています。
指標計算(ROE、Piotroski F-Score など)は packages/metrics に集約し、API・Web・バッチが同じロジックを参照する形です。

配信(Cloudflare)

ホスティングはCloudflare Workersの無料枠を前提にしています。

レイヤ技術役割
永続化D1(SQLite)企業・書類・財務期間・指標・大株主
キャッシュKVスクリーナー用メトリクススナップショット
APIHono on WorkersREST API(drizzle で D1 を参照)
フロントVike + React on Workersスクリーナー UI(hono/client で型安全に API 呼び出し)

apps/webapps/apiAppType を import するだけで、実行時依存は持たない設計です。API のエンドポイントを変えるとコンパイル時に Web 側の型も追従します。

デプロイは deploy.yml から staging / production を選んで手動実行する形です(main への push 自動デプロイはコメントアウト)。

モノレポ構成

リポジトリを見ていただければわかると思いますが、主要なディレクトリは次のとおりです。

apps/
  api/        Hono on Workers(REST API)
  web/        Vike + React on Workers(UI)
  wrapper/    Python: EDINET 取得・解析
packages/
  db/         drizzle schema + 共通クエリ
  metrics/    指標計算・スクリーナー列定義
  types/      API/Web 共通 TS 型
infra/
  compose.yml              ローカル開発(Docker Compose)
  render-wrangler-config.sh  wrangler テンプレ生成
docs/
  ARCHITECTURE.md / modules/ / FORK.md など

ローカルでは docker compose -f infra/compose.yml up11 社分のサンプル DB 付きの UI をすぐ確認できます。
フォークして自分の Cloudflare アカウントに載せる手順は docs/FORK.md にまとめてあります。

その他機能とか、有料機能はまた気が向いたときに

ダウンロード(CSV エクスポート)や追加機能を 有料プランとして切り出すことを想定しています。
全部無料でもいいですけど、もうちょっと整理してお金払えるレベルになったら、それも足そうかなと思います。

ただ、それは また気が向いたときに進めようと思っています。
まずは OSS として動くところまで持っていけたので、使ってみてフィードバックがあれば Issue や PR で歓迎です。
お問い合わせからでも受け付けています。

まとめ

これを使って面白い分析などやってくれたら幸いです。

関連記事: バイブコーディングで3つ作った体験談(yfinance スクリーナー近況含む)

作者が作ったツール