Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

156
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code Skills で株スクリーニングを自動化した話【Python × yfinance × バイブコーディング】

156
Posted at

なぜ投資分析の自動化が必要だったのか

Claude Code Skills と yfinance を使って、株式スクリーニングからポートフォリオ管理まで投資分析を自動化するシステムを作りました。Python × バイブコーディングで、個人投資家の投資ワークフロー全体を5つのスキルでカバーしています。

個人投資家として日本株や米国株を触っていると、「割安な銘柄を探す」という作業が地味に面倒です。証券会社のスクリーナーでフィルタして、出てきた銘柄を一つずつ確認して、ポートフォリオ全体のバランスを考えて――この繰り返しを何とかしたいと思っていました。

ChatGPT や Claude の Web 版に「割安株を探して」と頼めば、ある程度のことはやってくれます。ただ、投資判断のワークフローに組み込もうとすると、4つの壁にぶつかりました。

  • レスポンスとソースの不安定さ ── Web検索で1銘柄数十秒、参照記事も毎回変わり定点観測に使えない
  • コンテキストの消失 ── 先週のスクリーニング結果も売買根拠も、次のセッションでは忘れ去られている
  • 再現性の欠如 ── セッションごとにPERの閾値やスコアリングが微妙に変わる。再現性のない仕組みで投資判断は積み重ねられない
  • 処理量の壁 ── 10銘柄のヘルスチェックを頼んでも3〜4銘柄で出力が途切れる。全銘柄を漏れなくチェックすることに意味があるのに

Claude Code の Skills はこの4つの問題をすべて解決しました。

  • レスポンスと情報ソース → ロジックを Python スクリプトに固定し、yfinance API で統一的にデータを取得。毎回同じソースから同じ方法でデータを取る。
  • コンテキスト消失 → ポートフォリオは CSV、閾値は YAML、設計判断は CLAUDE.md に永続化。セッションをまたいでも文脈が引き継がれる。
  • 再現性 → スクリーニングロジックがスクリプトとして固定されているので、同じ入力に対して同じ処理が走る。
  • 処理量 → LLM の出力トークンではなく Python プロセスとして実行されるため、制約なし。東証の全上場銘柄(プライム・スタンダード・グロース合わせて約1,000〜2,000銘柄)を一括スクリーニングしても数十秒で完了。

最初はスクリーニングだけのつもりでした。それが「レポートも欲しい」「ポートフォリオの管理も」「ヘルスチェックも」「ストレステストも」と膨らんでいき、気がつけば5つのスキルからなるシステムになっていました。

本記事では、このシステムのアプローチと設計思想、技術選定の判断を中心に紹介します。

Claude Code Skills とは

Claude Code にはスラッシュコマンドを自作できる Skills という仕組みがあります。スキル定義ファイル(SKILL.md)にスキルの名前・説明・引数ルール・許可するツールを書いておくと、Claude が自然言語の入力を解釈してスクリプトを実行してくれます。

ポイントは、ユーザーは自然言語で話しかけるだけでいい ということです。スラッシュコマンドすら打つ必要はありません。Claude はユーザーの意図を理解して、適切なスキルを自動で選択し実行してくれます。

例えば「日本株で高配当のやつを探して」と普通に話しかけると、Claude が文脈からスクリーニングスキルを判断し、地域やプリセットを適切に設定してスクリプトを実行する。「ポートフォリオの調子はどう?」と聞けばヘルスチェックが走る。「トヨタのレポートを見せて」と言えば個別銘柄レポートが生成される。

つまり Skills は「コマンドラインツール」ではなく、Claude が状況に応じて使い分ける道具箱 です。ユーザーはコマンド体系を覚える必要がなく、投資の文脈で自然に会話するだけで、裏側で適切なスクリプトが動く。この「自然言語 → スキル選択 → スクリプト実行 → 結果の解釈」という一連の流れは、まさにバイブコーディングの体験そのものであり、従来の CLI ツールとの決定的な違いです。

もう一つ重要なのが 再現性 です。ロジックが Python スクリプトとして固定されているため、今日と先月のスクリーニングが同じ基準で実行されていることが保証されます。

投資分析を自動化する5つの Skills

今回作ったスキルは5つです。

# スキル 役割
1 スクリーニング 割安株の検索(4エンジン、7プリセット、yfinance EquityQuery の60+取引所に対応)
2 個別レポート ティッカー指定で財務分析レポートを生成
3 ポートフォリオ管理 売買記録・損益表示・構造分析・ヘルスチェック・推定利回り・リバランス提案
4 ストレステスト 8シナリオでポートフォリオの弱点を検証(集中度・相関・VaR)
5 ウォッチリスト 気になる銘柄のリスト管理

