株価データ取得ツール
株価・適時開示・ニュース・決算短信・有価証券報告書の取得と、取得したデータの品質チェックを、ひとつの画面にまとめたツール「株価データ取得ツール」の解説です。「株価分析」(決算短信・有価証券報告書・株価データを使った検証)の元になるデータを、毎日きちんと貯めるために作りました。
- 決算・株価データ検証:記事の一覧
- 動作環境: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/ ほか |
取得のたびにスクリプトを個別に呼び、ログを見て、抜けや遅れを目で確かめるのは手間がかかります。そこで、押すだけで取得でき、取得済みの期間と実行ログが見え、データの異常も点検できる画面にまとめました。
取得の中身(どこから、どう取るか)は、これまでのスクリプトをそのまま使っています。このツールは、それらを呼び出して、結果を見せるだけです。
使い方
- ツールを起動する:
data_hub\start.batを実行します。ブラウザが開き、画面が表示されます(アドレスはhttp://127.0.0.1:8765/)。終了するときは、黒いウィンドウを閉じます。 - 「データ取得」で実行する:毎日の更新は「日次セット」、遡って取りたいときは「期間指定の一括取得」(開始日と終了日を入れる)を押します。
- 取得済みの期間を確かめる:「取得済みデータ」の一覧に、データごとの取得済みの期間と件数が出ます。
- 実行ログで経過を見る:画面の下に、各処理の状態・経過時間・最新の1行が出ます。行を押すと出力の全文が開きます。失敗した行は自動で開きます。
- 「品質チェック」で点検する:画面の中ほどの「品質チェック」で、各カードの「チェックする」、または「すべて実行」を押し、結果の一覧を見ます。
画面は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件になったりすることがあります。実行ログで、各取得元の件数を確認してください。