本文へスキップ

Pineバックテスト:48件、全一致

方向、日時、価格、純損益がTradingViewの出力と行ごとに一致。

4,2004,4004,6004,800
8月22日8月23日
USDT

タップやドラッグで各点の値を確認できます。

出典:プローブcomposite-vcp-fvg-active-zones-01、pineforge-corpus d75b4fa、2025-03-31〜2026-05-01:CSVファイル、ギャラリー。

グラフのデータを表で見る

同じ戦略の連続する48件の取引を、その前後のBinance ETHUSDT無期限先物15分足178本に重ねて描いています。TradingViewのエクスポートとPineForgeの取引記録は、売買方向、エントリーと決済の時刻、エントリーと決済の価格、純損益が行単位で一致しています。

取引売買方向TradingViewのエントリーPineForgeのエントリーTradingViewの決済PineForgeの決済TradingViewの純損益PineForgeの純損益
4,100ロング4,306.954,306.954,296.644,296.64−10.31−10.31
4,106ロング4,279.174,279.174,276.804,276.80−2.37−2.37
4,112ロング4,327.734,327.734,315.744,315.74−11.99−11.99
4,118ロング4,272.714,272.714,242.194,242.19−30.52−30.52
4,124ロング4,779.504,779.504,760.734,760.73−18.77−18.77
4,129ロング4,749.874,749.874,738.934,738.93−10.94−10.94
4,135ロング4,718.894,718.894,731.004,731.0012.1112.11
4,141ロング4,723.344,723.344,718.714,718.71−4.63−4.63
4,147ロング4,752.764,752.764,745.124,745.12−7.64−7.64
計測方法

pineforge-corpusのプローブcomposite-vcp-fvg-active-zones-01(コミットd75b4fa):Binance ETHUSDT無期限先物、15分足、2025-03-31〜2026-05-01。そこに含まれるPineForgeの取引一覧は、エンジンv1.0.1で、2026-10-02に出力したものです。CSVファイルを見るか、ギャラリーで開くことができます。

PineForgeはTradingViewの外でPine Scriptをバックテスト。Dockerで、毎回同じ取引。

なぜオフラインか

ブラウザベースのバックテストは、チャートを見ながら試行錯誤するのに最適です。オフラインのバックテストが必要になるのは、次のステップとして戦略に実際の資金を投じるときです。監査証跡が必要なとき、コミットのたびにCIで合否を判定しなければならないとき、2か月前の結果を今日、取引単位で再現しなければならないときです。

オフラインでバックテストを実行することで得られるのは、ブラウザベースのテスターには提供できないもの:結果が決定論的であることです。スクリプト、データ、イメージのバージョンが同じなら、同じ取引が得られます。イメージのバージョンを固定し、レポートをリポジトリにコミットし、コミット間で取引一覧の差分を取り、すべてをCIでヘッドレスに実行できます。入力するCSVはご自身のもので、エンジンはローカルで動き、レポートにはその結果を生成した構成のフィンガープリントが記録されます。

具体的には次のとおりです。イメージのバージョンを固定できるので、2か月前のコミットでも今日と同じ取引一覧が得られます。取引所のローソク足からティックデータを自分で集計したバーまで、OHLCV形式であれば自前のデータを使えます。リグレッションがあればビルドを失敗させるCIチェックを組めます。そして戦略は1つのファイルであり、特定のプラットフォームに縛られません。

バックテストの結果を同僚と共有しようとして、「共有」する方法がチャートのスクリーンショットしかないと気づいたことがあるなら、足りなかったのはオフライン実行です。

Pine Scriptをオフラインでバックテストする方法

PineForgeはPineScript v6をネイティブC++にトランスパイルし、1つのDockerイメージでお手元のマシン上で実行します。

手順は3つです。イメージの取得は最初の1回だけで、以降はすべてオフラインで動きます。

ステップ1:ランタイムを取得