「スクリーニングで銘柄を見つける → レポートで詳細確認 → ウォッチリストに登録 → ポートフォリオで売買記録 → ヘルスチェックで継続監視 → ストレステストでリスク把握」という投資ワークフローの全体をカバーしています。

システム設計:3層アーキテクチャとデータ永続化

3層に分けた理由

システムは Skills 層(インターフェース)→ Core 層(ビジネスロジック)→ Data 層(データ取得) の3層に分離しています。

  • Skills 層 はインターフェースのみ。引数を解釈してスクリプトを呼び出すだけの薄いレイヤーです。
  • Core 層 にビジネスロジックを集約。スクリーニングエンジン、スコアリング、ヘルスチェック、シナリオ分析など17モジュールを配置し、5つのスキル間でロジックを共有しています。例えば「変化スコア」の計算ロジックは、スクリーニング(アルファプリセット)とヘルスチェックの両方から呼ばれています。
  • Data 層 はデータ取得を一元化。yfinance を直接呼ばず、必ずラッパー経由にすることで、キャッシュ(24時間TTL)・レート制限(API間1秒ディレイ)・異常値サニタイズ(配当利回り>15%や PBR<0.1 等の除外)を統一しています。

この分離により、「新しいスキルを追加する」ときにはCoreのロジックを再利用でき、「データソースを変更する」ときにはData層だけを差し替えればよい設計になっています。

データの永続化戦略

Web版の「コンテキストが消える」問題に対して、3種類のデータを適切な形式で永続化しています。

データ 形式 理由
ポートフォリオ(保有銘柄・売買履歴) CSV 人間が直接編集・確認しやすい
スクリーニング閾値・取引所定義 YAML 構造化された設定を可読性高く管理
設計判断・アーキテクチャ CLAUDE.md Claude Code が新しいセッションでもプロジェクト文脈を理解できる
銘柄データキャッシュ JSON APIレスポンスをそのまま保存(24時間TTL)

特に CLAUDE.md は重要で、スクリーニングエンジンの動作仕様、ETF判定のルール、データ取得パターンまで詳細に記述しています。これにより、新しいセッションで Claude Code を開いても、プロジェクトの文脈を理解した状態で開発を続けられます。

技術選定とロジック

データソース:yfinance

このシステムの土台は yfinance(Yahoo Finance の Python ライブラリ)です。無料かつ API キー不要で、個人投資家が必要とするデータのほとんどを取得できます。

データ種別 取得できるもの 活用先
株価・バリュエーション PER(株価収益率), PBR(株価純資産倍率), 配当利回り, 時価総額, 52週高値/安値 スクリーニング、レポート
財務諸表 損益計算書, 貸借対照表, キャッシュフロー計算書 変化スコア(アルファ)、ヘルスチェック
アナリストコンセンサス 目標株価(High/Mean/Low), レーティング, アナリスト数 推定利回り(3シナリオ)
価格ヒストリー 日次/週次/月次 OHLCV(最大数十年分) テクニカル分析、VaR、相関分析
ニュース 公式メディアのニュース記事(タイトル・URL・要約) 推定利回りの定性情報
EquityQuery 条件指定で銘柄をバルク検索(yfinance 側で60+取引所対応) スクリーニング(全市場一括)

特に EquityQuery が強力で、「PER < 15 かつ配当利回り > 3% かつ東証上場」のような条件を投げると、該当する銘柄を一括で返してくれます。銘柄リストを事前に用意する必要がないため、東証のプライム・スタンダード・グロース全銘柄を漏れなくスクリーニングできます。これが Web 版で1銘柄ずつ調べていた体験との最大の差です。

yfinance は無料で使える反面、データの癖(ETFの売上履歴が空リストで返る、配当利回りがパーセント値で返ることがある等)があるため、Data 層で異常値サニタイズを統一的に行う設計にしています。

スクリーニング:4つのエンジン

スクリーニングには目的に応じた4つのエンジンを用意しました。

エンジン アプローチ 用途
QueryScreener yfinance の EquityQuery API でバルク取得 → バリュースコアでランキング 基本的な割安株検索(value, high-dividend 等5プリセット)
PullbackScreener EquityQuery → RSI/ボリンジャーバンドで押し目判定 → バリュースコア 上昇トレンド中の一時調整にエントリーしたい場合
AlphaScreener EquityQuery(足切り) → 変化スコア(3/4指標) → 押し目判定 → 2軸スコア 割安かつ業績改善の兆しがある銘柄(4段パイプライン)
ValueScreener 銘柄リストを1件ずつ取得 → フィルタ → スコア レガシー方式(互換性のために残存)

