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.jsonJSONレポートには、サマリーブロック(総取引数、勝ちトレード数と負けトレード数、勝率、純損益、最大ドローダウン)、全取引の一覧(エントリーと決済の時刻、価格、数量、損益、バーインデックス)、プロフィットファクター、シャープレシオ、ソルティノレシオなどの指標、エクイティカーブ、そしてその実行の元になったエンジン、トランスパイラ、入力、データのフィンガープリント(計算できなかった場合は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 を示す場合、エンジンもそこに同じ数の個別のエントリーを示します(個別エントリーの識別)。