本文へスキップ

Claude Code や Cursor から Pine 戦略をバックテスト

読了 約7分

PineForge の MCP サーバーのウォークスルー。無料のホスト型エンドポイントにコマンド 1 つで接続するか、ローカルの Docker サーバーを手元のデータで動かし、アシスタントに Pine 戦略のバックテストを頼んで、返ってきたレポートを読むまでを追います。

現在の最新版は、エンジン v1.10.0(2026-11-03 リリース)と、ローカルサーバー @pineforge/backtest-mcp v0.9.40 です。

2026-09-30 更新:現行のサーバー、つまり mcp.pineforge.dev のホスト型エンドポイントと、ローカルの Docker サーバー ghcr.io/pineforge-4pass/pineforge-backtest-mcp(v0.9.32)に合わせて内容を改めました。

PineForge はバックテストエンジンを Model Context Protocol サーバーとして公開しているので、Claude Code、Claude Desktop、Cursor など、MCP に対応したクライアントならどれからでもバックテストを実行できます。サーバーは 2 つあります。ホスト型はインストール不要です。ローカル版は手元のマシンの Docker 上で、手元のデータを使って動きます。

サーバーでできること

https://mcp.pineforge.dev/mcp のホスト型サーバーは 11 個のツールを公開しています。よく使うのは次のツールです。

ツール機能コスト
backtest_pinePine v6 戦略をトランスパイル・コンパイルし、ホスト側の OHLCV でバックテストするIP ごとに週単位の枠内で無料(パリティチェックと共有)
list_symbols対応する1つの暗号資産市場でOHLCVを提供するシンボルを一覧表示するカウント対象外
check_pine_featurePine の識別子がサポートされているかを確認するカウント対象外
check_quotaバックテストとパリティチェックで共有する今週の残り回数を確認するカウント対象外

ローカルサーバーには 11 個のツールがあり、手元の CSV で実行する backtest_pine、パラメータスイープ用の backtest_pine_grid、TradingView のエクスポートを照合して評価する check_tradingview_parity、transpile_pine、fetch_binance_ohlcv などが含まれます。回数の制限はありません。

プライバシーの面は、一度立ち止まって確認しておく価値があります。ホスト型サーバーでは、Pine のソースは mcp.pineforge.dev に送られ、OHLCV は PineForge のデータセットから取られます。ホスト型サーバーを利用する呼び出し元がいくつあるかを数えるため、すべてのツール呼び出しのIPアドレス(IPv6の場合は/64ブロック)を、週と回数とあわせて記録します。これらの記録は8週間後に削除され、アドレスを含まない週ごとの合計のみが保持されます。この変更までは、週の枠を消費する呼び出しのみがIPアドレスで記録されていました。ローカルサーバーでは、トランスパイルもバックテストもコンテナ内で実行されます。Pine のソースも CSV も手元のマシンから出ることはなく、ネットワーク通信が発生するのは、Binance のパブリック API へのアクセスだけです。内訳は、あなたが依頼したダウンロード、シンボルを指定したときの市場のティックサイズ、そしてバーを渡さなかったときに check_tradingview_parity が取得するバーです。

ホスト型サーバーに接続する(コマンド 1 つ)

claude mcp add --transport http pineforge https://mcp.pineforge.dev/mcp

インストールも API キーも不要です。ほかのクライアントでは、URL https://mcp.pineforge.dev/mcp を Streamable HTTP サーバーとして登録します。Claude Desktop では、カスタムコネクタとして追加してください(Customize → Connectors → Add custom connector)。

ローカルサーバーを動かす場合

Docker が必要です。Claude Code にサーバーを登録します。

claude mcp add pineforge-backtest \
  -- docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest

以前にイメージを pull したことがある場合は、docker pull ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest で更新してください。Docker は新しい latest を自動では取得しません。

起動したディレクトリが /work にマウントされます。ファイルは /work/... のパスで指定してください(例:/work/eth_15m.csv)。相対パスは手元のディレクトリではなく、コンテナ内で解決されます。

Claude Desktop と Cursor

mcpServers の JSON を読み込むクライアントでは、ローカルサーバーを追加します。Cursor ならプロジェクト内の .cursor/mcp.json(全プロジェクト共通にするなら ~/.cursor/mcp.json)、Claude Desktop なら claude_desktop_config.json(Settings → Developer → Edit Config)です。/absolute/path/to/your/data は、CSV を置いたフォルダに置き換えてください。

{
  "mcpServers": {
    "pineforge-backtest": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "/absolute/path/to/your/data:/work",
        "ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest"
      ]
    }
  }
}