バリュースコアは PER(25点) + PBR(25点) + 配当利回り(20点) + ROE(15点) + 売上成長率(15点) = 100点満点 の配分です。各指標を0〜満点の範囲でスコアリングし、合算してランキングします。

AlphaScreener の「変化スコア」は、アクルーアルズ(利益の質)・売上加速度・FCFマージン変化・ROE趨勢の4指標で「業績が良い方向に変化しているか」を定量化します。割安であることに加えて、変化の方向性を見ることで「割安なまま放置される罠(バリュートラップ)」を回避するアプローチです。

ヘルスチェック:テクニカル × ファンダの2軸判定

保有銘柄の「投資仮説がまだ有効か」を判定するヘルスチェックは、3段階のアラートシステムです。

アラート テクニカル条件 ファンダメンタル条件 アクション
早期警告 SMA50割れ / RSI急落 注視
注意 SMA50がSMA200に接近 変化スコア1指標悪化 一部利確検討
撤退 デッドクロス 変化スコア複数悪化 撤退検討

設計上の重要な判断として、撤退シグナルにはテクニカル崩壊とファンダ悪化の両方を要求 しています。デッドクロスしていてもファンダが良好なら「注意」止まり。一時的な需給の崩れだけで売りシグナルを出すと過剰反応になるため、両面からの裏付けを条件にしています。

ETF(金ETF、債券ETFなど)はファンダメンタル分析の対象外として自動判定し、テクニカルのみで評価します。

推定利回り:アナリストコンセンサス + 過去リターン

楽観 / ベース / 悲観の3シナリオで12ヶ月先の期待リターンを提示します。個別株とETFでアプローチを分けています。

個別株 は yfinance から取得できるアナリスト目標株価(High / Mean / Low)を使います。アナリスト数が少ない場合(3名未満)はターゲット価格のスプレッドが狭くなりがちなので、自動的にスプレッドを拡張して3シナリオを分離させます。

ETF はアナリストカバレッジがないため、過去2年間の月次リターンからCAGR(複利年率成長率)を算出し、標準偏差でシナリオを分岐させます。キャップを設けることで、異常値による過大評価を防いでいます。

さらに、yfinance の公式ニュースと、Grok API(X Search)によるSNSセンチメント分析をオプションで付加します。Grok API は環境変数が未設定の場合はスキップされる設計(Graceful degradation)にしています。

ストレステスト:シナリオベースのリスク分析

8つの事前定義シナリオ(トリプル安、テック暴落、円高ドル安など)でポートフォリオの弱点を検証します。

分析はパイプラインで構造化しています。集中度分析(HHI)→ ショック感応度 → シナリオ別インパクト推定 → 相関分析(ピアソン相関 + マクロ因子分解)→ VaR(95%/99%)→ 因果連鎖分析 → 推奨アクション、という流れです。

技術的なポイントとして、ETFは資産クラス(金・長期債・株式インカム等)に自動分類し、シナリオごとに適切なインパクト係数を適用しています。例えば「トリプル安」シナリオでは金ETFはヘッジとして機能し、株式とは逆方向のインパクトが計算されます。

推奨アクションはルールベースで自動生成し、Claude がポートフォリオの文脈を踏まえて補足説明を加えます。定量分析(計算)と定性分析(LLMの解釈)を分離して、それぞれの強みを活かす設計です。

個別レポートはティッカー指定で財務サマリーを生成する機能、ウォッチリストは気になる銘柄を JSON で永続管理する機能です。いずれもシンプルな補助スキルですが、スクリーニング→レポート確認→ウォッチリスト登録という流れをつなぐ役割を果たしています。

ポートフォリオのスナップショット機能では、保有銘柄の現在評価額と損益を一覧できます。

Agents / Teams:並列で探す、並列で検証する

Claude Code には複数のエージェントをチームとして並列起動する Teams 機能があります。これがスクリーニングシステムとの相性が抜群でした。

スクリーニングの並列化

「日本・米国・ASEAN・香港の4地域で割安株を同時に探したい」とき、逐次実行だと各地域30秒〜1分かかり、合計で数分待つことになります。Teams を使えば、4つのエージェントがそれぞれ別の地域を同時に探索し、結果を集約して返してくれます。

