1. 出発点:四半期の財務と毎日の株価を分ける
最初に決めたのは、データの役割分担です。証券会社のスクリーニング機能でCSV出力できる「決算でしか変わらない財務項目」と、Python側で株価APIから毎日取り直す「株価で日々動く項目」を、はっきり分けました。
2. 制約から生まれた設計:CSVの分割と「1指標1ファイル」
証券会社のスクリーニングCSVには、現実的な制約が2つありました。- 一度に出力できる項目数に上限がある(10項目程度)
- 複数指標を指定すると AND 検索になる=そのすべてを持つ銘柄しか出てこない
設計の合言葉:「補助データの欠損を理由に、銘柄を母集団から落とさない」。予想やレア指標が無い銘柄は「情報なし」として残し、除外はしない。
3. 「除外」と「順位付け」をはっきり分ける
スコアリングでよくある失敗は、足切り条件とランキングを混ぜてしまうことです。総合点だけで並べると、ひとつの致命的な弱点を高い別の点数が打ち消して、危険な銘柄が上位に紛れ込みます。逆に条件を厳しくしすぎると、良い銘柄がたった1つの欠点で母集団から消えます。 そこで処理を5段に分け、「除外(足切り)」と「順位付け(加重スコア)」を独立させました。
4. ここが本当に危ない:「凍結されたseed」問題
財務データは四半期に一度しか更新されない「seed(種データ)」として保持し、株価だけが毎日動きます。すると、ある銘柄に悪材料が出て株価が急落したとき、システムから見ると「財務は優良なまま、PERだけが下がった割安な銘柄」に見えてしまうのです。
- 株式分割の静かな破壊:株価APIの株価は分割を遡及調整しますが、seed側の株価・EPSは取得時のまま。分割が起きると「当日株価 ÷ seed株価」の比率が一夜にして半分などに飛び、PERや配当利回りが倍・半分に化けます。エラーは出ず、そのままランキングに乗ります。
- 予想データの陳腐化:業績の下方修正やコンセンサス改定は決算と同期せず、いつでも起きます。そしてそれが起きた瞬間こそ、投資判断にとって最も重要な情報なのに、seedは黙ってそれを無視します。
5. 防御をどう設計に織り込んだか
これらは「気をつける」では防げません。仕組みとして埋め込む必要があります。実装した防御は次の通りです。- seed鮮度の常時表示:レポートの先頭に「財務データの取得日」と「経過日数」を必ず出し、一定日数を超えたら再取得を促す警告を出す。
- 株価比率の異常検知:当日株価とseed株価の比率が一定レンジを外れた銘柄は、株式分割などの疑いとみなし、その銘柄の補正指標(PER・PBR・配当利回りなど)を無効化して評価対象から外す。次のデータ再取得で自動的に復帰する。
- 「正常な顔をした劣化」を止める:株価APIが障害やレート制限で大量に欠損した日でも、欠損を中立点で埋めてしまうと「見た目は正常なのに中身が空っぽのランキング」が静かに出力されます。これを防ぐため、株価データの取得率が一定を下回ったら処理を中断するfail-fastを入れました。
- カットライン上のバタつき防止(ヒステリシス):財務が四半期固定なので、日々のスコア変動の大半は株価ノイズです。上位十数銘柄をちょうどで切ると、ボーダーの銘柄が毎日出たり入ったりして、往復の売買コストだけがかさみます。そこで「新規組入れは上位枠の内側に入ったときだけ、既存銘柄は少し外れても保持」という不感帯を設けました。
- 業種の集中を抑える:財務健全性で絞ると、ある業種に偏りがちです。同一業種の組入れ数に上限を設け、分散効果が幻にならないようにしています。
6. いちばん大事な仕組み:仮説を「測る」
ファクターの重み付けも、各種のしきい値も、結局はすべて仮説です。「クオリティを厚めに」「RSIはこのへんで売られすぎ」——どれも作った時点では正しいかどうか分かりません。 そこで、毎日の推奨結果を記録に残し、その後のリターンを市場平均(TOPIX)と比べる検証ループを回しています。推奨した銘柄群が、数日後・数週間後に指数をどれだけ上回ったか/下回ったかを自動で計測する。これがないと、設定をいじっても「良くなったのか悪くなったのか」が永遠に分かりません。検証ループがないチューニングは、目隠しでダーツを投げるのと同じ。まず計測の土台を作り、それから重みを調整する。これが順序として何より大事でした。
まとめ:この設計から得た教訓
- 時間軸の違うデータは、役割を分けて扱う。四半期の財務と毎日の株価を同じ箱に入れない。
- 制約は設計を導く。CSVの項目上限とAND検索という制約が、「1指標1ファイル+左結合」というきれいな構造を生んだ。
- 除外と順位付けを混ぜない。足切りとスコアリングは別の仕事。
- 自分の設計のいちばん危ない部分を、自分で言語化する。「凍結されたseed」のように、便利な前提ほど静かに牙をむく。
- 仮説は必ず測る。検証ループのないスコアリングは、ただの自己満足になりやすい。
※ 本記事は個人が趣味で作っているツールの設計記録であり、特定銘柄の推奨や投資勧誘ではありません。投資判断はご自身の責任で行ってください。

コメント