決算・株価データ検証
無料で手に入る株価・決算短信・有価証券報告書をもとに、元売株・資源株を分析した連載記事のサイトです。取得、決算データでの分析、機械学習の3部と番外編で、18本の記事と用語集があります。静的サイトジェネレーターの Zensical で作り、GitHub Pages で公開しています。サーバーもデータベースもありません。
このページは、記事の中身(分析の内容)ではなく、図とコードと記事をどうつないで作ったかの解説です。記事のもとになるデータの取得は株価データ取得ツール、有価証券報告書を探して比べる姉妹サイトは有報ナビ、見た目の考え方はウェブサイトデザインにあります。
全体の構成
記事のサイトと、分析のコードを、別のリポジトリに分けています。
| 置き場所 | 中身 |
|---|---|
kessan-kabuka(サイト) |
記事の Markdown、図(PNG)、用語集、共通デザイン。公開されるのはここだけです |
blog(分析コード) |
記事ごとのフォルダ。図を作る Python スクリプト、サムネイルを作るスクリプト、1-1〜2-2 の Streamlit アプリ |
自分のパソコンの data/ |
株価・決算・有報のデータ。再配布できないので、どこにも公開しません |
記事 2-3 の例
データ(自分のパソコン) ──► blog/02-03_accrual/06_accrual_make_images.py
│ 図(PNG)を書き出す
▼
kessan-kabuka/docs/posts/img/02-03_accrual_analysis/*.png ◄── 記事の Markdown が参照
│ git push
▼
GitHub Actions が Zensical でビルド → GitHub Pages
記事の図は、手で作った画像ではなく、スクリプトで生成した画像です。数値を直したいときは、スクリプトを直して実行し直せば、図がすべて作り直されます。
図の文字サイズを、記事をまたいでそろえる
連載では100枚を超える図を載せています。図の幅がバラバラだと、記事に載せたときの縮小率が図ごとに変わり、グラフの中の文字の大きさが記事ごとにばらつきます。画面上の文字サイズは、次の式で決まるためです。
画面上の文字サイズ = 画像内の文字の大きさ(px) × (本文の幅 ÷ 画像の横px)
そこで、全スクリプトが共有する _blog_style.py で、図の幅を1つに固定しました。
- 幅は13インチ、解像度は144dpi(横1872px)に統一します。高さだけは図ごとに自由です
- 横に入り切らない内容は、図を広げず、行を増やすか列を減らして対応します。広げると、文字が相対的に小さくなるためです
- 保存は
savefig_uniformを通します。余白を切り詰めたあと、左右に白を均等に足して、横幅をちょうど1872pxにそろえます。切り詰めの揺れを、ここで吸収します - 切り詰めたあとの幅が1872pxを超えた図(軸の外にはみ出したラベルなど)は、比率を保って縮小し、警告を出します。その図だけ文字が少し小さくなるのを、見逃さないためです
色も、緑(健全)・赤みのある色(警戒)・青(純利益)・灰色(中立)と、意味を決めて使っています。サイトの見た目(紺と無彩色)と合うよう、強い色は避けました。
再現性:データの時点を固定する
図は、特定の日までに入手できたデータで作っています。各スクリプトの冒頭に基準日の定数があります。
AS_OF = "2026-05-31" # この日付以前のデータだけで図を作る
別の時点で作り直すなら、この値を変えて実行し直します。ただし、細かい決めごとがあります。
- 有報・決算短信は、会計期末ではなく提出日で切ります。 3月期末の会社でも、6月に提出された有報は、5月31日時点では存在しないデータです。期末で切ると、未来の情報が混ざります
- 5分足は、あとから取り直せません。 取得元が保持するのが約60日分なので、基準日に合わせた再生成ができません。日足は期間を指定して再現できます
- 対話型アプリ(1-1〜2-2)は、基準日を固定していません。 実行時に最新のデータを取るので、記事中の図と数値が一致しないことがあります
- CAR(累積異常リターン)は、5月末に近い決算の一部が未完了のまま載っています。 決算後20営業日の窓が、基準日までに埋まりきっていないためです
「いつのデータで作った図か」を、図の下の出典書きと、このリポジトリの README の両方に書いています。
記事の部品と体裁
記事のサイトは、Zensical の標準機能とCSSだけで作っています。記事で繰り返し使う部品は、次のとおりです。
| 部品 | 使いどころ |
|---|---|
keypoint |
式や結論を1行で強調する(例:アクルーアル比率の定義) |
fig-meta |
図の使用データ、「クリックで拡大」の注記 |
ref-card |
用語の外部の解説へのリンク。目立たない細枠にしています |
| 目次のカード | トップの記事一覧。部ごとの見出しの下に2列で並べます |
- 図の拡大は、プラグイン(glightbox)の代わりに、自前の小さなJS(
lightbox.js)にしています。Zensical は MkDocs のプラグインを読まないためです。本文の画像をクリックすると、全画面で拡大します - 見出しの装飾(
┃や│の縦棒)は、CSSの疑似要素で描いています。下線や罫線で区切らず、余白で区切る方針です - サムネイルは、記事ごとに
thumb.pyで生成します。紺の地に、連載の番号と題名、中身を示す小さな図を置きます。Xで共有したときのカード画像にもなります - 用語集は、記事で出てくる財務・会計・機械学習の用語を、50音順に平易に解説したページです。専門用語に詰まった読者が、記事から戻れる場所にしています
公開の仕組み
公開は、リポジトリの main に push するだけです。GitHub Actions がサイトをビルドして、GitHub Pages に置きます。deploy.bat が、その前後の手間を引き受けます。
- ビルドの確認:手元で Zensical のビルドを通します。失敗したら、push せずに止まります
- push:新しいコミットがあるときだけ送ります。失敗したら最大3回まで、2回目からは HTTP/1.1 に切り替えて再試行します(ネットワークの一時的な不調対策)
- 公開の完了待ち:
wait_deploy.ps1が GitHub の実行状況を見て、成功・失敗を知らせます。GitHub Pages は、最後の段階で止まることがあります。240秒たっても終わらなければ、実行を取り消して自動で1回やり直します。そのあいだも、前の版のサイトは見え続けます
ビルドに使うパッケージは、すべてバージョンを固定しています(pip freeze の結果)。手元で確認したものと、GitHub が作るものが、同じになります。Actions の実行環境(Ubuntu)も、バージョンを固定しています。
個人情報の混入を、自動で検出する
push のたびに、privacy-check が走ります。次のものがリポジトリに入っていないかを調べ、見つかれば失敗にします。
- ユーザー名や、ユーザーフォルダーの絶対パス(
C:\Users\…) __pycache__や.pyc(実行すると絶対パスが埋め込まれる、自動生成のファイル)
図を作るスクリプトは、自分のパソコンの絶対パスを使って書かれるため、公開するコードに紛れ込みやすいからです。気づかずに公開するのを、人の注意ではなく、仕組みで防いでいます。
作るうえで判断したこと
コードとデータは分けて、データは載せない
株価・決算・有報のデータは、提供元の規約で再配布できません。そのため、公開するのはコードだけで、データの取得方法は各フォルダの README に書いています。読者は、自分で取得して同じ手順をたどれます。
プラグインやフックに頼らない
最初の版は、MkDocs のフック(記事ページだけに体裁のクラスを付ける)に頼っていました。Zensical はフックを読まないので、記事のサイト全体に同じCSSを当てる作りに変えました。トップと記事で別々の見た目にしたいときは、ページ側の目印で分けます。
整理中の記事は、公開しない
番外編の2本(5分足の超短期の検証)は、ソースにありますが、exclude_docs で公開から外しています。整理がついたら、ナビと一覧に戻します。ファイルを消すのではなく、「公開しない」だけを設定で切り替えているので、あとから戻すのが簡単です。
tomo から切り出した
この連載は、もともとこのサイト(tomo)の中にありました。記事が増えたため、2026年10月11日に別のサイトとして分けました。旧URLからの転送ページは、しばらく置いたあとに削除しました。
限界と使うときの注意
- 分析コードは、そのままでは動きません。 図を作るスクリプトは、自分のパソコンのフォルダ構成(データの置き場所)に依存しています。別の環境で動かすには、データの読み込み部分を書き換える必要があります
- データは載せていません。 再現するには、各自で取得してください
- 図は静止画です。 拡大はできますが、数値にマウスを乗せて読んだり、条件を変えたりはできません。条件を変えて探せるものは、姉妹サイトの有報ナビにあります
- これは投資の助言ではありません。 検証は学習・参考用です。投資判断は、自己責任でお願いします
更新
- 2026年10月11日:tomo から別サイトとして分離