1エージェントが順番に処理するのと比べて、壁時計時間は 1/N に近づきます。yfinance の60以上の取引所に対応しているシステムだからこそ、この並列化の恩恵は大きい。yfinance 経由でアナリストのコンセンサス情報(目標株価・レーティング・アナリスト数)も取得できるので、「世界中の割安株を同時に探して、コンセンサス目標との乖離が大きい順に並べて」という網羅的な探索が現実的になります。

総合試験の並列化

同じ仕組みを品質管理にも活用しました。4つのテスターエージェントを並列起動して、全スキルの統合テストを一斉に実行しました。

  • スクリーニングテスター → 4パターン(日本バリュー、米国高配当、日本アルファ、米国押し目)
  • レポートテスター → レポート4パターン + ウォッチリストCRUD 6パターン
  • ポートフォリオテスター → 5サブコマンド(list, snapshot, analyze, health, forecast)
  • ストレステスター → 4パターン(混合、シナリオ指定、ETFのみ、ウェイト指定)

結果は 23テスト全PASS。テストの中で2つの軽微なバグが見つかり、Linear に自動起票しました。

開発のリアル

ハマったポイント

Skills で動くものを作る上で、実際にハマったポイントを紹介します。いずれも yfinance のデータの癖に起因するものでした。

ETF判定の落とし穴。 ETFをヘルスチェックの対象外にする判定ロジックで、yfinance がETFの売上履歴に「空リスト」を返すことに気づかず、ETFを個別株と誤判定していました。is not None ではなく bool() による truthiness チェックに切り替えて解決。外部APIの返り値が「データなし」をどう表現するかは、ドキュメントだけでは分からないことが多い教訓でした。

ETFリターンの年率換算。 月次リターンの中央値を単純に12倍する単利計算だと、金ETFの推定リターンが +86% になるという明らかな過大評価が発生。CAGR(複利年率)に修正し、さらに取得期間を6ヶ月→2年に拡大することで安定した推定値を得られるようにしました。

アナリスト少数時のシナリオ崩壊。 アナリストが2名以下の銘柄では、目標株価の High / Mean / Low が全て同じ値になり、3シナリオが意味をなさなくなる問題。少数時は自動的にスプレッドを付与して分岐させるようにしました。

バイブコーディングの開発フロー

iTerm 複数窓 × worktree で並列開発。 実際の開発では、iTerm2 のウィンドウを役割ごとに分けて同時並行で作業しています。

  • PdM 窓 ── Linear で Issue を作成し、完了した実装をレビューして、問題があればフィードバックを返す。プロダクトマネジメントの役割
  • 開発窓 ── feature ブランチで実装を進める。Claude Code と会話しながらコードを書く
  • テスト窓 ── テスト実行や動作確認を行う

Claude Code はターミナルベースなので、この「複数窓で同時に Claude と会話する」スタイルと自然に噛み合います。PdM 窓で Issue を切って要件を整理し、開発窓の Claude に実装を任せ、完了したら PdM 窓でレビューしてフィードバックする――まさに バイブコーディング です。自分はやりたいことを自然言語で伝えるだけで、AI が設計・実装・テストを回してくれる。一人で回すアジャイルのような開発フローが成立します。

さらに git worktree を使えば、同じリポジトリの別ブランチを別ディレクトリとしてチェックアウトできるので、一方の窓で feature ブランチの開発を進めながら、もう一方の窓で main ブランチのテストを回すことも可能です。Issue ごとに worktree を切って、開発・テスト・マージを独立して進められるのは、個人開発でもかなり効率が上がりました。

Linear 連携。 Claude Code の MCP(Model Context Protocol)で Linear に接続し、PdM 窓から直接 Issue の作成・更新をしています。「バグだね」→ Issue 作成 → 開発窓で修正 → テスト → PdM 窓でレビュー → Done 更新、がすべてターミナル内で完結します。

ユニットテスト。 pytest で 740テスト以上 を維持しています。全テストが約20秒で完了するため、修正のたびに気軽に回せます。外部APIをモックしているので、ネットワーク不要で高速です。このユニットテストの存在が、安心してリファクタリングできる基盤になっています。Claude Code にコードの改善を任せても、テストが通れば既存の挙動が壊れていないことを即座に確認できる。AI に開発を任せるスタイルでは「任せて大丈夫か」という不安がつきまといますが、テストがその安全網になります。

Skills 開発で得た知見

1. SKILL.md は「インターフェース仕様書」として書く。 引数の解釈ルール、出力形式を明確に定義すると、Claude が正確にスクリプトを呼び出してくれます。曖昧な定義は曖昧な実行結果につながります。

