前回の記事では、株価データの取得・テクニカル指標の計算・シグナル生成までを実装しました。
今回はその続きです。EDINETから財務データを取得する「ファンダメンタルシグナル」、Claude APIでニュースを感情分析する「センチメントシグナル」を実装して、3つのシグナルを統合するところまで一気に進めました。全コードを公開します。
今回も何度かエラーが出ました。特にEDINETのCSV解析では業種によってファイル形式が違うという落とし穴がありました。同じところではまっている方の参考になれば嬉しいです。
自動売買システム開発の全体像——今どこにいるか
まず現在地を確認します。このシステムの開発ロードマップはこうなっています。
Phase 0:環境構築 ✅完了
Cursor・Python・GitHub・各種APIの設定
Phase 1:データ取得・分析 🔄進行中(今回)
✅ 株価データ取得
✅ テクニカル指標計算
✅ テクニカルシグナル生成
✅ ファンダメンタルシグナル(EDINET APIで財務データ)
▶️ センチメントシグナル(Claude APIでニュース感情分析)
▶️ 3シグナルの統合・重み付け
Phase 2:バックテスト ⬜未着手
過去データで戦略を検証。勝率・プロフィットファクター・最大ドローダウンを計算します。
Phase 3:注文実行 ⬜未着手
kabu STATION APIで実際に注文を出します。
Phase 4:自動化 ⬜未着手
GitHub Actionsで毎日15時に自動実行。LINE Notifyでシグナルを通知します。
Phase 5:運用・改善 ⬜未着手
月次成績レポートの公開。戦略の見直しと改善を繰り返します。
シグナルの設計思想——なぜ3つを組み合わせるのか
このシステムでは3種類のシグナルを以下の重み付けで統合しています。
・テクニカル:40%
・ファンダメンタル:35%
・センチメント:25%
テクニカルだけに頼ると「チャートは良いが業績が悪い銘柄」を掴んでしまいます。ファンダメンタルだけだと「企業は優秀だが今は買い時ではない」という判断ができません。センチメントは短期的な市場の空気感を反映します。
3つを組み合わせることで、単一指標より精度の高い判断ができる仕組みになっています。
ファンダメンタルシグナルの実装(fetch_fundamentals.py)
EDINETから有価証券報告書を取得して、ROEと営業利益率からスコアを計算します。
実装の流れはこちらです。
① EDINETコードと期間を指定して有価証券報告書を検索
② 書類IDからCSVファイルをダウンロード
③ CSVからROE・営業利益率を抽出
④ スコアを計算
ここでいくつかはまりポイントがありました。
まず有価証券報告書の提出時期です。3月決算の企業は6月頃に提出します。1月〜3月を検索しても見つかりません。企業ごとの決算月を把握したうえで検索期間を設定する必要があります。
次にCSVのファイル形式の問題です。一般的な企業は「jpcrp030000」というファイル名ですが、銀行・金融機関は「jplvh030000」という別形式になっています。最初は「jpcrp030000」だけを検索していたため、三菱UFJのデータが取得できませんでした。全CSVを対象にしてから「jpcrp030000」を優先するように修正して解決しました。
さらに三菱UFJフィナンシャル・グループは「大量保有報告書」もformCode=030000で登録されているため、有価証券報告書の絞り込みが難しい状況でした。書類IDを直接指定する方法で対応しました。
スコアの計算ルールはこちらです。
ROEスコア:15%以上→+30点 / 10〜15%→+20点 / 5〜10%→+10点 / 5%未満→-10点
営業利益率スコア:15%以上→+30点 / 10〜15%→+20点 / 5〜10%→+10点 / 5%未満→-10点
センチメントシグナルの実装(sentiment_signals.py)
Google News RSSから企業のニュースを取得して、Claude APIで感情分析します。
実装の流れはこちらです。
① Google News RSSから企業名で最新ニュースを3〜5件取得
② ニュースのタイトルをClaudeに渡して感情分析を依頼
③ -100〜+100のスコアとその理由をJSON形式で受け取る
ここでも2つのはまりポイントがありました。
1つ目はClaudeのレスポンス形式の問題です。プロンプトでJSON形式のみを指定しても、Claudeがマークダウンのコードブロックで囲んで返してくることがありました。JSON部分をfindとrfindで抽出するように修正して解決しました。
2つ目はレスポンスが途中で切れる問題です。理由の文章が長すぎてmax_tokensを超えていました。プロンプトで「50文字以内」と制限することで解決しました。
実際の分析結果の例です。トヨタ自動車のニュース「日本車首位陥落」「公取委から下請法違反で勧告」「国内販売台数は好調」に対して、Claudeが「世界販売首位喪失は中期的懸念だが、国内販売は堅調で短期的影響は限定的」とスコア-15点で評価しました。単純な文字列マッチングでは難しいニュアンスを拾えているのがAIを使う強みです。
統合シグナルの実装(integrate_signals.py)
3つのシグナルを重み付けして統合スコアを計算します。
統合スコア = テクニカル × 0.40 + ファンダメンタル × 0.35 + センチメント × 0.25
統合スコアが+40以上で「買い」、-40以下で「売り」、それ以外は「様子見」と判定します。
5銘柄で実際に動かした結果はこちらです。
トヨタ自動車(3,133円):テクニカル-30点 / ファンダメンタル+50点 / センチメント-15点 → 統合1.8点 → 様子見
ソフトバンクG(16,825円):テクニカル-40点 / ファンダメンタル-20点 / センチメント-15点 → 統合-26.8点 → 様子見
ソニー(4,575円):テクニカル+50点 / ファンダメンタル+40点 / センチメント-35点 → 統合25.2点 → 様子見
キーエンス(53,140円):テクニカル-40点 / ファンダメンタル-20点 / センチメント+15点 → 統合-19.2点 → 様子見
三菱UFJ(2,423円):テクニカル+50点 / ファンダメンタル+10点 / センチメント+32点 → 統合31.5点 → 様子見
今回は全銘柄が「様子見」という結果になりました。これはテストデータが2025年11月末時点のものであり、その時期の相場状況が反映されています。
注目点を2つ挙げます。1つ目はソニーです。テクニカルとファンダメンタルは強いのですが、EV事業撤退のニュースがセンチメントを大きく下げています。テクニカルだけで判断していたら買いシグナルになっていたところを、センチメントが抑制しています。
2つ目はキーエンスです。ファンダメンタルスコアが-20点になっています。キーエンスといえば高ROEの優良企業のイメージですが、取得できた財務データの数字が想定と違っていました。EDINETの取得期間を見直す必要があります。これは今後の課題です。
今回のまとめ
・✅ EDINET APIで財務データ取得完了
・✅ ROE・営業利益率でファンダメンタルスコア計算
・✅ Google News RSSでニュース取得
・✅ Claude APIでセンチメント分析完了
・✅ 3シグナルの統合完了(テクニカル40%・ファンダメンタル35%・センチメント25%)
・✅ 5銘柄まとめてシグナル生成・CSV保存
・✅ 全コードをGitHubに保存
次回はPhase 2のバックテストに入ります。過去データでシグナルが実際に機能していたかを検証して、勝率・プロフィットファクター・最大ドローダウンを計算します。
また読みにきてください。
ほろ酔いカバ🦛
免責事項
本記事は筆者個人の体験・記録を目的としたものであり、特定の銘柄・金融商品への投資を推奨するものではありません。投資はご自身の判断と責任のもとで行ってください。過去の運用実績は将来の成果を保証するものではありません。

コメント