本文へスキップ

167本の戦略を、数字で読み解く

読了 約6分

2026年5月の時点で、PineForgeのパリティ・コーパスに何があったか——167本の戦略の、カテゴリ、銘柄、複雑さ別の内訳。ギャラリーを巡るミュージアムガイドのつもりで読めます。

この記事の数値は2026年5月9日に計測したもので、当時のまま掲載しています。最新の結果はパリティの測定方法をご覧ください。

2026-05-09 に数値を更新し、新しいコーパス規模(参照戦略 167 本、うち 165 本が厳密パリティ)を反映しました。

2026年5月、私たちは「167 本中 165 本の戦略が厳密パリティを満たす」と書きました。この主張が意味を持つのは、その 167 本が何だったのかを知っている場合だけです。この記事は、当時のコーパスを案内するガイドツアーです。

なぜ固定コーパスが要るのか

固定された参照セットがなければ、「パリティ」はただの感覚です。戦略をいくつか動かし、十分近く見えたので出荷する。すると、ユーザーが OCA のエグジットグループやループ内の request.security を使ったとたん、何ひとつ一致しなくなります。バグは最初からそこにありました。それを狙ったテストをしていなかっただけです。

テスト用に固定したコーパスがあれば、話は変わります。当時は、パリティに影響しうる変更があるたびに、メンテナーが各自の手元のマシンで、同じ 167 本の戦略を同じカノニカル OHLCV で実行し直していました。合格した戦略の数が増えれば何かが改善し、減れば回帰が入り込んだということです。コーパスとは、バックテストギャラリーの姿をした回帰テストのハーネスなのです。

167 本の戦略は、公開された証明の役割も果たしていました。エンジンの出力(トレード数、トータルリターン、シャープレシオ)をギャラリーにコミットし、エンジンが何を出力したのかを誰でも確認できるようにしていたのです。パリティがあると主張するだけのプレスリリースとは、そこが違います。

三つのカテゴリ

2026-05-09 の時点で、167 本の戦略は basic、community、validation の三つのフォルダに分かれていました(四つ目のフォルダ parity-anomalies には、本数に含めていないプローブが 1 本入っていました)。品質による序列ではなく、戦略の出どころと、何をテストするものかを表す分類です。(現在の公開コーパスでは、評価対象の 312 本の戦略を validation/ の下にまとめています。)

basic — 9 本

basic カテゴリには、よく知られた定番の戦略タイプが入っています。移動平均クロス、Supertrend、Stochastic Slow、Parabolic SAR、Keltner Channel、Inside Bar、Pivot Extension、そしてボラティリティ拡張型の手法です。アルゴリズムトレードの入門講座なら必ず出てくる、教科書どおりの例ばかりです。

これらをコーパスに入れているのは、コンパイラが恥ずかしい壊れ方をするのは、まさにこうした教科書的な例だからです。移動平均クロスで正しいトレード一覧が出ないなら、ほかのすべてが疑わしくなります。basic はサニティチェックの層です。

コーパス内の basic 9 本のトレード数は、13 件(非常に選別的な greedy 戦略)から 7,299 件(15 分足で頻繁に発火するボラティリティ拡張戦略)まで開きがありました。「シンプル」なカテゴリの中に 500 倍を超える差があるわけですが、これは戦略の複雑さよりも、どれだけ選別的にエントリーするかの違いを物語っています。

community — 11 本

community カテゴリには、アルゴリズムトレードのコミュニティから寄せられた Pine スクリプトが入っています。現実の書き手が書いたものには、現実のばらつきがあります。コーディングスタイルも、組み込み関数の使い方も、ポジションサイズやエグジットロジックの組み方に潜むエッジケースも、それぞれ違います。

11 本のコミュニティ戦略には、4 本の EMA と RSI フィルターを組み合わせたもの、Break-of-Structure のカーブ検出器、リクイディティスイープ戦略、MarketShift というトレンドフォロー型のシステムなどが含まれます。トレード数は 72 件(VCP:非常に選別的なマルチシグナル戦略)から 2,643 件(IES:最も頻繁にトレードする戦略)まで幅がありました。リターンの幅も大きく、バックテスト期間で IES は +$58,430、MarketShift は +$3,388 だった一方、コミュニティ戦略のなかで最も成績の悪かったものは $678 の損失でした。コーパスに入っているからといって、その戦略が儲かるかどうかは分かりません。分かるのは、コンパイルでき、トレードを生成するということだけです。

コミュニティのスクリプトは、パリティを維持するのが最も難しいカテゴリです。書き手が多様なので、検証スイートでは想定しきれない Pine 機能の珍しい組み合わせが使われます。新しいパリティのずれが見つかるときは、たいていまずここで見つかります。

validation — 147 本

validation カテゴリは群を抜いて大きく、コーパス 167 本のうち 147 本を占めていました。これらは特定の Pine のセマンティクスを検証するために作った合成戦略です。目的は利益を出すことではなく、特定の言語機能が C++ の出力に正しく対応していることを証明することにあります。

当時、個々の validation 戦略が何を対象にしていたか、いくつか例を挙げます。

  • 41-partial-exit-qty-percent — ポジションの部分的な手仕舞いについて strategy.exit(qty_percent=...) をテストします。エンジンがエグジットの約定を過剰に出せば、この戦略がそれを捕まえます。
  • request.security の各種バリエーション — lookahead=barmerge.lookahead_off を指定したうえで、ギャップがある場合とない場合の両方について、上位時間足の参照が正しいバーで解決されるかを検証します。
  • OCA エグジットグループ — strategy.oca.reduce のグループで一方のエグジットが約定したとき、同じグループのもう一方のエグジットが、約定した数量の分だけ減らされるかを検証します。
  • トレーリングストップの各種バリエーション — ギャップや指値約定をまたいでも、トレーリングストップのラチェットロジックがハイウォーターマークを正しく追跡するかをテストします。
  • UDT メソッドのテスト — Pine v6 のユーザー定義型のメソッドが、正しい C++ の struct 操作にコンパイルされるかを検証します。