2. ロジックはスキルの外に出す。 Skills のスクリプトはエントリーポイントに徹し、ビジネスロジックは別のモジュールに分離する。これにより、スキル間でロジックを共有でき、テストも書きやすくなります。

3. CLAUDE.md にアーキテクチャを書く。 Claude Code がコード修正時に参照するため、モジュール間の依存関係やデータフローを明記しておくと、修正の精度が上がります。

4. コンテキスト上限との付き合い方。 Claude Code でもセッションが長くなればコンテキストの上限には達します。対処の考え方は「知識の階層化」です。ロジック化できる部分は Python コードに落とし、ルールベースで整理できる部分は Skills の SKILL.md にまとめ、プロジェクト全体の設計判断は CLAUDE.md や Rules に書く。こうしておけば、新しいセッションでも Claude Code が CLAUDE.md を読んで文脈を理解した状態で始められます。コンテキストに載せるのは「今やりたいこと」だけでよくなり、定期的なリファクタリングで知識を整理していくサイクルが回ります。

5. Graceful degradation を意識する。 外部API(Grok API 等)は未設定時にスキップする設計にすると、環境差異によるエラーを防げます。「なくても動く、あればより良い」が理想です。

まとめ:Claude Code Skills で投資分析はここまで自動化できる

バイブコーディングの実践例として、Claude Code Skills を使って「対話的に使える投資分析システム」を自然言語インターフェースで構築できました。

  • Web 版で感じていた4つの問題(レスポンス・コンテキスト消失・再現性・処理量)を、Skills の仕組みで構造的に解決した
  • 自然言語で話しかけるだけで、Claude が適切なスキルを選択して実行してくれる。コマンド体系を覚える必要がない
  • ロジックがスクリプトとして固定されているため、毎回同じ品質のスクリーニングが保証される
  • Teams による並列実行で、yfinance が対応する60以上の取引所への同時スクリーニングやコンセンサス情報の収集が現実的に
  • Linear 連携・740以上のテストの自動実行により、開発・運用・品質管理も Claude Code 内で完結する

Skills は「コードを書く AI」を「使えるツールを持つ AI」に変える仕組みです。ロジックを一度作り込めば、あとは自然言語で会話するだけで、再現性のある分析が手に入る。

振り返ると、このプロジェクトでは 開発サイクル全体が AI とターミナルだけで自己完結 していました。Linear で要件を整理し、iTerm の複数窓で Claude Code と会話しながら実装し、worktree で並行してテストを回し、バグが見つかれば Linear に自動起票して修正し、Teams で統合テストを並列実行し、マージして Done に更新する。ブラウザを開く場面がほとんどない。AI がコードを書くだけでなく、要件管理・品質管理・プロジェクト管理まで一気通貫で担える世界が、すでに手元にあります。

個人投資家のワークフロー改善に限らず、定型的な分析や処理を繰り返す業務全般に応用できるアプローチだと感じています。

正直なところ、これをアプリ化して広く使ってもらう――という展開は難しいと思っています。Skills は Claude Code のローカル環境に依存する仕組みであり、Web サービスとして提供する設計にはなっていません。ただ、そもそもの目的は「自分の投資判断を効率化すること」でした。自分専用のツールとして、自分のお金を稼ぐ仕組みが手元にできた。これだけで十分な成果です。

今後は PdM 窓の Claude とすり合わせしながら、金融に関するあらゆる知識を Skills として体系化していきたいと考えています。株式だけでなく、債券、為替、マクロ経済指標、税制――投資判断に必要な知識は幅広い。それらを一つずつスキルに落とし込んでいくことで、自分自身の金融リテラシーも一緒に上がっていく実感があります。Skills を作るには対象領域を深く理解する必要があるので、「AI に任せる」だけでなく「AI と一緒に学ぶ」ツールにもなっている。この積み重ねが、AI と一緒に働く環境をどんどん豊かにしてくれるはずです。

興味のある方はぜひ触ってみてください。ソースコードは GitHub で公開しています。

注意: 投資は自己責任です。本システムの出力は投資助言ではありません。また、GitHub でソースコードを公開していますが、投資成果に関するお問い合わせやサポートは一切受け付けておりません。あくまで Skills の技術的な参考としてご覧ください。

156
163
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
okikusan-public

@okikusan-public(okiku)

プロジェクトマネジメント、クラウドネイティブ、生成AI関連について記載

Linked from these articles

Comments

This comment has been deleted for violation of our Terms of Service.

Let's comment your feelings that are more than good

Being held Article posting campaign

2025年、生成AIを使ってみてどうだった?

2026-01-19 ~ 2026-02-27

View details
156
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address