
用 Claude Code 跑 finlab 台股量化回測,和用網頁聊天機器人問策略最大的差別是:它會在你的電腦上動手。建 Python 環境、寫策略程式、執行回測、讀報錯自己修,整條研究流程都在終端機裡完成,你負責用中文描述想法、檢查它的假設與結果。本文把這條路完整走一遍:先安裝 Claude Code 與 FinLab Skill,再用一句話要出第一版投信買超策略,最後讓它讀回測報告、自己提出改法並重跑。兩個版本的數字全部列出,包含輸給 0050 的部分。
| 上手問題 | 建議做法 |
|---|---|
| Claude Code 怎麼裝 | 終端機跑 npm install -g @anthropic-ai/claude-code,輸入 claude 啟動;需要 Claude 訂閱方案或 API 用量 |
| finlab 怎麼接上 | 裝 FinLab Skill 後,把下方 setup 提示詞交給 Claude Code,首次取資料時套件會自動引導登入 |
| 不會寫程式行不行 | 可以。策略邏輯用中文描述,程式由 Claude Code 生成並執行;看得懂基本邏輯,有利於檢查它有沒有用到未來資料 |
| 這篇的實測結果 | 第一版投信買超排行年化 18.1%;迭代後三因子年化 19.8%、月索提諾 1.92;同期 0050 含息年化 25.0% |
先把本文的回測結果攤開。策略是籌碼面的「投信外資買超持續三因子」:投信買超強度、投信買超持續性、外資同步買超,三個排名相加選股:
| 指標 | 投信外資三因子(本文) | naive 投信買超排行 | 0050 含息 |
|---|---|---|---|
| 年化報酬(CAGR) | 19.8% | 18.1% | 25.0% |
| 最大回撤(MDD) | -32.7% | -38.5% | -34.0% |
| 日夏普比率 | 1.05 | 0.87 | 1.22 |
| 月索提諾比率 | 1.92 | 1.43 | 1.92 |
| 總報酬 | +352% | +302% | +559% |
| 平均持股 | 20 檔 | 20 檔 | 1 檔 ETF |
口徑:2018-01 到 2026-06(資料快照 2026-06-09),策略含 finlab 預設交易成本,0050 為還原價含息買進持有,詳見文末回測方法。在本文設定與這段期間,兩版籌碼策略的年化報酬都輸給 0050 含息的 25.0%。迭代的價值出現在風險端:月索提諾從 1.43 升到 1.92、追平 0050,最大回撤從 -38.5% 收斂到 -32.7%,比 0050 的 -34.0% 略淺。這組數字同時說明兩件事:讓 AI Agent 讀報告再迭代,能實質改善策略體質;而只靠籌碼單一面向想贏過大盤,在這段權值股主導的行情裡並不容易。輸在哪裡,後面用數據拆解。
5 分鐘安裝:Claude Code 與 FinLab Skill
Claude Code 是 Anthropic 官方的終端機 AI Agent,安裝只要一行(需要先有 Node.js):
顯示程式碼
npm install -g @anthropic-ai/claude-code裝完在任何資料夾輸入 claude 即可啟動,第一次會引導你登入 Claude 帳號。使用 Claude Code 需要 Claude Pro/Max 訂閱或 API 用量計費,額度依方案而異。
接著裝 FinLab 的 AI Skill。這份 SKILL.md 讓 Claude Code 知道怎麼抓台股資料、怎麼用 finlab 回測、怎麼避開常見的前視偏差:
顯示程式碼
npx skills add https://github.com/koreal6803/finlab-ai --skill finlab最後把 setup 提示詞交給 Claude Code。首次取資料時,finlab 套件會自動引導登入,不需要把金鑰寫進提示詞或程式碼:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
幫我設定 FinLab,用投信與外資買賣超資料做台股籌碼選股回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/claude-code-finlab-quant-trading
Claude Code 是什麼?為什麼適合量化回測
Claude Code 是在終端機裡運作的 AI Agent:它能讀寫你電腦上的檔案、執行指令、看到程式的報錯並自己修正。對量化研究來說,這幾個能力剛好對應回測工作流的痛點:
| 環節 | 網頁聊天機器人 | Claude Code |
|---|---|---|
| 寫策略程式 | 給你一段程式碼,自己複製貼上 | 直接把檔案寫進你的專案資料夾 |
| 執行回測 | 不能執行,你要自己準備環境 | 自己建虛擬環境、裝 finlab、跑 sim() |
| 程式報錯 | 把錯誤訊息貼回去問它 | 讀到報錯自動修正重跑,通常不用你插手 |
| 專案記憶 | 換一個對話就忘記設定 | CLAUDE.md 記住你的回測口徑與偏好 |
| 能力擴充 | 無標準機制 | 支援 SKILL.md 標準,裝上 FinLab Skill 就懂台股資料 |
其中 CLAUDE.md 值得一提:在專案資料夾放一份說明檔,寫下「回測都用 2018 年起、對照 0050 含息、成本用 finlab 預設」,之後每次對話 Claude Code 都會先讀它,你不必重複交代口徑。對 AI Agent 跑量化還沒有整體概念的話,AI Agent 量化交易實戰有從零開始的完整示範;想比較 Claude Code、Codex、Hermes 等工具各自的強項,見 AI Agent 量化交易工具比較;量化交易本身的知識地圖,見量化交易完整指南。
第一版:一句話要一個投信買超策略
台股的三大法人買賣超每天盤後公布,是全球少見的高透明籌碼資料。投信(國內基金公司)的買超常被視為中期波段訊號,因為投信操盤有績效壓力、選股集中,這也是很多籌碼派投資人追蹤投信與外資動向的原因。我們先用最直覺的版本開始:
💬 你對 Claude Code 說:
用 finlab 做一個投信買超選股策略:近 20 日投信買賣超股數合計排名前 20 名,等權重,每月再平衡,加上近 20 日平均成交金額大於 1,000 萬的流動性過濾。回測 2018 年至今,對照 0050 含息買進持有。
🤖 Claude Code 回覆:
已建立虛擬環境並安裝 finlab,寫好
naive_trust.py並執行完成。結果:年化報酬 18.1%、日夏普 0.87、月索提諾 1.43、最大回撤 -38.5%、總報酬 +302%。同期 0050 含息年化 25.0%、最大回撤 -34.0%。這個版本輸給大盤,而且回撤更深。要我分析原因嗎?
一句話就跑出一個完整回測,這是 AI Agent 的門檻優勢。但結果本身不理想:報酬輸 0050 快 7 個百分點,回撤還更深。這也是AI 選股提示詞實測反覆出現的現象:直覺式的第一版提示詞,通常跑不出好策略。
提醒:文中對話為示意呈現,績效數字取自本文實際執行的回測輸出(見文末下載);你自己跑時的環境訊息與當日數據會略有不同。
迭代:讓 Claude Code 讀報告、自己提改法
接著把回測報告丟回給它。這一步是 Claude Code 和「問一次拿一次答案」的分水嶺:它能讀完整份報告與程式碼,指出結構性問題,改完直接重跑驗證:
💬 你對 Claude Code 說:
讀這份回測報告和程式碼,指出這個策略最可能的三個問題,提出具體改法,改完重跑並和第一版、0050 對照。
🤖 Claude Code 回覆:
我看到三個問題。第一,買超「股數」沒有正規化:同樣買超 5,000 張,對日成交十萬張的權值股是雜訊,對日成交一萬張的中型股是強訊號,直接排股數會系統性偏向大股本股票。第二,20 日窗口太短:投信單月的買超排行波動很大,換股率高、追價成本重。第三,沒有任何風控條件:買超排行榜上不乏一路下跌被逢低承接的股票。我建議改成三個因子:近 60 日投信買賣超佔同期成交量比(強度)、近 60 日投信站在買方的天數比例(持續性)、近 60 日外資買賣超佔成交量比(外資同步確認),三個排名相加,只買股價站上 60 日均線的標的,前 20 名依分數平方加權。正在重跑。
改進版的核心程式碼如下,每一段對應一個動作,完整可執行版本在文末下載:
顯示程式碼
import finlab
from finlab import data
from finlab.backtest import sim
# 首次取資料時 finlab 會自動引導登入
finlab.login()
# 1) 載入價量與法人買賣超資料
close = data.get("price:收盤價")
volume = data.get("price:成交股數")
trust_net = data.get("institutional_investors_trading_summary:投信買賣超股數")
foreign_net = data.get("institutional_investors_trading_summary:外陸資買賣超股數(不含外資自營商)")
trust_net = trust_net.reindex(close.index).fillna(0)
foreign_net = foreign_net.reindex(close.index).fillna(0)
# 2) 流動性過濾與個股趨勢條件
amount20 = (close * volume).rolling(20).mean()
liquid = (amount20 > 10_000_000) & close.notna()
ma60 = close.rolling(60).mean()
# 3) 三個籌碼因子
vol60_sum = volume.rolling(60).sum()
trust_intensity = trust_net.rolling(60).sum() / vol60_sum # 投信買超強度
trust_persistence = (trust_net > 0).rolling(60).mean() # 投信買超持續性
foreign_intensity = foreign_net.rolling(60).sum() / vol60_sum # 外資同步
# 4) 排名相加、取前 20、分數平方加權、每月再平衡
def rank_pct(factor):
return factor.where(liquid).rank(axis=1, pct=True)
score = rank_pct(trust_intensity) + rank_pct(trust_persistence) + rank_pct(foreign_intensity)
top20 = score.where(liquid & (close > ma60)).rank(axis=1, ascending=False) <= 20
weight = score.where(top20, 0).clip(lower=0) ** 2
weight = weight.div(weight.sum(axis=1), axis=0).fillna(0)
report = sim(weight, resample="M", name="投信外資買超持續三因子")
report.display()迭代前後的差異,三個指標都有感:
| 指標 | naive 投信買超排行 | 投信外資三因子 | 變化 |
|---|---|---|---|
| 年化報酬 | 18.1% | 19.8% | +1.7 個百分點 |
| 月索提諾 | 1.43 | 1.92 | 風險調整後明顯改善 |
| 最大回撤 | -38.5% | -32.7% | 淺了 5.8 個百分點 |
| 日夏普 | 0.87 | 1.05 | 改善 |
| 平均月周轉率 | 68% | 58% | 換股成本下降 |

