コンテンツにスキップ

株価データ取得ツール

株価・適時開示・ニュース・決算短信・有価証券報告書の取得と、取得したデータの品質チェックを、ひとつの画面にまとめたツール「株価データ取得ツール」の解説です。「株価分析」(決算短信・有価証券報告書・株価データを使った検証)の元になるデータを、毎日きちんと貯めるために作りました。

  • 決算・株価データ検証:記事の一覧
  • 動作環境:Windows の自分のパソコン(ローカルWebアプリ。公開サイトはありません)

このページは、ツールの使い方と、その仕組み、作るうえで判断したことの解説です。

株価データ取得ツールとは:取得と点検を、ひとつの画面で

株価分析は、無料で入手できる次のデータを土台にしています。

データ 取得元 保存先
個別株の日足・5分足、マクロ指標 yfinance data/prices/
適時開示 TDnet data/news/tdnet/
ニュース RSS data/news/rss/
決算発表予定 決算スケジュール data/news/kessan_schedule/
決算短信 XBRL data/statements/
有価証券報告書 EDINET data/yuho_zip/ ほか

取得のたびにスクリプトを個別に呼び、ログを見て、抜けや遅れを目で確かめるのは手間がかかります。そこで、押すだけで取得でき、取得済みの期間と実行ログが見え、データの異常も点検できる画面にまとめました。

取得の中身(どこから、どう取るか)は、これまでのスクリプトをそのまま使っています。このツールは、それらを呼び出して、結果を見せるだけです。

使い方

  1. ツールを起動する:data_hub\start.bat を実行します。ブラウザが開き、画面が表示されます(アドレスは http://127.0.0.1:8765/)。終了するときは、黒いウィンドウを閉じます。
  2. 「データ取得」で実行する:毎日の更新は「日次セット」、遡って取りたいときは「期間指定の一括取得」(開始日と終了日を入れる)を押します。
  3. 取得済みの期間を確かめる:「取得済みデータ」の一覧に、データごとの取得済みの期間と件数が出ます。
  4. 実行ログで経過を見る:画面の下に、各処理の状態・経過時間・最新の1行が出ます。行を押すと出力の全文が開きます。失敗した行は自動で開きます。
  5. 「品質チェック」で点検する:画面の中ほどの「品質チェック」で、各カードの「チェックする」、または「すべて実行」を押し、結果の一覧を見ます。

画面は1枚で、モードの切り替えはありません。上から「データ取得」「取得済みデータ」「品質チェック」「実行ログ」の順に並びます。

実行できるのは一度に1件です。実行中は、ほかのボタンが押せなくなります。

まとめて実行

セット 内容
日次セット 適時開示 → (個別株・ニュース・決算短信・決算発表予定・有報インデックスを並行して)→ マクロ指標 → 銘柄検出の事前計算。「最後にR2へバックアップ」にチェックすると、終わりにクラウドへ差分を送る
期間指定の一括取得 開始日〜終了日の、適時開示と決算短信

日次セットは、順番に意味があるので段階に分けて実行します。決算短信の取得は、先に保存した適時開示の一覧を読むため、適時開示を最初に済ませます。取得先が別々のもの(株価・ニュース・決算短信・有報インデックスなど)は、同時に動かして時間を縮めます。ただし、個別株とマクロ指標はどちらも yfinance から取るので、同時には動かさず、個別株のあとにマクロ指標を取ります(理由は「株価の取得は、速さより yfinance への配慮を優先した」)。

取得済みデータの一覧

「取得済みデータ」には、データごとに取得済みの期間と件数が出ます(例:「2023-10-10 〜 2026-10-07(2595 銘柄)」)。「どこまで貯まっているか」を、取る前に確かめられます。表示するのは、個別株・マクロ指標・適時開示・ニュース・決算発表予定・決算短信・有報インデックス・有報XBRLの8つです。

画面からは、データの種類ごとに取得するボタンを外しました。取得は、日次セットと期間指定の一括取得の2つに絞っています。日次セットが、毎日必要なデータをひととおり取るためです。画面にないものは、これまでのスクリプトを直接実行します。

やりたいこと 実行するもの
セクター別の一覧の作り直し `ingest
ebuild_sectors.bat`
有報XBRL(有価証券報告書のZIP)の取得 python ingest/fetch_edinet_xbrl.py
朝にマクロ指標とニュースだけ取る `ingest
un_morning.bat`

品質チェック

取得したデータが使える状態かを点検します。結果は「問題なし」「要確認」「NG」「参考」で示します。

チェック 何を見るか 判定の基準
株価・マクロの検証 データの遅れ、終値の欠損、株式分割の取り込み漏れの疑い 最新日が基準営業日より5日超遅れ → 要確認。終値が空 → 要確認。前日比が約0.55倍以下/1.8倍以上 → 参考(分割・統合の疑い)
ニュース・開示の日付抜け ニュースと適時開示の日次ファイルに、営業日なのに無い日がないか 直近60日の営業日で、ファイルが無い日を数える

「株式分割の疑い」は、株価の取り込みで特に厄介な点を拾うためのものです。株価データは通常、分割後の値に補正されて届きますが、補正が漏れると、ある日を境に株価が半分や倍になった偽の急変が混ざります。分析の結果を歪めるので、早めに見つけられるようにしました。

決算短信の点検(主要指標が空のJSON、銘柄ごとの収集状況)は、画面から外しました。結果が実行ログにしか出ず、予想値の欠損は短信の仕様によるものも多くて、判断に使いにくかったためです。必要なときは、python ingest/check_statements.py --latest と python tools/check_statements_status.py を直接実行します。

チェック結果の読み方:日付抜けのチェックは、祝日を営業日として数えます。「なし」と出た日が祝日なら、異常ではありません。データが本当に欠けているかは、その日が開場日だったかと合わせて判断します。

ショートカット

キー 動作
Alt+D 日次セットを実行
Alt+L 実行ログの開閉
Esc 使い方の説明を閉じる

全体の構成

ブラウザ(画面)
   │  取得・チェックの指示 / 状況の問い合わせ(数秒ごと)
   ▼
data_hub/server.py   ← FastAPI(このパソコンの 127.0.0.1 だけで待ち受け)
   │
   ├─ catalog.py … 取得メニューの定義、取得済み期間の集計
   ├─ quality.py … 品質チェック(株価・日付抜け)
   └─ app/lib/fetch_jobs.py … 取得の実行役(別のプロセスとして起動し、出力を1行ずつ記録)
          │
          ▼
   ingest/ のスクリプト群(取得・変換) → data/ に保存
  • 画面:ビルド工程のない素のHTML / CSS / JavaScript です。見た目は、サイドノート作成ツールと同じ配色(明るいグレーの背景、白いカード、ダークのボタン)に揃えました。
  • サーバー:FastAPI の小さなサーバーです。画面に渡すのは、取得メニュー、取得済み期間、実行の状況、チェック結果だけです。
  • 取得の実行:各スクリプトは、別プロセスとして起動します。出力は1行ずつ受け取って記録し、画面が問い合わせたときに最新の状況を返します。画面を開き直しても、動いている取得は止まりません。
  • 取得ロジック:ingest/ のスクリプトを呼ぶだけです。夕方のバッチ(run_evening.bat)や、タスクスケジューラの定時実行も、そのまま使えます。

実行の安全策

  • 同時に動かすのは1件です。取得が重なって、同じファイルを同時に書き換えるのを防ぎます。実行中に別の取得を求めると、サーバー側でも断ります。
  • 品質チェックは読み取り専用です。株価やニュースのファイルを開いて調べるだけで、書き換えません。
  • 待ち受けは 127.0.0.1(このパソコン自身)に限っています。同じネットワークの他の機器からは使えません。

作るうえで判断したこと

Streamlit から、独立したアプリに分けた

以前は、分析用の Streamlit アプリの1ページに取得の画面を置いていました。分析と取得は役割が違うので、取得を独立させました。

  • 取得は、画面を再描画するたびにスクリプトが走り直す Streamlit と相性がよくありません。取得中にページを移ると、画面から結果が消えるといった不便がありました。
  • 取得の画面は、分析アプリを立ち上げなくても開けるほうが、毎日の作業に向きます。

分析アプリ側のメニューからは「データ取得」を外し、取得は新しいツールに一本化しました。

取得の中身は、書き直さなかった

動いている取得スクリプトを作り直すと、データの形が変わったり、これまでの運用が崩れたりするおそれがあります。画面だけを新しくし、取得は既存のスクリプトを呼ぶ形にしました。例外は株価の取得で、yfinance への配慮のために中身を見直しました(次の項目)。保存するファイルの形は変えていません。

株価の取得は、速さより yfinance への配慮を優先した

株価は yfinance から取っています。yfinance は無料で公開されている仕組みで、Yahoo の公式なAPIではありません。短い時間に多くの要求を送ると相手に負担をかけますし、制限を受けて取得できなくなるおそれもあります。まとめて取ったり並列に動かしたりすれば速くできますが、時間がかかっても、相手に負担をかけない取り方を選びました。

  • 1銘柄ずつ順番に取り、1回ごとに0.5秒あける:一括取得や並列化はしません。他の取得スクリプト(適時開示やEDINET)と同じ水準の間隔です。
  • 日足は、増えた分だけ取る:以前は毎日、全銘柄の3年分(約750日分)を取り直していました。今は、手元のファイルの最終日の少し前から当日までだけを要求し、手元のデータに継ぎ足します。1回の要求で受け取るデータは、数百分の一になりました。
  • 補正があった銘柄だけ、全期間を取り直す:株式分割や配当があると、過去の株価もさかのぼって補正されます。継ぎ足しのときに、手元のデータと重なる日の終値を見比べ、ずれていればその銘柄だけ3年分を取り直します。補正前と補正後の値が混ざるのを防ぎます。
  • 制限を受けたら、長めに待つ:レート制限を受けたときは2分待って、1回だけ取り直します。上場廃止などでデータが無い銘柄は、取り直しません(無駄な要求を増やさないため)。取れなかった銘柄は、最後にまとめて実行ログに出します。
  • 個別株とマクロ指標を同時に動かさない:どちらも yfinance なので、日次セットでは順番に実行します。

そのぶん、取得には時間がかかります。個別株は日足と5分足を合わせて約4,200回の要求があり、間隔をあけるだけで30分以上増えます。毎日の更新は夕方の定時バッチで自動に回すので、待ち時間よりも、相手に迷惑をかけずに長く使い続けられることを優先しました。

公開せず、自分のパソコンだけで動かす

取得には、株価や開示の取得・ファイルへの書き込みが必要です。静的なサイトとして公開する形(ブラウザだけで完結するツール)には向きません。さらに、データの提供元の利用条件上、取得したデータそのものは公開しません。そのため、ローカルのWebアプリにしています。

品質チェックを、取得と同じ画面に置いた

取得して終わりにせず、「ちゃんと取れているか」をすぐ確かめられるようにしました。分析で数字がおかしいと気づいてから原因をたどるより、取得の直後に異常を見つけるほうが、修正が簡単です。

できないこと・注意点

  • 実行中の取得を、画面から止める機能はありません。止めたいときは、起動した黒いウィンドウを閉じます。
  • 実行ログは、サーバーを止めると消えます。残したい場合は、定時バッチのログ(logs/)を使います。
  • Windows が前提です。R2バックアップは、別途 rclone の設定が必要です。
  • 日付抜けのチェックは、祝日を考慮していません(上記)。
  • データの提供元の仕様が変わると、取得が失敗したり、0件になったりすることがあります。実行ログで、各取得元の件数を確認してください。