📚 シリーズ記事一覧はこちら
Claude Code Skills × 投資分析 Vol.3 — 運用フェーズで追加した7つの機能
はじめに
前回の記事(Vol.2)で、Claude Code Skills を使った投資分析 AI を紹介した。GraphRAG(Neo4j ナレッジグラフ)で「使うほど賢くなる」仕組みを作り、開発は大枠完了――そう締めくくった。
実際に毎日使い始めると、新しいニーズが次々と見えてきた。
「スクリーニングで見つかる銘柄って、結局いつも似たようなグループじゃない?」
「ヘルスチェックで警告が出ても、具体的に何をすればいいかわからない」
「売られすぎの株を拾いたいけど、バリュー指標だけじゃ不十分」
「損切りラインを決めたのに、いつの間にか忘れている」
運用して初めてわかる不便さ。それを1つずつ Claude Code Skills で解決していった結果、約60のfeature(98コミット)が追加された。
本記事では、その中から 7つの新機能 + リファクタリングの考え方 を紹介する。「自然言語で話しかけるだけ」で、ポートフォリオの処方箋が出たり、銘柄の隠れたグループが見つかったり、逆張りチャンスが検出されたりする。Claude Code Skills × 投資分析で何ができるのか、実際の出力と一緒に見てほしい。
数字の変化
| 項目 | 前回記事 | 現在 |
|---|---|---|
| テスト数 | 2,279 | 3,090 |
| スクリーニング戦略 | 13 | 15 |
| Neo4j ノードタイプ | 22 | 23(Community追加) |
1. 調整アドバイザー:ポートフォリオの処方箋エンジン
Vol.1で紹介したヘルスチェックは 診断 だ。「この銘柄が危ない」「セクターが偏っている」と教えてくれる。しかし診断だけでは動けない。処方箋 が欲しい。
「PFどうしたらいい?」
この一言で、17個のルールが保有銘柄とポートフォリオ全体を分析し、具体的なアクションを提案する。
ルールの構成
ポジション単位(10ルール): 個別銘柄の問題を検出する。
- デッドクロス発生 → SELL
- バリュートラップ(低PERだが利益減少) → SWAP(同セクターの健全な銘柄に乗り換え)
- 小型株で感度悪化 → FLAG(監視強化)
ポートフォリオ単位(7ルール): 全体の構造問題を検出する。
- セクター集中(HHI高い) → TRIM_CLASS
- 地域偏重 → ADD(別地域の銘柄を追加)
- 相関過多 → SWAP
アクションの5タイプ
| アクション | 意味 | 例 |
|---|---|---|
| SELL | 即時撤退 | デッドクロス+ファンダ悪化 |
| SWAP | 1対1の入れ替え | バリュートラップ → 同セクターの健全銘柄 |
| ADD | 新規追加 | 地域分散のために海外銘柄を追加 |
| TRIM_CLASS | カテゴリ削減 | 小型株比率が35%超 → 小型を減らす |
| FLAG | 監視 | まだ危険ではないが要注意 |
各アクションには urgency(緊急度) と screening_hint(探し方のヒント) が付く。「SWAP: 7203.T → 同セクター・valueプリセットで代替を探す」のように、次のアクションまで示してくれる。
さらに、市場環境(ブル/ベア/レンジ) を自動判定して、提案の積極度を調整する。ベア相場ではSELLの閾値が下がり、ブル相場ではFLAGにとどめるなど、市場の空気を読んだ処方箋になる。
実際の出力
「PFどうしたらいい?」と入力した結果がこれだ(2026年3月22日時点):
## Portfolio Adjustment Plan
Market Regime: NEUTRAL, SMA50 > SMA200, RSI 29.88, DD -6.8%
### ⚠️ MEDIUM Priority
| Action | Target | Reasons | Rules |
|:-------|:-------|:-----------------------------------------------|:---------|
| SELL | 7751.T | 変化の質「複数悪化」+ CAUTION; 下降トレンド | P5, P7, P8 |
| SELL | NVDA | 変化の質「複数悪化」+ CAUTION; 下降トレンド | P7, P8 |
| FLAG | NFLX | 下降トレンド + CAUTION | P8 |
| FLAG | VGK | 下降トレンド + EARLY_WARNING | P8 |
Summary: 0 HIGH / 7 MEDIUM / 1 LOW actions. Regime: neutral.
Market Regime が NEUTRAL と判定され、SELLの閾値が中立設定になっている。各アクションにルールID(P5=短期向き判定、P7=変化の質、P8=下降トレンド)が付くので、なぜその提案なのか が追跡できる。
ヘルスチェックが「診断書」なら、調整アドバイザーは「処方箋」。「何が悪いか」ではなく「何をすべきか」を答える のがこの機能のポイントだ。
2. コミュニティ検出:銘柄の「見えないグループ」を発見する
トヨタ(7203.T)とホンダ(7267.T)が似ているのは誰でもわかる。しかし、ナレッジグラフに蓄積されたデータから浮かび上がる「隠れたグループ」 は、人間の直感では気づきにくい。
仕組み
ナレッジグラフに蓄積された4種類のシグナルから、銘柄間の類似度を計算する。
| シグナル | 重み | 意味 |
|---|---|---|
| スクリーニング共起 | 1.0 | 同じスクリーニングで一緒に上位に出る |
| テーマ共有 | 0.8 | AI、EV、防衛など同じテーマタグを持つ |
| ニュース共起 | 0.6 | 同じニュースで言及される |
| セクター一致 | 0.5 | 同じセクターに属する |
これらを 重み付きJaccard類似度 で数値化し、Louvainアルゴリズム(networkx)でクラスタリングする。クラスタには共通のセクター・テーマから自動で名前が付く。
何に使えるか
1. 類似銘柄の発見
「7203.Tに似た銘柄は?」
→ コミュニティ: 自動車・EV (5銘柄)
7203.T トヨタ, 7267.T ホンダ, 7269.T スズキ, ...
2. ポートフォリオの集中リスク検出
ヘルスチェック時に「同じコミュニティに保有銘柄が集中していないか」を自動チェックする。セクターが違っても、スクリーニングやニュースで共起する銘柄群は実質的に同じリスクを共有している可能性がある。
⚠️ コミュニティ集中: 「半導体・AI」コミュニティに3銘柄集中(45%)
→ 異なるグループへの分散を検討
3. 隠れテーマの自動発見
クラスタにまだ名前が付かない(Community_N というフォールバック名)場合、ニュースキーワードの共起パターン から隠れたテーマを推定する。TF-IDFで特徴語を抽出し、confidence スコア付きで「このグループは〇〇関連かもしれない」と提案する。
実際に検出されたコミュニティ
ナレッジグラフに蓄積されたデータから、以下のようなコミュニティが自動検出された:
Industrials (10銘柄): CCORF, EVLV, HEPS, HWARF, MLXEF
ai (10銘柄): ALAR, CPSH, EXOD, FRUYF, GOAI
Technology (8銘柄): 2502.T, 4689.T, 7259.T, 7269.T, 7751.T
Energy (7銘柄): 1605.T, 268A.T, 5801.T, 9101.T, 9104.T
Communication Services (3銘柄): 7974.T, NFLX, Z74.SI
Consumer Cyclical (3銘柄): 9856.T, AMZN, AUTO.JK
面白いのは、セクターとは違う切り口でグループが形成されることだ。「Communication Services」に任天堂(7974.T)、Netflix(NFLX)、Singtel(Z74.SI)が入っているのは、スクリーニングやニュースでの共起パターンから自動的に導かれた結果だ。
スクリーニング結果にも、検出銘柄がどのコミュニティに属するかが自動表示される:
コミュニティ(類似銘柄クラスタ)
- Technology: 7751.T、7269.T(2銘柄)
- Industrials: 7267.T(1銘柄)
3. 逆張り・モメンタムスクリーニング:テクニカル分析で「売られすぎ」と「急騰」を検出
前回までのスクリーニングは、PER・PBR・ROEなどファンダメンタル指標が中心だった。運用していて感じたのは、「いい株なのに売られすぎている」銘柄を見つけたい というニーズだ。
逆張りスクリーニング(contrarian)
「売られすぎの株を探して」
「逆張りで拾えそうな銘柄」
3つの軸で100点満点のスコアリングを行う。
テクニカル逆張り(40点)
- RSI が売られすぎ水準(30以下で最大15点)
- 200日移動平均からの下方乖離(大きいほど高得点)
- ボリンジャーバンド下限突破
- 出来高急増(セリングクライマックスの兆候)
バリュエーション逆張り(30点)
- 低PER・低PBRだが利益は健全(バリュートラップの逆)
ファンダメンタル乖離(30点)
- 株価は下落しているが、FCF・ROE・配当は堅調
- 「市場が過剰反応しているだけで、ファンダは崩れていない」銘柄を検出
A(70点以上)〜D(30点未満)のグレードで評価。安い理由がある株(バリュートラップ) と 不当に安い株(逆張りチャンス) を区別するのがポイントだ。
実際の出力(逆張り)
「売られすぎの株を探して」の結果(2026年3月22日、日本株):
| 順位 | 銘柄 | 株価 | PER | RSI | SMA200乖離 | テク | バリュ | ファンダ | 総合 | 判定 |
|---:|:----------------------|-----:|------:|-----:|---------:|----:|-----:|------:|----:|:----:|
| 1 | 7751.T CANON | 4305 | 11.72 | 29.8 | -1.94% | 14 | 12 | 21 | 47 | ⚪C |
| 2 | 7267.T HONDA | 1302 | 10.44 | 24.1 | -15.14% | 27 | 8 | 10 | 45 | ⚪C |
| 3 | 7269.T SUZUKI | 1919 | 9.46 | 34.9 | -7.01% | 6 | 16 | 21 | 43 | ⚪C |
ホンダ(7267.T)は RSI 24.1 で売られすぎ水準、SMA200 から -15% 乖離。テクニカル逆張りスコアが 27pt と高い。一方でファンダメンタル乖離は 10pt と低く、「テクニカル的には売られすぎだが、ファンダの裏付けは弱い」ことが3軸のバランスで読み取れる。
さらに、ナレッジグラフから再出現銘柄が自動表示される:
再出現銘柄 (過去のスクリーニングにも登場):
- 8309.T: 過去4回出現
- 7267.T: 過去2回出現
モメンタムスクリーニング(momentum)
「急騰銘柄を探して」
「ブレイクアウトしてる株」
逆張りとは逆に、上昇トレンドが加速している銘柄 を検出する。4つのテクニカル指標でスコアリング:
- RSI: 過熱圏に入りつつあるが、まだ天井ではない
- MACD: シグナルラインをゴールデンクロス
- ROC(変化率): 株価の上昇速度が加速中
- 出来高トレンド: 上昇を出来高が裏付けている
サブモード(stable / surge)で、じわじわ加速している銘柄と、急激にブレイクアウトした銘柄を使い分けられる。
実際の出力(モメンタム)
「急騰銘柄を探して」の結果:
| 順位 | 銘柄 | 株価 | 50MA乖離 | 出来高比 | RSI | スコア | レベル |
|---:|:----------------------|-----:|-------:|-------:|-----:|------:|:--------:|
| 1 | 9104.T 商船三井 | 6976 | 30.25% | 1.35 | 81.1 | 70 | 🔴過熱 |
| 2 | 1605.T INPEX | 4700 | 28.41% | 1.05 | 77.9 | 65 | 🟡急騰 |
| 3 | 9101.T 日本郵船 | 6140 | 15.75% | 1.11 | 76.5 | 55 | 🟡急騰 |
商船三井(9104.T)は50日移動平均から+30%乖離、RSI 81.1で過熱圏。出来高も平均の1.35倍と活況。「🔴過熱」ラベルは利確注意のシグナルだ。
さらに、ナレッジグラフから保有銘柄の投資メモやコミュニティ所属も自動表示される(詳細はセクション6・7で後述)。
これで15戦略のスクリーニングが、バリュー系・成長系・テクニカル系 の3軸をカバーするようになった。
4. 市況ダッシュボード:Fear & Greed / VIX / イールドカーブを定量表示
「市況チェック」
「VIXは?」
「Fear & Greedは?」
これまで市況の把握は Grok API(外部AI)に頼っていた。しかし、数字で見たい ときがある。
市況ダッシュボードは yfinance のデータだけで、以下を定量表示する。
Fear & Greed スコア(6指標の合成)
| 指標 | 見ているもの |
|---|---|
| S&P500 RSI(14) | テクニカルな過熱/冷え込み |
| SMA50 との乖離 | 短期トレンドからの位置 |
| SMA200 との乖離 | 長期トレンドからの位置 |
| 52週高値との距離 | 高値圏にいるか |
| 出来高比率 | 直近の売買活況度 |
| VIX 水準 | 恐怖指数(反転して使用) |
6指標を0〜100のスコアに正規化し、合成スコアとラベル(Extreme Fear / Fear / Neutral / Greed / Extreme Greed)を算出する。CNN の Fear & Greed Index と似た発想だが、自分で計算ロジックを持っている のでブラックボックスにならない。
VIX フェーズ分析
VIXの現在値と20日移動平均・標準偏差から、市場のボラティリティフェーズを判定:
- Calm(安定): VIX < 15
- Normal(通常): 15-20
- Elevated(警戒): 20-25
- Panic(パニック): 25超
イールドカーブ
米国債の短期(2年)と長期(10年)の利回り差を表示。逆イールド(短期 > 長期)はリセッションのシグナルとして広く知られている。
Vol.2で紹介した Graceful Degradation 設計の延長で、Grok API なしでも市況を即座に把握できる。Grok API がある場合は、このダッシュボード(定量)とリサーチ(定性)を同時実行して、Claude が両方を統合した市況レポートを返す。
実際の出力
「市況チェック」の結果(2026年3月22日):
## 市況ダッシュボード (2026-03-22)
| 指標 | 値 | 日次変動 | 週次変動 |
|:---------|-------:|-------:|-------:|
| S&P500 | 6,506 | -1.5% | -2.9% |
| 日経平均 | 53,373 | -3.4% | -0.8% |
| VIX | 26.78 | +2.72pt| +3.27pt|
| USD/JPY | 159.2 | +0.8% | -0.2% |
| 原油(WTI)| 98.23 | +2.2% | +2.1% |
Fear & Greed: 27 / 100 — 😰 Fear
RSI(14) 25.3 [Fear] / SMA50乖離 -5.1% [Fear] / VIX 26.8 [Fear]
VIX推移: 19.09(2/20) → 18.63(2/26) → 21.15(3/4) → 24.93(3/10) → 26.78(3/20)
現在: High (恐怖) トレンド: 上昇
イールドカーブ: 10Y-3Mスプレッド +0.773% — 順イールド(通常)
Fear & Greed が 27(Fear) で、VIX が1ヶ月で 19 → 27 と急上昇していることがひと目でわかる。この数字を見たうえで Grok API の定性リサーチを重ねると、「何が原因でこうなっているか」まで統合した市況判断ができる。
5. 損切り・利確ラインの記録と自動参照(Exit-Rule)
「トヨタの損切りラインは2500円、利確は3500円」
投資メモに exit-rule という専用タイプを追加した。
損切りライン(ストップロス)と利確ライン(テイクプロフィット)を記録しておくと、その銘柄のヘルスチェック時にコンテキストとして自動表示される。
## 過去の経緯: 7203.T (保有)
- Exit-Rule: 損切り 2500円 / 利確 3500円 (3/1記録)
- 現在株価: 2750円
なぜ「記録」が大事なのか。 人間は、含み損が膨らむと「もう少し待てば…」と損切りラインをずるずる下げる。あらかじめ冷静な状態で決めたラインをシステムに記録しておけば、次にその銘柄を見たときに 自分が決めたルール が目に入る。
従来は thesis(テーゼ)や concern(懸念)にフリーテキストで書いていたが、exit-rule として独立させたことで、ヘルスチェックとの連携が明確になった。
6. 1ホップ先メモ参照:PF診断で投資判断の文脈が自動で出る
「PF大丈夫?」
ポートフォリオのヘルスチェックを実行すると、保有銘柄ごとの状態が表示される。しかし以前は、個別銘柄に紐づく投資メモ(テーゼ・懸念・exit-rule)はヘルスチェックの文脈に含まれていなかった。
Neo4j のグラフ構造を活かして、1ホップ先のノードを自動取得 するようにした。
Portfolio --[HOLDS]--> Stock --[ABOUT]--> Note
PF全体のヘルスチェック時に、保有銘柄(HOLDS)を辿り、さらに各銘柄に紐づくメモ(ABOUT)を1ホップで取得する。グラフDBではリレーションを辿るだけで済む処理だ。
実際の出力
「PF大丈夫?」で自動取得されるコンテキスト:
## ポートフォリオコンテキスト
## 保有銘柄の重要メモ
- [7751.T] observation: 【キヤノン 深読みレビュー 3/20】
テクニカルvsファンダ乖離: 変化スコア20/100(PF最悪)
- [7751.T] observation: 【キヤノン 継続保有判断 3/20】
取得単価~4,800円→現在4,305円(-10%)
- [NFLX] observation: 【追加購入計画の停止 3/19】
計画50株のうち30株で打ち止め。残り20株の追加購入は行わない。
- [NFLX] concern: 【逆張り観点の懸念】
好材料出尽くしリスク
- [NVDA] observation: 【FY2026 Q4 決算】
売上$39.1B(+73% YoY)
- [AUTO.JK] observation: 【購入実行】
12,700株 @ IDR2,810 で新規購入
キヤノン(7751.T)のヘルスチェック結果だけなら「CAUTION」というラベルだけだ。しかし1ホップ先のメモが自動取得されることで、「-10%含み損、変化スコア20/100で最悪、しかし継続保有判断済み」という 自分の判断の文脈 がセットで表示される。
7. 投資lessonの矛盾検出:過去の失敗と矛盾する判断を警告
Vol.2で紹介した「投資lessonの自動参照」をさらに一歩進めて、矛盾検出 を追加した。
新しい投資メモを保存するとき、既存のlessonと矛盾していないかチェックする。
たとえば、過去にこんなlessonを記録していたとする:
lesson: 「モメンタムに飛びついた → 出来高確認してから入る」
その後、こんなテーゼを記録しようとする:
thesis: 「〇〇が急騰中、すぐ買いたい」
システムは CJK対応のテキスト類似度(バイグラム分解 + キーワードマッチ)で矛盾を検出し、警告する:
⚠️ 既存のlessonと矛盾する可能性があります:
- 「モメンタムに飛びついた → 出来高確認してから入る」(2026-02-10)
lesson同士の矛盾も検出する。「損切りは早めに」というlessonと「含み損に耐えて待つ」というlessonが同時に存在していたら、どちらを優先すべきか自分で考え直す機会になる。
日本語テキストの処理が地味に難しく、CJKバイグラム分解で部分一致を可能にしている。「損切り」と「損切りする閾値」がマッチするように。
実際の出力(lessonの自動参照)
スクリーニングやヘルスチェックを実行すると、関連する投資lessonが自動でコンテキストに注入される:
## 投資lesson
- 金利4%超+VIX25超+原油高の同時発生 → 長期債→短期債ETFリプレイス検討、
反発条件(VIX22/RSI40)まで現金+SHVで待機 (2026-03-22)
- 原油が地政学要因で20%以上急騰 → エネルギー上流(INPEX/XOM)or
海運(9104.T)を小ロットでヘッジ買い (2026-03-22)
- 【ファンダ良好でも損切りする閾値ルール — 7751.Tキヤノンの事例】(2026-03-20)
- 【セクター固定観念バイアスの教訓】CEGをUtilitiesの平均PER15xと比較して
PER37xを「割高」と判断したが実態は... (2026-02-28)
これはすべてのスキル実行時に自動表示される。逆張りスクリーニングでも、市況チェックでも、PFヘルスチェックでも。いま VIX が 26.78、原油が $98 なので、1つ目のlessonがまさにトリガー条件に合致している。Claudeはこの文脈を踏まえて「現在の市況はlesson通り、防御的なポジションを推奨」と判断に織り込む。
バイブコーディングの速度を維持するためのリファクタリング
7つの機能を紹介してきたが、機能追加だけをしていたわけではない。SOLID原則に基づくリファクタリングも同じくらいの比重で実施している。
なぜか。バイブコーディングでは、コードの読みやすさがそのまま開発速度に直結する からだ。Claude Code はコンテキストウィンドウにコードを読み込んで修正を提案する。ファイルが巨大で責務が混在していると、AIが変更箇所を特定できずデグレが起きる。1ファイル1責務で小さく分割されていれば、AIは的確に修正できる。
SOLID原則は、人間の可読性のためだけではない。AIの理解しやすさのためでもある。
実際にやったこと(3例)
SRP(単一責任): 巨大ファイルの分割
2,000行超の graph_store.py を、ノードタイプごとに8ファイル(各140〜380行)に分割した。同じパターンを graph_query/、grok_client/、ポートフォリオのサブコマンド群にも適用。
# Before: 1ファイル 2,000行超
src/data/graph_store.py
# After: 8ファイル、各140〜380行
src/data/graph_store/
├── stock.py (280行) — 銘柄ノード
├── research.py (360行) — リサーチ・ニュース
├── portfolio.py (381行) — 売買・保有
├── note.py (186行) — 投資メモ
└── ...
「ヘルスチェック結果の保存を修正して」と依頼するとき、2,000行を渡すのと381行を渡すのでは精度が全然違う。
OCP(開放閉鎖): スクリーニング戦略の安全な追加
戦略が13→15に増える過程で、巨大な if-elif チェーンがデグレの温床になっていた。ScreenerRegistry(Strategy/Factory パターン)を導入し、新戦略の追加を「Registryに1エントリ追加するだけ」に変えた。本体を触らないので壊れない。
# Before: 15個の if-elif 分岐(OCP違反)
if preset == "value":
screener = ValueScreener(client)
elif preset == "contrarian": # ← 追加のたびにここが増える
...
# After: Registry に登録するだけ
registry.register(ScreenerSpec(
preset="contrarian",
screener_class=ContrarianScreener,
formatter=format_contrarian,
display_name="逆張り候補",
))
DIP(依存性逆転): テスト可能な設計
コアロジックが Neo4j を直接インポートしていたため、Neo4j なしではテストが書けなかった。Protocol ベースのポートを定義し、テスト時はモックを注入する形に変更。結果、テスト数は 2,279 → 3,090 に増え、実行時間は 80秒 → 18秒に短縮された。
# Before: Neo4j がないと動かない
from src.data.graph_query import get_recurring_picks
# After: Protocol(インターフェース)に依存。モック注入可能
class ProactiveEngine:
def __init__(self, graph_reader: GraphReader | None = None):
self._reader = graph_reader
なぜ続けるか
機能追加だけを急ぐと、コードベースが膨張してAIの理解精度が下がり、結果的に開発速度が落ちる。リファクタリングは投資と同じで、短期的には利益を生まないが長期的にはリターンが大きい。バイブコーディングの速度を維持するには、AIが読みやすいコードを保つ 意識が不可欠だ。
まとめ:運用が機能を育てる
前回「開発は大枠完了、これからは運用フェーズ」と書いた。実際に運用を始めたら、60の新機能が生まれた。
使ってみて初めてわかるニーズ がある。
- ヘルスチェックで警告が出ても動けない → 調整アドバイザーが処方箋を出す
- 保有銘柄が実質同じリスク群だと気づかない → コミュニティ検出が見えないグループを発見する
- バリュー指標だけでは「売られすぎ」を見つけられない → 逆張りスクリーニングがテクニカル×ファンダの3軸で検出する
- 市況を数字で即座に把握したい → 市況ダッシュボードがF&G/VIX/イールドカーブを表示する
- 損切りラインを決めても忘れる → Exit-Ruleが記録してヘルスチェック時に表示する
- PF診断に投資メモが反映されない → 1ホップ参照がグラフを辿ってメモを自動取得する
- 過去の失敗を繰り返す → 矛盾検出が新しい判断と過去のlessonの矛盾を警告する
これらはすべて Claude Code Skills の仕組みの上に乗っている。自然言語で話しかけるだけで適切な機能が走り、結果はナレッジグラフに蓄積され、次の分析に活きる。フライホイールは変わらない。変わったのは、フライホイールの上で動く機能が増えて、使い心地が良くなったことだ。
Claude Code Skills の面白さは、ドメイン知識をスキルとして積み上げていける ことだと思う。投資分析に限らず、自分の専門領域で「こういう判断を自動化したい」「こういう文脈を覚えていてほしい」というニーズがあれば、同じアプローチが使える。
興味のある方はソースコードをどうぞ。
注意: 投資は自己責任です。本システムの出力は投資助言ではありません。
📘 シリーズ記事
Vol.1: Claude Code Skills で株スクリーニングを自動化した話
Vol.2: Claude Code Skills で「使うほど賢くなる」投資分析AIを作った話
Vol.3: 本記事(運用フェーズで追加した7つの機能)