用 Claude Code 在 90 秒內回測 Pine 策略
實作 @pineforge/codegen-mcp:一行 npx 安裝,請 Claude 把你的 Pine transpile,再用 Docker 跑回測並讀交易清單。OHLCV 不離開本機。
幾個月來,PineForge codegen 一直躲在 curl 後面;從這週起,它也在 Model Context Protocol 伺服器背後——你可以在支援 MCP 的用戶端裡(Claude Desktop、Claude Code、Cursor、Continue.dev 等)把回測一路跑完。
這是一篇端到端 walk-through:從空儲存庫到拿到 JSON 回測報告,牆上時鐘大約 90 秒,外加首次 docker pull 的一次性成本。
伺服器到底做什麼
npm 上的 @pineforge/codegen-mcp 是一層很薄的本地 stdio 橋。它向 AI 用戶端暴露 四個工具:
值得停一下的是 隱私面。Pine 原始碼會送到託管 codegen(codegen.pineforge.dev)。OHLCV CSV 不會送。 backtest_pine 在你本機 Docker 裡用產生的 strategy.cpp 對著你指定的檔案跑;CSV 唯讀掛載進容器。執行時容器 沒有外出網路。資料留在你的筆電上。
安裝(一條命令)
npx -y @pineforge/codegen-mcp就這樣。首次執行會下載套件、即時編譯 TypeScript,然後開始用 stdio 講 MCP。不必全域安裝,也不必另外 build。
你需要準備好三件事:
- Node ≥ 20
- 本機 Docker 正在執行(
backtest_pine會docker run) - 透過 pineforge.dev 候補名單拿到的
pf_…API key
接入 Claude Desktop
開啟設定檔:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
在 mcpServers 下加上:
{
"mcpServers": {
"pineforge-codegen": {
"command": "npx",
"args": ["-y", "@pineforge/codegen-mcp"],
"env": {
"PINEFORGE_API_KEY": "pf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}重啟 Claude Desktop。側邊欄「可用工具」裡會出現該伺服器。第一次呼叫會打到託管 codegen,並觸發執行時映像的 docker pull——大約 250 MB,只做一次。
Claude Code(CLI)
如果你已經在終端機裡,這樣更短:
claude mcp add pineforge-codegen \
--transport stdio \
--env PINEFORGE_API_KEY=pf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-- npx -y @pineforge/codegen-mcp重新開工作階段後四個工具可用。
Cursor
Settings → MCP → New MCP Server → 貼上同一段 JSON。Cursor 負責行程生命週期。
用自然語言驅動
接好後,互動就是普通中文/英文提示詞。略壓縮的真實對話:
你:
./strategy.pine裡是 Pine v6 策略,./eth_15m.csv是 7 天 15 分鐘 ETHUSDT。跑回測,告訴我 Sharpe 和最大回撤。
Claude: 正在對這兩個檔案呼叫
backtest_pine…
[backtest_pine({ source: "...", ohlcv_csv_path: "./eth_15m.csv" })約 3 秒返回]
完成。7 天視窗 49 筆交易。淨盈虧 −$190.85,Sharpe 0.21,最大回撤 $312。第三次虧損後做空再也沒爬起來——要我挖觸發條件,還是掃一遍進場閾值?
這就是生產力表面:模型握著工具說明,知道 backtest_pine 回傳什麼,可以在你不手寫 curl 的情況下串下一次呼叫。「改 Pine → 存檔 → 切 TradingView → 重載圖表 → 讀數 → 回到編輯器」的摩擦,塌縮成 一段對話。
報告長什麼樣
backtest_pine 回傳與獨立 Docker 映像 相同形狀的 JSON。摘要區塊:
{
"engine": "pineforge",
"summary": {
"total_trades": 49,
"net_pnl": -190.85,
"max_drawdown": 312.0,
"sharpe": 0.21,
"profit_factor": 0.78,
"win_rate": 0.43
},
"trades": [
/* 49 筆含時間戳、價格、PnL */
],
"elapsed_seconds": 0.0042,
"_meta": {
"strategy_cpp_bytes": 5079,
"image": "ghcr.io/fullpass-4pass/pineforge-engine:latest"
}
}模型拿到完整結構後,可以回答「最差的一筆是哪筆?」這類追問——自行掃 trades[],常常不需要第二次工具呼叫。
配額意識
凡是走 codegen API 的對話都會扣配額。為了在昂貴參數掃描前先摸底,提供了 get_quota。免費檔 每月 100 次 transpile—— hobby 和 CI 冒煙夠了;若是反覆最佳化迴圈可能會緊。
實用做法:在專案的 CLAUDE.md(或等價物)裡寫一句:若被要求最佳化策略,在發起超過 5 次 transpile 之前先呼叫 get_quota 並回報剩餘額度。
伺服器 刻意不包含的東西
- 沒有實盤下單。 伺服器對你的策略與資料是唯讀的;不接券商。實盤是另一回事。
- 沒有行情拉取。 OHLCV 你自己帶來。伺服器不從交易所或資料商拉位元組——資料來源與回測對象由你掌控。
- 呼叫之間沒有狀態。 每次
backtest_pine都是全新容器。沒有持久快取,也沒有共用工作階段。
這是刻意的範圍邊界:表面可稽核,故障模式單純。
到這裡會變好玩的手動苦活
幾件手工做很彆扭、在這種模型裡很自然的事:
- 「把停損收緊再跑一遍。」 模型改 Pine 裡的一個數,再調
backtest_pine,對比 Sharpe。你厭煩為止。 - 「換成最近 30 天而不是 7 天。」 指向另一個 CSV,模型重跑。不必在篩選 UI 裡爬。
- 「這裡參數敏感度怎樣?」 對一個輸入掃區間,收集 Sharpe,列印小 Markdown 表。迭代交給模型。
- 「跟另一份策略比一比。」 兩次
backtest_pine,並排讀報告。
不需要新基礎設施。模型 + 四個工具 + 你的話就夠了。
動手試
- 領取免費 codegen API key(候補註冊,key 以電郵送達)
- 完整
/ai設定頁(Claude Desktop / Claude Code / Cursor) - npm 套件
套件是開源的。伺服器小到 坐下來一遍讀完就能稽核線路,如果你想搞清楚線上到底送了什麼,很適合。