本文へスキップ

7,989 件のバックテストをどう評価しているか

読了 約6分

同じ Pine スクリプトでも、2 つのバックテストがセント単位まで一致することはまずありません。「TradingView と一致」と言えるのは、何を比べ、どこまで近ければよしとするかを示してからです。評価するバックテスト 1 件とは何か、トレードを TradingView のものとどうペアにするか、5 段階の評価それぞれの条件、コード変更をどう判定するかを解説します。

TradingView と一致する、とうたうバックテスターは少なくありません。けれども、同じ Pine スクリプトの 2 つのバックテストがセント単位まで一致することは、まずありません。何を比べたのか、どこまで近ければ近いとみなすのかが分かるまで、その主張にはほとんど意味がないのです。私たちのスコアボードは、7,989 件のバックテストそれぞれに 5 つの言葉のどれか 1 つを付けていて、そのうち 7,905 件が「excellent」です。この記事では、この言葉とほかの 4 つが何を意味するのかを説明します。

1 件のバックテスト、1 つのトレード一覧

評価の単位はプローブです。プローブとは、「TradingView からトレード一覧とともにエクスポートし、同じバーの上でトレード単位で再現した戦略」のことです(codegen の README)。スクリプトは自身の入力値とデフォルト設定のまま実行し、評価では 2 つのトレード一覧を比べます。TradingView の一覧と、同じバーで PineForge が出力する一覧です。

1 本のスクリプトが、複数の市場でそれぞれプローブになることもあります。7,989 件の内訳は、公開コーパスの 312 本の戦略のうち 309 本と、TradingView のスクリプト 741 本による 7,680 件のプローブです。市場は 9 つ(暗号資産、米国の先物と株式、インドの指数、通貨ペア、金)にわたり、それぞれ 15 分足と日足で実行しています(スコアボード)。

トレードのペアリング

グレーダーは、公開されている 1 本のスクリプト verify_corpus.py です。TradingView の各トレードに対して、まだペアになっていない PineForge のトレードのうち、方向が同じで、エントリー時刻の差が 1 時間以内、エントリー価格の差がその市場の価格単位で 3.00 以内のものから、最も近いものをペアにします(ペアリング、上限値)。そのうえで測るのは 2 つです。TradingView の一覧をどれだけ再現できたか、そして再現したトレードがどれだけ近いかです。

1 つ目をカバレッジと呼びます。カバレッジは、両方の一覧が重なる区間だけでなく、決済済みの TradingView のトレードすべてを対象に数えます。理由はコードに書かれています。ほかの指標は、ペアになったトレード自体が決める期間の中で計算されます。「そのため、このゲートがなければ、ほとんど何も再現していない実行でも、たまたま再現できたわずかな部分だけで最上位の評価を得てしまう(本番で実際に観測:実カバレッジ 0.9% で『excellent』)」のです(グレーダー)。カバレッジをゲートにしたとき、コーパスの 2 本の戦略が「moderate」に下がりました。再現できていた TradingView のトレードは、それぞれ 224 件中 209 件と 241 件中 228 件で、この差は以前の期間の取り方では隠れていました。

5 つの言葉

評価再現できた TradingView のトレードトレード数エントリー価格、エグジット価格(p90)P&L(p90)
excellent99% 以上一致、かつ時刻、価格、方向が完全に同じところに TradingView が二つ以上の異なるエントリー Signals を示す場合、エンジンもそこに同じ数の個別のエントリーを示す(個別エントリーの識別)0.01% 以内1% 以内
strong95% 以上差が 6% 以内0.1%、0.5%100% 以内
moderate75% 以上、かつ重なる区間では 90% 以上
weak1 件以上
minimal0 件

「p90」は、10 件中 9 件のトレードが少なくともその近さに収まっているという意味です(しきい値、評価の段階)。ペアにならなかった TradingView のトレードが 1 件以下の一覧は、「excellent」と「strong」のカバレッジ条件を満たします。短いエクスポートの端にある 1 件のせいで評価を落とすことはありません。「excellent」では、トレード数の差をいっさい認めません。コードに書かれた理由は、「パーセントのしきい値では、大きな戦略で数十件ものトレードの欠落や余分が隠れてしまう」というものです(グレーダー)。トレーリングストップでエグジットする戦略は、エグジット価格 0.05% 以内、P&L 100% 以内という緩めの上限で評価します。トレールがバーの中のどこで約定するかは、TradingView がバー内でたどる値動きの経路によって決まるからです(グレーダー)。

最悪のトレードは表示するが、評価には使わない

評価が見るのは 90 パーセンタイルで、最悪のトレードではありません。その理由は、公開戦略の 1 本を見ると分かります。order-harbor-stop-limit-01 に対するグレーダーの出力を抜粋します。

  Matched:       471 (100.0% of TV)
  Count delta:             0.0000%  (OK; abs=0)
  PnL         p90 delta:   0.0381%  (OK)
  -- report-only (not gated; MAE/MFE are intrabar-path-limited) --
  Entry/Exit/PnL p100:   0.0011% / 0.0084% / 4.9658%
  -> excellent

