본문으로 건너뛰기

Claude Code나 Cursor에서 Pine 전략 백테스트하기

약 7분 읽기

PineForge MCP 서버 튜토리얼: 무료 호스팅 엔드포인트를 명령 한 줄로 연결하거나 로컬 Docker 서버를 내 데이터로 돌리고, 어시스턴트에게 Pine 전략 백테스트를 맡긴 뒤 돌아온 리포트를 읽어 봅니다.

엔진의 최신 릴리스는 2026-11-03에 나온 v1.10.0이고, 로컬 서버 @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(MCP) 서버로 제공합니다. 그래서 Claude Code, Claude Desktop, Cursor 같은 MCP 지원 클라이언트라면 어디서든 백테스트를 돌릴 수 있습니다. 서버는 두 가지입니다. 호스팅 서버는 아무것도 설치할 필요가 없고, 로컬 서버는 내 머신의 Docker에서 내 데이터로 돌아갑니다.

서버가 하는 일

https://mcp.pineforge.dev/mcp의 호스팅 서버는 도구 11개를 제공합니다. 그중 가장 자주 쓰게 될 도구는 다음과 같습니다.

도구하는 일비용
backtest_pinePine v6 전략을 트랜스파일·컴파일한 뒤 호스팅 OHLCV로 백테스트IP당 주간 쿼터를 패리티 검사와 공유, 무료
list_symbols지원되는 하나의 암호화폐 시장에서 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주 후 삭제되며, 주소가 없는 주간 합계만 남습니다. 이번 변경 이전에는 주간 한도를 차감하는 호출만 주소와 함께 기록되었습니다. 로컬 서버를 쓰면 트랜스파일과 백테스트가 컨테이너 안에서 실행됩니다. Pine 소스와 CSV는 내 머신을 벗어나지 않고, 네트워크 호출은 Binance 공개 API로만 나갑니다. 직접 요청한 다운로드, 심볼을 지정할 때 조회하는 해당 시장의 틱 크기, 봉을 직접 넘기지 않을 때 check_tradingview_parity가 가져오는 봉이 전부입니다.

호스팅 서버 연결하기(명령 한 줄)

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

설치도, 키도 필요 없습니다. 다른 클라이언트에서는 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

예전에 이미지를 받아 둔 적이 있다면 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은 pineforge-release Docker 이미지가 쓰는 것과 같은 JSON 리포트를 돌려줍니다. 위 실행의 summary 블록은 다음과 같습니다.

{
  "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 */ }
}

모델은 전체 구조를 받으므로, “최악의 트레이드는 뭐였어?” 같은 질문에도 추가 호출 없이 trades에서 답할 수 있습니다. 리포트가 아주 크면 로컬 서버는 리포트 전체 대신 summary를 인라인으로 돌려줍니다.

쿼터 확인하기

호스팅 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. 같은 힌트를 적어 두세요. 호스팅 백테스트를 5회 넘게 돌리기 전에 check_quota를 호출해 남은 예산을 보고하라는 뜻입니다.

서버에 일부러 넣지 않은 것

  • 주문 실행 없음. 서버는 백테스트만 하며, 브로커에는 절대 연결하지 않습니다.
  • 요청하지 않은 데이터 없음. 호스팅 서버는 자체 암호화폐 데이터로 백테스트하고, 로컬 서버는 내 CSV나 직접 요청한 Binance 다운로드를 씁니다.
  • 호출 간 상태 없음. 모든 backtest_pine 호출은 각각 독립적입니다.

모두 의도한 범위 제한입니다. 덕분에 서버가 하는 일을 점검하기 쉽고, 실패하는 방식도 단순하게 유지됩니다.

여기서부터 재미있어집니다

손으로 하기엔 번거로운 패턴 몇 가지입니다.

  • “스톱을 좁혀서 다시 돌려 줘.” 모델이 Pine 소스의 숫자 하나를 고치고 backtest_pine을 다시 호출해 결과를 비교합니다.
  • “최근 7일 말고 최근 30일로 해 봐.” 모델이 다른 기간의 데이터를 가져와 다시 실행합니다.
  • “여기서 파라미터 민감도는 어때?” 로컬 서버에서는 backtest_pine_grid가 소스를 한 번만 트랜스파일한 뒤, 지정한 입력값의 모든 조합을 돌려 보고 결과에 순위를 매깁니다.
  • “내가 가진 다른 전략이랑 비교해 줘.” backtest_pine을 두 번 호출해 결과를 나란히 보여 줍니다.

어느 것도 새 인프라가 필요하지 않습니다. 모두 모델과 도구, 그리고 여러분이 쓰는 문장에서 나옵니다.

직접 해 보기