このフォルダに戦略を追加するときは、「この戦略が通れば機能 X はカバーされている」という対応関係を明示しています。コミュニティのスクリプトが新しいエッジケースをあぶり出したら、たいていは最小限の合成再現ケースを書いて validation に追加します。

実際の数字

当時のコーパスにあった 167 本の戦略は、すべて同じ銘柄・同じ時間足、つまり ETHUSDT の 15 分足で実行していました。これは意図的な制約です。カノニカルな OHLCV を 1 つに揃えることで戦略間の比較に意味が生まれ、パリティ分析から銘柄固有の要因を取り除けます。

トレード数の分布:

レンジ戦略数
100 未満10
100 – 49943
500 – 99961
1,000 – 4,99947
5,000 以上6

コーパスの戦略が生成したトレード数の中央値は、バックテスト期間で 732 件でした。最少は 13 件(非常に選別的な greedy 戦略)、最多は 11,851 件です。この幅はパリティテストで効いてきます。トレードが 13 件しかない戦略でエグジットが 1 つずれれば、それだけでエラー率は 8% になります。同じバグが 5,000 トレード規模の戦略にあれば、ほとんどのトレードが一致していても、集計指標に表れます。

シャープレシオの分布:

ギャラリーのシャープレシオはトレード単位で計算していました(各トレードのリターン率の平均をその標準偏差で割った値で、年率換算はしていません)。そのため、値は小さめでした。コーパスの戦略の大半は、リスク調整後のリターンではなく、Pine の機能をカバーするために収録されていました。167 本全体のシャープレシオの中央値は 0.021 でした。バックテスト期間のトータルリターンがプラスだったのは 167 本中 106 本で、61 本はマイナスでした。

ギャラリーでは「良い」戦略だけに絞り込むことはせず、これらの数字をそのまま載せていました。アイデアを探していたなら、リターンとシャープレシオの列を見れば、どこに注目すべきかが分かりました。パリティの検証が目的なら、数字そのものは本題ではありません。重要なのは、PineForge と TradingView が同じ数字を出すことです。

コーパス入りに必要な四つのこと

コーパスに入るには、次の四つが必要です。

  1. PineForge の codegen でコンパイルできること。 コンパイルできなければ、テストもできません。これは思ったより高いハードルです。コミュニティの Pine スクリプトの中にはライブラリを import しているものがあり、codegen がそれらをコンパイルできるのは、各ライブラリのソースが渡された場合に限られます。

  2. カノニカル OHLCV 上で少なくとも 1 件のトレードを生成すること。 コンパイルはできても一度もエントリーしない戦略は、トレード一覧を何とも比較できません。

  3. TradingView の参照 CSV があること。 コーパスのすべての戦略には、TradingView の「List of Trades」エクスポートがコミットされています。通常は tv_trades.csv ですが、セルフテスト用の戦略 1 本だけは、モードごとに 1 つずつ trades-<mode>.csv があります。これがグラウンドトゥルースで、エンジンの出力はこれと diff を取ります。

  4. エンジンの出力が Pine ソースと一緒にコミットされていること。 ギャラリーは、コミットされたこれらの出力をもとに表示しています。ギャラリーの内容はその場で生成しているわけではなく、戦略を追加した日、または最後に更新した日にエンジンが出力したもののスナップショットです。

ソースではなく集計値を公開していた理由

2026年5月中旬まで、ギャラリーが公開していたのはトレード数、リターン、シャープレシオ、スパークラインで、Pine ソースや生のトレード一覧は公開していませんでした。

コミュニティのスクリプトについては、その理由がいまも当てはまります。原作者が書いたものであり、私たちにはそのソースを再配布する許可がないからです。一方、私たちが自分で書いた戦略は、その後、公開コーパス pineforge-corpus としてすべて公開しました。各戦略について、Pine ソース、生成された C++、TradingView のエクスポート、エンジンのトレード一覧がそろっています。ギャラリーからは、そのすべてにリンクしています。

ギャラリーでできること

ギャラリーは、三種類の読者に向けたものです。

アイデアを探している個人のクオンツ。 収録された戦略は、エントリーロジック、エグジットロジック、インジケーターの種類に十分なばらつきがあるので、ギャラリーを眺めれば、エンジンで何がコンパイルでき、何が動くのかをひととおり見渡せます。カテゴリで絞り込んで、スパークラインを見てみてください。

パリティの主張を検証したいエンジニア。 パリティの主張を確かめたいなら、出発点はギャラリーです。各カードには、TradingView と PineForge で記録が完全に一致したトレードの件数が表示され、戦略ページでは両方のトレード一覧を見られます。ティアを割り当てる評価基準は、検証方法のページにあります。

エンジンリリースの CI ベースライン。 当時、167 本すべてのスイープはメンテナーの手元のマシンで実行しており、エンジンの CI では実行していませんでした。現在は、コーパスのパリティを確認するワークフローが、公開コーパスの 312 本すべてを main ブランチで毎晩実行し直しています。さらに、プルリクエストはメンテナーによるフル実行でパリティの判定に合格しない限りマージされないので、どの戦略の出力が変わっても、リリース前に検出できます。

次に読む・試す