Claude Code から 90 秒で Pine 戦略をバックテスト
@pineforge/codegen-mcp サーバーの手順:npx 一行で導入し、Claude に Pine のトランスパイルを依頼、Docker でバックテストしてトレード一覧を読み取る。OHLCV はマシンから出ません。
PineForge の codegen は長らく curl の向こう側にありましたが、今週から Model Context Protocol サーバーでも届きます。MCP 対応クライアント——Claude Desktop、Claude Code、Cursor、Continue.dev、それ以外も含め——の中からバックテストまで一気通貫で回せます。
この記事は、そのエンドツーエンドが実際どう見えるかのウォークスルーです。空のリポから JSON のバックテストレポートまで、壁時計でだいたい 90 秒。初回の Docker イメージ pull は別枠です。
サーバーが実際にすること
npm の @pineforge/codegen-mcp は、ローカルの stdio ブリッジとして薄く載っています。AI クライアントに 4 つのツールを見せます。
ここで一度立ち止まってほしいのが プライバシー面です。Pine のソースはホスト側の codegen(codegen.pineforge.dev)に送られます。OHLCV の CSV は送られません。 backtest_pine は生成された strategy.cpp を、あなたが指したファイルに対してローカル Docker で実行します。CSV は読み取り専用ボリュームとしてコンテナにマウントされるだけです。ランタイムコンテナから外向きネットワークはありません。データはノートパソコンから出ません。
インストール(ワンコマンド)
npx -y @pineforge/codegen-mcp以上です。初回実行時にパッケージが落ち、TypeScript をその場でコンパイルして MCP を stdio で話し始めます。グローバルインストールもビルド手順も不要です。
用意しておくものは三つ:
- Node ≥ 20(最近の macOS / Linux ならだいたい足ります)
- ローカルで動いている Docker(
backtest_pineがdocker runを叩きます) - pineforge.dev のウェイトリスト経由で取った PineForge API キー(
pf_…)
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このプロジェクトでは claude がサーバーを知っています。セッションを開き直すと 4 ツールが使えます。
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、最大 DD $312。3 敗目でショートに入ってから立て直せていません——そのエントリー条件を掘りますか?それとも閾値をスイープしますか?
これが生産的な面です。モデルはツール説明を持ち、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": [
/* タイムスタンプ・価格・PnL を含む 49 件 */
],
"elapsed_seconds": 0.0042,
"_meta": {
"strategy_cpp_bytes": 5079,
"image": "ghcr.io/pineforge-4pass/pineforge-engine:latest"
}
}モデルは構造全体を握っています。「最悪のトレードは?」のような追撃にも、trades[] を自分で走査すれば答えられ、二度目のツールコールは不要です。
クォータの意識
codegen API を使う会話はすべてクォータにカウントされます。高コストなパラメータスイープの前に残量を確認するために get_quota があります。無料枠は 月 100 回のトランスパイル——趣味や CI のスモークには十分、反復最適化ループをガッツリ回すには足りない場面もあります。
実用的なパターン:プロジェクトの CLAUDE.md(またはそれに相当するもの)に、
「戦略を最適化すると言われたら、5 回を超えるトランスパイルを蹴る前に get_quota を呼び、残り予算を報告せよ」
といったヒントを書いておく。
サーバーに わざと入れていないもの
- ライブ発注はない。 サーバーは戦略とデータに対して読み取り専用です。ブローカーには接続しません。実運用は別問題です。
- データ取得はない。 OHLCV はあなたが持ってくる。取引所やデータベンダーからサーバーが引っ張ってくることはありません——バイトの出所と何を回すかはあなたが決めます。
- 呼び出し間の状態はない。 各
backtest_pineは新しい Docker コンテナです。永続キャッシュも共有セッションもありません。
意図したスコープ制限です。監査しやすく、失敗モードを単純に保つためです。
ここから先が面白くなるところ
手作業だと面倒なパターンが、そのまま立ち上がります。
- 「ストップを締めて再実行」 — モデルが Pine の数字を一ついじり、
backtest_pineを再度叩いて Sharpe を比較。あなたが飽きるまでループ。 - 「過去 7 日じゃなく 30 日で」 — CSV を差し替えるだけ。フィルタ UI を這い回らなくていい。
- 「ここの感度は?」 — 入力をレンジでスイープして Sharpe を集め、小さな Markdown 表を出す。反復はモデルが担当。
- 「もう一本の戦略と比べて」 —
backtest_pineを二回、レポートを並べる。
新しいインフラは要りません。モデル + 四つのツール + あなたの文章だけで出てきます。
試す
- 無料の codegen API キーを取る(ウェイトリスト登録後、メールでキーが届きます)
- 設定の詳しい
/aiページ(Claude Desktop / Claude Code / Cursor) - npm パッケージ
パッケージはオープンソースです。サーバー本体は 座って一読できるサイズなので、線路の上に何が流れるか自分で監査したければ向いています。