イメージはghcr.io/pineforge-4pass/pineforge-releaseの1つです。pipもAPIキーもアカウント登録も不要で、トランスパイル、コンパイル、バックテストはすべてイメージ内でオフラインで実行されます。イメージに含まれるエンジンはApache-2.0で、同梱のトランスパイラは個人トレードなら無料です。

ステップ2:PineをC++にトランスパイル

イメージをトランスパイル専用モードで実行すると、お手元でPineScript v6を完全なC++ソースファイルに変換します。バックテスト時にPineのインタプリタは動きません。イメージがC++をネイティブコードにコンパイルします。

docker run --rm --network=none \
  -e PINEFORGE_TRANSPILE_ONLY=1 \
  -v "$(pwd)/my_strategy.pine":/in/strategy.pine:ro \
  ghcr.io/pineforge-4pass/pineforge-release:1.10.0 > strategy.cpp

ステップ3:バックテスト

生成したC++と同じ場所にOHLCV CSVをマウントし、イメージを実行します。CSVにはtimestamp,open,high,low,close,volumeというヘッダーが必要で、タイムスタンプはUNIXミリ秒で指定します。エンジンは戦略をバーごとに実行し、JSONレポートをstdoutに出力します。ステップ2は省略することもできます。代わりにstrategy.pineをマウントすれば、イメージが先にトランスパイルします。

docker run --rm --network=none \
  -v "$(pwd)/strategy.cpp":/in/strategy.cpp:ro \
  -v "$(pwd)/ohlcv.csv":/in/ohlcv.csv:ro \
  ghcr.io/pineforge-4pass/pineforge-release:1.10.0 > report.json

JSONレポートには、サマリーブロック(総取引数、勝ちトレード数と負けトレード数、勝率、純損益、最大ドローダウン)、全取引の一覧(エントリーと決済の時刻、価格、数量、損益、バーインデックス)、プロフィットファクター、シャープレシオ、ソルティノレシオなどの指標、エクイティカーブ、そしてその実行の元になったエンジン、トランスパイラ、入力、データのフィンガープリント(計算できなかった場合はnull)が含まれます。

ワークフローはこれだけです。GUIも、アカウントの再認証も、チャートの読み込みも必要ありません。Dockerが動く環境なら、PineForgeでオフラインバックテストを実行できます。

バックテストできる対象

短い答えは:OHLCVとしてシリアライズできるものなら何でも。PineForgeはどの市場データプロバイダーとも接続していない。データを持ち込み、エンジンが戦略を動かす。

  • ご利用取引所のマーケットデータ(暗号資産)。Binance、Bybit、Kraken、あるいはRESTやWebSocket APIを持つ任意の取引所から生のトレードデータを取得する。戦略が使う時間足に集約し、CSVを直接与える。実際にトレードするペアと取引所の組み合わせでテストできる。
  • ティックから作るバー。ティックや板のデータからバーを作る場合は、OHLCVとして渡してください。エンジンは、バーがどこから来たかを問いません。
  • ほかの時系列データ。エンジンが読み込むのはtimestamp、open、high、low、close、volumeの列だけで、それ以外の列は無視されます。センチメントスコアやオンチェーン指標をバックテストに使うには、これらの列にエンコードする必要があります。

ギャラリーの312本の戦略は公開コーパスのもので、それぞれTradingViewがエクスポートした取引一覧と照合して評価しています。mainブランチのエンジンでは、コーパスチェックがそのうち311本を優秀として固定しています。条件は、取引数が同じで、90パーセンタイルで価格の差が0.01%以内、損益の差が1%以内であることです。trail_*による決済を本番用プロファイルで評価する7本については、決済価格と損益の許容幅を緩めています。残る1本は、異常として宣言されています。「優秀」では、時刻、価格、方向が完全に同じところに TradingView が二つ以上の異なるエントリー Signals を示す場合、エンジンもそこに同じ数の個別のエントリーを示します(個別エントリーの識別)。

次のステップ