オフラインバックテスト

PineScriptバックテストをオフラインで、自分のデータに対して実行する

PineForgeはPineScript v6をネイティブC++にトランスパイルし、Dockerを通じてローカルマシンで実行する。ローカルファースト、バイト単位で再現可能、Dockerが動く環境ならどこでも。OHLCV CSVは自分で用意する。

なぜオフラインか

ブラウザベースのバックテストはチャートを見ながら試行錯誤するには最適だ。オフラインバックテストが必要になるのは、戦略に本物の資金を投じる次のステップに進むとき — 監査証跡が必要なとき、コミットのたびにCIがゲートしなければならないとき、2ヶ月前の結果を今日ビット単位で再現しなければならないとき。

オフラインでバックテストを実行することで得られるのは、ブラウザベースのテスターには提供できないもの:結果が バイト単位で再現可能 — 同じ入力、同じ出力、毎回。エンジンのバージョンをピン留めし、結果をリポジトリにコミットし、コミット間でトレードリストを差分比較し、CIパイプラインでヘッドレスに実行できる。与えるCSVは自分のもの、動かすバイナリはローカル、受け取るレポートは監査可能だ。

オフラインで得られる実益の例:エンジンのバージョンをピン留めすれば、2か月前のコミットでも今日と同じトレードリストが得られる;カスタムデータ取り込みにより、自社取引所のティック再構成、データベンダーのポイントインタイム調整済み価格、OHLCVにシリアライズできるオルタナティブデータまで検証できる;CI連携によりリグレッションを本番投入前にビルドで検知できる;戦略ロジックが単一ファイルとしてプラットフォームに縛られないため、マルチブローカーでの持ち運びもしやすい。

バックテスト結果を同僚と共有する必要が生じて、共有する唯一の方法がチャートのスクリーンショットだと気づいたことがあるなら — オフライン実行こそが足りないものだ。

仕組み

3つのステップ。PineソースからJSONトレードレポートまでの完全なワークフローは、初回は2分未満、2回目以降は30秒未満で完了する。

ステップ1 — ランタイムを取得。 コンテナイメージ1つ。pipもキーもサインアップも不要 — トランスパイルもバックテストもその中でオフラインに動きます。個人トレードなら無料です。

ステップ2 — PineをC++へトランスパイル。 コンテナをトランスパイル専用モードで実行すると、お手元でPineScript v6を完結したC++ソースファイルへ変換します。実行時にPineインタプリタは一切動かず、エンジンがネイティブマシンコードへコンパイルします。

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

ステップ3 — バックテスト。 お手持ちのOHLCV CSVを生成済みC++と並べてマウントし、コンテナを実行します。エンジンがデータファイルを読み込み、戦略をバーごとに実行し、JSONレポートをstdoutへ書き出します。

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-engine:latest > report.json

JSON出力には、エントリー/エグジット価格・バーインデックス・ポジションサイズなどを含むトレードリストに加え、純損益・最大ドローダウン・総取引数・プロフィットファクター・Sharpe比などのサマリーブロックが含まれます。各フィールドは同一メジャーバージョン内のパッチでは安定しており、スクリプトからパースして問題ありません。

これがワークフローのすべてだ。GUIなし、アカウント再認証なし、チャート読み込みなし。Dockerが動くなら、PineForgeのオフラインバックテストが動く。

バックテストできる対象

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

ご利用取引所のマーケットデータ(暗号資産)。 Binance、Bybit、Kraken、あるいはRESTやWebSocket APIを持つ任意の取引所から生のトレードデータを取得する。戦略が使う時間足に集約し、CSVを直接与える。実際にトレードするペアと取引所の組み合わせでテストできる。

データベンダーの株式。 Polygon、Norgate、BarChart、Tiingo — ソースを選び、ポイントインタイムの修正済み価格をエクスポートし、実際の約定と生存バイアスなしのユニバースでバックテストを実行する。

ティック再構成。 Level 2データがあり、ティックから再構成した合成1秒足でテストしたい場合も可能だ。自分のティックデータからOHLCVを生成して渡せばよい。エンジンはバーがどこから来たかを知らないし、気にしない。

オルタナティブデータ。 センチメントスコア、オンチェーン指標、ファンディングレート、オプションのスキュー — バーインデックスに揃えた時系列として表現できれば、Pineのカスタムデータカラムとしてオフラインでテストできます。

ギャラリー内の246戦略参照スイートは、TradingViewのCSVエクスポート(パリティ検証用)とカスタムCSVデータセット(リグレッションテスト用)の両方に対してバックテストされた。246戦略中245戦略がカノニカルなstrict-excellentティア(比較ウィンドウでのPnLドリフト0.5%以下)に到達。残る1件はTV側の非決定性として深掘り解析済みで、TradingView側の状態に起因する。エンジン側のバグはゼロだ。

始める