改進版年化 19.8%、月索提諾 1.92、最大回撤 -32.7%。完整互動式回測報告(月報酬熱力圖、年度績效、權益曲線都在裡面)可直接在頁面上操作:
為什麼迭代完還是輸 0050
把差距講清楚比只報好消息有用。三因子版本輸給 0050 的 5.2 個百分點年化,主要來自三個結構性原因:
- 行情組成:2024 到 2026 年的台股漲幅高度集中在權值股,0050 的市值加權結構近半權重壓在台積電上,剛好全額吃到這段行情。三因子策略的持股由投信買超決定,偏向中型股,分散在 20 檔,權值行情下天生吃虧。
- 成本口徑:策略每月再平衡、平均月周轉率 58%,手續費與證交稅已內扣在績效裡;0050 基準是不含任何成本的指數算術。這個比較口徑對策略偏保守,實務上買 0050 也有內扣費用與交易成本。
- 訊號公開性:三大法人買賣超每天公布、人人看得到,公開訊號的超額報酬會被競爭壓縮。籌碼資料的優勢在於更新頻率高、不受財報延遲影響,而非獨家性。
風險端則有不同的結論。把回撤攤開看,改進版在 2020 年疫情崩盤與 2022 年升息修正的最深回撤都比 naive 版淺;對上 0050 則分段互有深淺:2020 年策略 -32.7% 比 0050 的 -28.2% 更深,2022 年策略 -23.1% 比 0050 的 -34.0% 淺得多,全期最大回撤 -32.7% 略淺於 0050 的 -34.0%:

60 日均線的個股趨勢過濾在這裡發揮作用:跌勢中投信買超再多也不進場,避開一部分「逢低承接卻繼續跌」的標的。對照大盤層級的擇時,Hermes 那篇的實測顯示大盤 200 日均線擇時反而重傷績效;個股層級的趨勢條件影響溫和得多,敏感度段有數字。
回測方法與限制
這些數字怎麼算出來的,逐項交代:
| 項目 | 本文設定 |
|---|---|
| 回測區間 | 2018-01 到 2026-06(資料快照 2026-06-09) |
| 交易成本 | finlab sim() 台股預設:手續費 0.1425%(未打折)、賣出證交稅 0.3%,已內扣 |
| 滑價 | 未另行假設;實際衝擊取決於資金規模與個股成交量,本文未估算策略容量 |
| 股票池 | 全上市櫃,finlab 資料含已下市股票,無生存者偏誤;未排除金融股、KY 股與 ETF |
| 流動性過濾 | 近 20 日平均成交金額大於 1,000 萬 |
| 前視偏差 | 三大法人買賣超為每日盤後公布資料,rolling 統計只用已公布值;本策略不含財報項目,無公布日對齊問題 |
| 權重 | 綜合分數平方加權(naive 版為等權),未設單檔上限 |
| 周轉率 | 改進版平均月周轉 58%、單月最高 95%,成本已反映在績效中 |
| 樣本內外 | 本文為全段 in-sample,未做樣本外切分;樣本外驗證的做法見回測是什麼與 Hermes 的 walk-forward 實測 |
| 0050 基準 | etl:adj_close 還原價含息買進持有,純指數算術、不含交易成本;基準不扣成本而策略扣,口徑對策略偏保守 |
敏感度:換參數,結論會不會翻
「前 20 檔、平方加權、60 日均線」都是設計選擇。我們把持股數、趨勢過濾、加權方式各自變動重跑,看結論是否依賴特定參數:

| 設定 | 年化報酬 | 最大回撤 | 日夏普 | 月索提諾 |
|---|---|---|---|---|
| 前 15 檔 | 19.8% | -33.3% | 1.05 | 1.80 |
| 前 20 檔(本文) | 19.8% | -32.7% | 1.05 | 1.92 |
| 前 30 檔 | 20.7% | -31.9% | 1.08 | 1.88 |
| 前 20 檔、拿掉趨勢過濾 | 18.6% | -33.7% | 1.03 | 1.68 |
| 前 20 檔、改等權 | 19.8% | -32.5% | 1.05 | 1.93 |
三個發現。第一,五組設定的年化落在 18.6% 到 20.7%、月索提諾落在 1.68 到 1.93 的窄區間,結論不因參數翻盤。第二,平方加權和等權幾乎沒有差別(1.92 對 1.93),代表報酬來自因子本身,加權方式是次要細節。第三,拿掉 60 日均線趨勢過濾後月索提諾從 1.92 降到 1.68、年化少 1.2 個百分點,趨勢條件有貢獻但策略不靠它成立。同樣重要的是:五組設定的年化全部落在 0050 的 25.0% 之下,「輸給大盤絕對報酬、風險調整後接近」這個主結論,不因參數翻盤。敏感度表的用途是驗證穩健性,回頭挑最漂亮那格當招牌就變成過擬合了。
法人買賣超的學術根據與侷限
追蹤法人買賣不是台股獨有的土方法,實證文獻對「機構投資人的交易含資訊」有長期累積:Nofsinger & Sias (1999) 用美國市場資料發現機構持股變化與股票報酬強烈正相關,且機構買進的股票在其後表現較佳,支持機構交易含有資訊的解釋。Sias (2004) 進一步證明機構買賣具有跨季持續性:這一季被機構群體買進的股票,下一季更可能繼續被買,本文的「買超持續性」因子對應的正是這個現象。台灣市場的證據更直接:Barber, Lee, Liu & Odean (2009) 用台灣完整的交易人層級資料估計,散戶因交易造成的年損失約當台灣 GDP 的 2.2%,而法人(尤其外資)是這場零和交換裡的系統性贏家。
侷限也要說清楚。前兩篇研究用的是美國市場的季頻機構持股資料,台股的日頻買賣超公開透明得多,訊號人人可見,超額報酬更容易被競爭稀釋;本文 naive 版輸給 0050 就是提醒:文獻支持「法人交易含資訊」,不等於「照抄買超排行榜就能賺錢」。從排行榜到可用的因子,中間的正規化、持續性、風控設計才是重點,這也是值得讓 AI Agent 反覆迭代的部分。想看投信買超在不同持有期的原始表現,三大法人策略比較有另一組獨立實測。
適合誰、不適合誰
適合:
- 想學 AI Agent 量化研究流程的人:本文的「一句話初版、讀報告迭代、敏感度驗證」三步,換成任何因子都適用。
- 在意回撤多於絕對報酬的投資人:三因子版本最大回撤 -32.7%,略淺於 0050,月索提諾追平。
- 重視可重現的人:全部數字附程式碼與資料,裝好環境跑一次就能驗證。
不適合:
- 目標是打敗 0050 絕對報酬的人:本文設定下三因子年化 19.8%,輸 0050 的 25.0%。
- 不想碰終端機的人:Claude Code 在命令列運作;想用瀏覽器直接跑回測,FinLab Studio 門檻更低。
- 資金量大的人:策略偏中型股、月周轉 58%,本文未估算容量上限,大額進出的滑價會侵蝕回測與實單的差距。
常見問題
Claude Code 是什麼?和網頁版 Claude 有什麼不同?
Claude Code 是 Anthropic 官方的終端機 AI Agent。網頁版 Claude 只能對話與產生程式碼,Claude Code 能在你的電腦上讀寫檔案、執行指令、看報錯自己修,還能透過 CLAUDE.md 記住專案設定、透過 SKILL.md 標準載入 FinLab Skill。做量化回測時,差別就是「拿到程式碼自己想辦法跑」與「講完想法等結果」的差別。
Claude Code 怎麼安裝?要付費嗎?
終端機跑 npm install -g @anthropic-ai/claude-code(需要 Node.js),再輸入 claude 登入即可。使用需要 Claude Pro/Max 訂閱或 API 用量計費。finlab 套件本身免費註冊即可取用台股資料,回測不用額外付費。
不會寫 Python 也能用 Claude Code 做量化回測嗎?
可以。本文兩版策略的程式都由 Claude Code 生成與執行,人的工作是描述邏輯、質疑結果。不過看得懂基本程式對你有利:你才能檢查它有沒有用到未來資料、成本有沒有扣、流動性過濾合不合理。想補底子,Python 量化交易教學從環境設定帶到第一個台股回測。
Claude Code 和 Codex、Hermes 這些工具差在哪?
定位不同:Claude Code 強在寫程式與自我修錯的迭代深度,適合當研究主力;Hermes 有跨對話長期記憶與排程,適合策略的長期維護;各工具的完整比較與選擇建議見 AI Agent 量化交易工具比較。工具會迭代,比較基準是它能不能穩定完成「讀資料、跑回測、修錯、整理結果」這個迴圈。
投信買超策略輸給 0050,還有研究價值嗎?
看你要什麼。這段期間 0050 受惠於權值股行情,絕對報酬確實難贏;三因子版本的價值在風險結構:回撤較淺、月索提諾追平、持股分散在 20 檔投信著墨的中型股,報酬來源與 0050 的權值集中結構不同。它更適合當多策略組合裡的一條腿,而非單獨對標大盤。把籌碼因子和基本面、動能因子疊加會怎樣,多因子選股實測有獨立驗證。
這個回測有過擬合風險嗎?
有,而且要明說:本文為全段 in-sample,沒有做樣本外切分,參數雖然通過敏感度檢驗(持股數、加權、趨勢過濾變動下結論不變),仍不能排除整段歷史剛好有利於這組因子。比較嚴謹的做法是切研究段與樣本外段分開驗證,做法見回測是什麼。
怎麼確認 Claude Code 寫的程式沒有用未來資料?
三個檢查點:一,資料的可得時點,法人買賣超是盤後公布,隔日開盤前才可用,本文的月頻再平衡遠粗於這個延遲,安全;二,rolling 類統計只能往回看,程式裡不能出現 shift(-n) 這種往未來取值的寫法;三,直接問它「這支程式有沒有前視偏差,逐行說明每個資料欄位的可得時間」,讓它自我審查,再抽查關鍵行。FinLab Skill 的說明檔內建這些提醒,這也是裝 Skill 比裸問的可靠之處。
實單執行要注意什麼?
三件事:平均月周轉 58% 代表每月約換掉一半持股,手續費折扣對長期績效影響可觀;持股偏中型股,單檔買賣金額大時滑價會高於回測假設;策略月頻再平衡,適合下單自動化,台股回測工具與下單環節的選擇見台股回測工具比較。
下一步
- 零安裝:打開 FinLab Studio,瀏覽器直接輸入選股條件跑回測。
- 裝起來跑:安裝 Claude Code 與 FinLab Skill,把本文的對話流程重走一遍,再換成你自己的因子。
- 進一步的提示詞寫法:怎麼把一個模糊想法逐步收斂成可回測的規格,AI 提示詞回測策略有完整的迭代示範。
- 加入社群:FinLab Discord 有上千位台股量化同好,策略卡關、回測結果怪異都可以貼出來討論。
下載與重現
- strategy.py:naive 版與三因子版完整原始碼,跑一次即可取得最新選股清單與回測報告
- data.csv:三條淨值曲線的每日數據
- metrics.json:全部指標與敏感度數據的機器可讀快照
- 互動式回測報告:投信外資買超持續三因子
投資警語:本文僅供教學參考,不構成投資建議。文中全部回測數據(年化 19.8%、最大回撤 -32.7% 等)為 2018-01 至 2026-06 的歷史模擬,已含 finlab 預設交易成本,但未含滑價與容量限制,且為全段 in-sample、未經樣本外驗證;過去績效不代表未來表現。本策略最大回撤達 -32.7%,代表 100 萬可能一度縮水至約 67 萬,請依個人風險承受度審慎評估,僅使用虧損不影響生活的閒置資金。
最後更新:2026-07|回測區間:2018-01 ~ 2026-06(資料快照 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始