-i は残し、-t は絶対に付けないでください。TTY が割り当てられると、stdio 上の JSON-RPC ストリームが壊れます。

文章で操作する

サーバーを接続したら、あとは普通の文章で指示するだけです。ローカルサーバーを使った、現実的なやりとりの例を示します(要約しています。数値は 2026-09-30 に実行した結果です)。

あなた: 直近 7 日分の ETHUSDT の 15 分足を /work/eth_15m.csv に取得して、それで strategy.pine をバックテストし、勝率とドローダウンを教えて。

Claude: fetch_binance_ohlcv を実行してから、backtest_pine を実行します…

(fetch_binance_ohlcv が 672 本のバーを書き出し、backtest_pine は 2 秒ほどで結果を返す)

期間中のトレードは 49 件です。純損益 −144.63、勝率 38.8%、最大ドローダウン 199.66、プロフィットファクター 0.61。backtest_pine_grid で移動平均の期間をスイープしてみましょうか?

モデルはツールの説明を把握していて、backtest_pine が何を返すかも知っているので、次の呼び出しへ自分でつなげられます。「Pine を編集し、TradingView に切り替え、チャートを再読み込みし、数字を読み、元に戻る」というループが、ひとつの会話に収まります。

レポートの中身

backtest_pine が返すのは、Docker イメージ pineforge-release が書き出すものと同じ JSON レポートです。上の実行でのサマリーブロックは次のとおりです。

{
  "engine": "pineforge",
  "summary": {
    "total_trades": 49,
    "wins": 19,
    "losses": 30,
    "win_rate_pct": 38.7755,
    "net_pnl": -144.63,
    "avg_trade": -2.9516,
    "best_trade": 45.39,
    "worst_trade": -47.13,
    "max_drawdown": -199.66,
    "bars_processed": 672
  },
  "trades": [
    /* 49 entries: side, entry and exit time and price, qty, pnl, bar indices */
  ],
  "metrics": { /* profit factor, Sharpe, Sortino, CAGR and more */ },
  "equity_curve": [ /* one point per bar */ ],
  "fingerprint": { /* engine, transpiler, inputs and data behind the run */ }
}

モデルには構造全体が渡るので、「最悪のトレードはどれ?」といった質問にも、2 回目の呼び出しなしで trades から答えられます。レポートが非常に大きい場合、ローカルサーバーはレポート全体ではなく、サマリーをインラインで返します。

クォータを意識する

ホスト型の backtest_pine と check_tradingview_parity は、IP ごとに週単位の枠を共有しており、上限回数は AI連携ページに記載しています。週のカウントは月曜の 00:00 UTC にリセットされ、ほかのツールはこの枠を消費しません。また、無料ユーザー全員で共有する月間の計算リソース予算によって、無料のバックテストが翌月(UTC)まで一時停止されることもあります。check_quota を使えば、長いループを回す前にモデルが残りを確認できます。ローカルサーバーにはクォータがないので、スイープにはこちらのほうが向いています。

便利なパターンとして、プロジェクトの CLAUDE.md(またはそれに相当するファイル)に、Before running more than 5 hosted backtests, call check_quota and report the remaining budget. のようなヒントを書いておく方法があります。

サーバーにあえて入れていないもの

  • 発注はしない。 サーバーが行うのはバックテストだけで、ブローカーに接続することはありません。
  • 頼んでいないデータは使わない。 ホスト型サーバーは自前の暗号資産データでバックテストし、ローカルサーバーはあなたの CSV か、あなたが依頼した Binance からのダウンロードを使います。
  • 呼び出し間で状態を持たない。 backtest_pine の呼び出しは、それぞれが独立しています。

これらは意図的なスコープの制限です。そうすることで、監査しやすい範囲と、単純な失敗モードを保っています。

ここからが面白いところ

手作業ではやりにくいパターンをいくつか挙げます。

  • 「ストップを狭めて再実行して」 モデルが Pine ソースの数値を 1 つ書き換え、backtest_pine をもう一度呼び出して、結果を比較します。
  • 「直近 7 日ではなく 30 日で試して」 モデルが別の期間のデータを取得して、再実行します。
  • 「このパラメータの感度は?」 ローカルサーバーなら、backtest_pine_grid がソースを 1 回だけトランスパイルし、指定した入力値のすべての組み合わせを実行して、結果をランク付けします。
  • 「手元の別の戦略と比べて」 backtest_pine を 2 回呼び出し、結果を並べてレポートします。

どれも新しいインフラは必要ありません。モデルとツール、そしてあなたの文章から生まれるものです。

試してみる