評価の直前にある最後の数字を見てください。あるトレードの P&L が 5% 近くずれています。ずれの大きいトレードを出力させると(--show-diffs 3)、このトレードのエントリーは TradingView が 1,970.36、PineForge が 1,970.35 で、損失が約 51 セントのトレードだったことが分かります。約 2.5 単位で 1 セントの差なら 2.5 セントになり、2.5 セントは 51 セントの損失の 5% にあたります。最悪のトレードで評価を決めるなら、1 回のエントリーでの 1 セントの差のせいで、この戦略は「excellent」になれません。パーセンタイルならこの戦略は合格し、それでいて外れ値はレポートにきちんと表示されます。

変更の判定

評価は、その時点のコードの状態を表すものです。変更は、それが何を動かしたかで判定します。同じプローブを変更の前と後で評価し、ルールが求めるのは、ハードサーフェスでの後退がないことです。それ以外の市場と時間足は、excellent 帯と excellent+strong 帯を合算したスコアで判定します。スコアがプラスなら、帯から 1 段階を超えて落ちるプローブがないかぎり合格です。ちょうどゼロのときは、何も悪化していなければ合格です(README)。

帯を 2 つ見るのは、それぞれがもう一方では見えない動きを捉えるからです。「strong」から「excellent」に上がった戦略は 1 つ目の数だけを、「moderate」から「strong」に上がった戦略は 2 つ目の数だけを変えます。9 月のある変更は、32 件のプローブを「excellent」に引き上げました。そのうち 2 件はもともと「strong」未満だったので両方の帯で数えられ、下がったプローブもなかったため、この変更のスコアは +34 になりました。ハードサーフェスとは 15 分足の ETH レーン のことで、公開コーパスの 309 本の戦略を含む 1,009 件のプローブからなります。ほかでどれだけ改善しても、ここでは 1 件たりとも評価を下げてはいけません。

何も動かないとき

良い変更でも、何も動かさないものはたくさんあります。リファクタリング、新しい API、評価セットのどの戦略も通らないケースの修正などです。ドキュメントだけの変更なら、スイープは要りません(例)。どのプローブも帯に出入りしないコード変更は、スコアがゼロです。README のルールでは、何も悪化していなければこれで合格です。評価がひとつも変わっていなければ「no-improve-no-regression」(改善なし・後退なし)のフラグが付き、「weak」から「moderate」に上がった戦略のように、帯からは見えないところで何かが良くなっていれば、フラグは「improved」(改善あり)になります。ただし、スコアがゼロでも悪化が隠れていることがあり、その場合は不合格です。たとえば、あるプローブが両方の帯より下で「moderate」から「minimal」に落ちた場合や、下がったプローブと上がったプローブが打ち消し合った場合です。

こうした変更では、変動ゼロが期待どおりの結果です。ただ、5 つの言葉は粒度が粗いので、それだけではほかに何も変わっていないことの証明になりません。そこでエンジンの CI では、エンジンが公開コーパスで出力するすべてのトレード一覧のハッシュも固定しています。1 本の戦略でスリッページを 1 ティック変えると、「verify_corpus.py の報告は excellent=311, strong=0, anomaly=1 のままでも、その戦略のトレードとベースラインのハッシュは動く」のです(CI のドキュメント)。

押さえておきたいこと

  • ギャラリーのページでの「excellent」は、トレード数が TradingView と同じで、TradingView のトレードの 99% 以上を再現し、10 件中 9 件で価格と P&L が表の上限内に収まっている、という意味です。「excellent」では、時刻、価格、方向が完全に同じところに TradingView が二つ以上の異なるエントリー Signals を示す場合、エンジンもそこに同じ数の個別のエントリーを示します(個別エントリーの識別)。ギャラリーの戦略は、TradingView 側のアノマリーとして宣言している 1 本を除いてすべて「excellent」です。「strong」は非公開テストにしか現れません。
  • 自分のバックテスターを TradingView と比べるなら、同じやり方で比べてください。トレードはエントリーでペアにし、カバレッジは TradingView のトレード全体で数え、最悪のトレードではなくパーセンタイルを見ます。
  • 公開部分は再実行できます。README のコマンドで、コーパスの 312 本の戦略をビルドし、実行し、評価できます。非公開テストは公開していないスクリプトを私たちが独自に測定したもので、その大半は TradingView の規約に従って非公開にしているコミュニティスクリプトです。

評価は 2026-09-29 に計測したもので、計測に使ったエンジンと codegen のコードは 1.0.0 リリースに含まれています。2026-10-02 にリリースしたエンジンと codegen 1.0.1 のコードも同じ 7,989 件のプローブで評価し、評価が変わったプローブはありませんでした。

次に読むなら