用 Claude Code Skills 投資分析進階¶
原文: Claude Code Skills × 投資分析 Vol.3 — 処方箋エンジン・逆張り検出・銘柄クラスタリング
運用階段新增的7個功能¶
上篇文章(Vol.2)中介紹了使用 Claude Code Skills 的投資分析 AI GraphRAG(Neo4j 知識圖譜)建立了「越用越聰明」的機制,開發大致完成——我是這樣結尾的。
實際上開始每天使用後, 新的需求一個一個浮現出來。
- 「用篩選找到的股票,結果都只是類似的群組嗎?」
- 「健康檢查發出警告,但具體要做什麼也不清楚」
- 「想撿便宜被低估的股票,但光看價值指標不夠」
- 「設定了停損線,但不知不覺就忘了」
實際開始運用後才發現的不方便。我用 Claude Code Skills 逐一解決的結果,總共新增了約60個功能(98次提交)。
本篇文章要從中介紹 7個新功能 + 重構的思考方式。只要「用自然語言詢問」,就會顯示投資組合的處方籤、找出股票隱藏的群組、或偵測到逆勢買入的機會。用實際輸出一起看 Claude Code Skills × 投資分析能做什麼。
1. 調整顧問:投資組合的處方籤引擎¶
Vol.1中介绍的健康檢查是「診斷」。會告訴你「這檔股票很危險」「產業偏重」。但光診斷還不能行動。 需要處方籤。
只要一句話,就會用17條規則分析持有股票和整個投資組合,具體建議要採取什麼行動。
規則構成¶
部位單位(10條規則): 偵測個別股票的問題。
- 死亡交叉發生 → SELL
- 價值陷阱(低本益比但獲利減少)→ SWAP(同產業的健康股票替換)
- 小型股敏感度惡化 → FLAG(加強監視)
投資組合單位(7條規則): 偵測整體結構問題。
- 產業集中(HHI高)→ TRIM_CLASS
- 地區偏重 → ADD(加入其他地區的股票)
- 相關性過高 → SWAP
行動的5種類¶
| 行動 | 意義 | 範例 |
|---|---|---|
| SELL | 立即撤退 | 死亡交叉 + 基本面惡化 |
| SWAP | 一對一替換 | 價值陷阱 → 同產業的健康股票 |
| ADD | 新增購入 | 為了地區分散而加入國外股票 |
| TRIM_CLASS | 減少類別 | 小型股占比35%以上 → 減少小型股 |
| FLAG | 監視 | 還沒危險但要注意 |
每個行動都會附上 urgency(緊急度) 和 screening_hint(尋找方向的提示)。例如「SWAP: 7203.T → 用同產業的value預設尋找替代」這樣,連下一步都會顯示。
此外,會自動判定 市場環境(多頭/空頭/區間),調整建議的積極度。空頭市場時SELL的門檻會降低,多頭市場時只會給FLAG等等,作成符合市場氛圍的處方籤。
實際輸出¶
「投資組合該怎麼做?」的輸入結果如下(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. 社群偵測:找出股票「看不見的群組」¶
Toyota(7203.T)和Honda(7267.T)很相似這點誰都知道。但是, 從知識圖譜累積的資料中浮現的「隱藏群組」,是人類直覺很難注意到的。
機制¶
從知識圖譜累積的4種訊號,計算股票之間的相似度。
| 訊號 | 權重 | 意義 |
|---|---|---|
| 篩選共現 | 1.0 | 同樣的篩選條件一起出現 |
| 主題共享 | 0.8 | 擁有AI、EV、防衛等相同的主題標籤 |
| 新聞共現 | 0.6 | 在同一則新聞中被提及 |
| 產業一致 | 0.5 | 歸屬於相同的產業 |
用 加權Jaccard相似度 數值化,用 Louvain演算法(networkx)進行分類。分類會從共同的產業或主題自動命名。
能用來做什麼?¶
1. 發現相似股票
2. 偵測投資組合集中風險
健康檢查時會自動檢查「是否有持倉股票集中在同一個社群」。即使產業不同,透過篩選或新聞共現的股票群,實質上可能共享相同的風險。
3. 自動發現隱藏主題
當分類還沒命名(稱為 Community_N 這種預設名)時, 從新聞關鍵詞的共現模式 推斷隱藏的主题。用TF-IDF抽出特徵詞,附上信心分數,建議「這個群組可能是XX相關」。
實際偵測到的社群¶
從知識圖譜累積的資料中,自動偵測到了以下社群:
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」中包含Nintendo(7974.T)、Netflix(NFLX)、Singtel(Z74.SI),是從篩選或新聞的共現模式自動推導的結果。
篩選結果上也會自動顯示偵測到的股票屬於哪個社群:
3. 逆勢・動能篩選:用技術分析偵測「被低估」和「飆漲」¶
之前的篩選主要是本益比、股價淨值比、ROE���基��面指標。實際運用後感受到的需求是,想找到 「好股票但被低估」 的股票。
逆勢篩選(contrarian)¶
用3個軸進行滿分100的打分。
技術逆勢(40分)
- RSI處於低估水準(30以下最高15分)
- 距200日均線的下方偏離(越大分數越高)
- 突破布林通道下限
- 成交量暴增(賣壓高峰的徵兆)
價值逆勢(30分)
- 低本益比、低股價淨值比但獲利健全(價值陷阱的反面)
基本面偏離(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 |
Honda(7267.T)的RSI是24.1,處於低估水準,距SMA200偏離-15%。技術逆勢分數27pt很高。同時基本面偏離只有10pt,「技術上雖然被低估,但基本面支撐不足」能從三軸的平衡讀出來。
此外,從知識圖譜自動顯示 重複出現的股票:
動能篩選(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 / 殖利率曲線量化顯示¶
到目前為止市況的掌握都依賴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)¶
在投資筆記中新增了 exit-rule 這個專用類型。
記錄停損線(停損)和停利線(停利),在該股票的健康檢查時會自動顯示為背景資訊。
為什麼「記錄」很重要呢?人類在浮虧擴大時,會「再等一下」而把停損線一直往下改。在冷靜狀態下事先決定的線記錄在系統中,下次看到該股票時會 看到自己訂的規則。
以前是寫在 thesis(論點)或 concern(疑慮)之類的自由文字,作為 exit-rule 獨立出來後,和健康檢查的連動就清楚了。
6. One-hop 筆記引用:投資組合診斷時投資判斷的脈絡自動顯示¶
執行投資組合的健康檢查,會顯示每檔持有股票的狀態。但以前, 個別股票附屬的投資筆記(論點・疑慮・exit-rule)並沒有包含在健康檢查的脈絡中。
利用Neo4j的Graph結構, 自動取得1跳躍的節點。
執行整體投資組合的健康檢查時,循著持有股票(HOLDS),再取得各股票附屬的筆記(ABOUT)1-hop。在 GraphDB 中只要循著關係就能取得這個處理。
實際輸出¶
「投資組合好嗎?」自動取得的脈絡:
## 投資組合脈絡
## 持有股票的重要筆記
- [7751.T] observation: 【Canon深入評論 3/20】
技術vs基本面偏離: 變化分數20/100(投資組合最差)
- [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 新增購入
Canon(7751.T)的健康檢查結果只有「CAUTION」這個標籤。但自動取得 one-hop 的筆記,會顯示「-10%浮虧、變化分數20/100是最差、但已判斷持續持有」的 自己的判斷脈絡。
7. 投資lesson的矛盾偵測:對過去失敗矛盾的判斷發出警告¶
Vol.2中介介紹的「投資lesson的自動引用」更進一步,新增了 矛盾偵測。
保存新的投資筆記時,檢查是否和現有的lesson矛盾。
例如,過去曾記錄過這樣的lesson:
然後試圖記錄這樣的論點:
系統會用 CJK對應的文字相似度(二元文分解 + 關鍵字匹配)偵測矛盾,發出警告:
lesson之間的矛盾也會偵測。「早點停損」的lesson和「等著看浮虧」的lesson同時存在的話,哪個該優先自己要重新思考。
日文文本的處理意外地困難,用CJK二元文分解讓部分匹配成為可能。例如「停損」和「停損的門檻」能匹配。
實際輸出(lesson的自動引用)¶
執行篩選或健康檢查時,相關的投資lesson會自動注入到脈絡中:
## 投資lesson
- 利率4%+VIX25+原油高的同時發生 → 長期債券→短期債券ETF替換検討、
等反彈條件(VIX22/RSI40)前保持現金+SHV(2026-03-22)
- 原油因地緣政治因素飆漲20%以上 → 能源上游(INPEX/XOM)或
海運(9104.T)用小單位對沖買進(2026-03-22)
- 【基本面良好也要停損的門檻規則 — 7751.T Canon的案例】(2026-03-20)
- 【產業固執偏見的教訓】CEG和Utilities的平均PER15x比較
PER37x判斷為「高估」但實際是...(2026-02-28)
這是 所有技能執行時 都會自動顯示的。無論是逆勢篩選、市況檢查、投資組合健康檢查。現在VIX是26.78、原油是$98,所以第1個lesson正好符合觸發條件。Claude會把這個脈絡考量進去,判斷「現在的市況如lesson所述,建議防御性部位」。
為維持快速coding的重構¶
介紹了7個功能,但也不只是做功能追加。 根據SOLID原則的重構也花了同樣的比重。
為什麼?因為在快速coding中, 代碼的可讀性直接影響開發速度。 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個entry」。不用碰到本體所以不會壞。
# 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 的情況下編寫測試。我們改變了方法,採用基於協定的連接埠定義,並在測試過程中註入模擬物件。結果,測試案例數量從 2279 個增加到 3090 個,執行時間從 80 秒縮短到 18 秒。
# Before: 沒有Neo4j就不能動
from src.data.graph_query import get_recurring_picks
# After: 依賴Protocol(介面)。可注入mock
class ProactiveEngine:
def __init__(self, graph_reader: GraphReader | None = None):
self._reader = graph_reader
為什麼持續做?¶
只急著做功能追加的話,codebase膨脹,AI的理解精度下降,結果開發速度反而下降。重構和投資一樣,短期內不產生收益但長期回報大。要維持快速coding, 保持AI能讀懂的代碼 的意識不可或缺。
摘要:營運促進功能¶
上次寫「開發大致完成,今後是運用階段」。實際開始運用後,產生了60個新功能。
實際使用後才會知道的需求。
- 健康檢查發出警告但不能行動 → 調整顧問 開出處方籤
- 持有股票實質上在同一個風險群 → 社群偵測 發現看不見的群組
- 光價值指標找不到「被低估」→ 逆勢篩選 用技術×基本面的3軸偵測
- 想立即用數字掌握市況 → 市況儀表板 顯示F&G/VIX/殖利率曲線
- 設定停損線但會忘 → Exit-Rule 記錄並在健康檢查時顯示
- 投資組合診斷沒有反映投資筆記 → 1-hop 引用 循著圖取得筆記
- 重複過去的失敗 → 矛盾偵測 警告新判斷和過去lesson的矛盾
這些全部都建立在 Claude Code Skills 的機制上。只要用自然言語詢問就會跑適當的功能,結果累積在知識圖譜中,下一個分析能活用。Flywheel不變。變的是在flywheel上運作的功能增加了, 使用體驗變好了。
我覺得 Claude Code Skills 的有趣之處在於, 能把領域知識累積成技能。不限於投資分析,在自己的專業領域有「我想自動化這個判斷」「希望記住這個脈絡」之類的需求的話,能用同樣的方法。
有興趣的人請看原始碼。,原始碼已在 GitHub 公開:
注意: 投資是自負盈虧。本系統的輸出不是投資建議。
📘 系列文章:
