Backtest Expert
バックテスト結果を5次元スコアリングで定量評価し、Deploy/Refine/Abandonの判定を下すスキルです。
API不要
スキルパッケージをダウンロード (.skill) GitHubでソースを見る
目次
1. 概要
Backtest Expertは、トレーディング戦略のバックテスト結果を体系的に評価し、実戦投入すべきか(Deploy)、改善すべきか(Refine)、放棄すべきか(Abandon)を判定するスキルです。
核心哲学:
「最も利益の出る戦略」ではなく「最も壊れにくい戦略」を見つける
主な特徴:
- 5次元スコアリング(各20点、合計100点)
- 10以上のレッドフラグ自動検出
- Deploy(70点以上)/ Refine(40-69点)/ Abandon(39点以下)の3段階判定
- API不要、外部データ依存なし(指標はユーザーが提供)
- JSON + Markdownレポートの同時出力
解決する問題:
- バックテスト結果の主観的な解釈を排除し、定量的な品質評価を実現
- カーブフィッティング、ルックアヘッドバイアス、サバイバーシップバイアスなどの一般的な罠を検出
- 「結果が良すぎる」バックテストの危険信号を早期発見
2. 前提条件
| 項目 | 要否 | 説明 |
|---|---|---|
| Python 3.9+ | 必須 | 評価スクリプト実行用 |
| APIキー | 不要 | 指標はユーザーが入力 |
| インターネット接続 | 不要 | 完全オフライン動作 |
追加のPythonパッケージのインストールは不要です(標準ライブラリのみ使用)。
バックテストの実行自体はこのスキルの範囲外です。このスキルは「バックテスト結果の評価」に特化しています。バックテストの実行にはQuantConnect、Backtrader、Ambrokerなどの専用ツールを使用してください。
3. クイックスタート
Claudeにバックテスト結果を伝えるだけで評価できます:
バックテスト結果を評価して。150トレード、勝率62%、平均利益1.8%、
平均損失1.2%、最大ドローダウン15%、8年間テスト、パラメータ3つ、
スリッページはテスト済み。
Claudeが以下の流れで処理します:
- 5次元スコアの計算(サンプルサイズ、期待値、リスク管理、堅牢性、実行リアリズム)
- レッドフラグの自動検出
- Deploy/Refine/Abandonの判定
- 改善が必要な次元の具体的なアドバイス
CLIで直接実行する場合:
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 150 \
--win-rate 62 \
--avg-win-pct 1.8 \
--avg-loss-pct 1.2 \
--max-drawdown-pct 15 \
--years-tested 8 \
--num-parameters 3 \
--slippage-tested \
--output-dir reports/
4. 仕組み
5次元スコアリングフレームワーク
各次元は0-20点で評価され、合計100点満点です。
| # | 次元 | 配点 | 評価対象 |
|---|---|---|---|
| 1 | サンプルサイズ | 20 | トレード数(30未満=0、100=15、200+=20) |
| 2 | 期待値 | 20 | 勝率 x 平均利益 vs 負率 x 平均損失 |
| 3 | リスク管理 | 20 | 最大ドローダウン(12点)+ Profit Factor(8点) |
| 4 | 堅牢性 | 20 | テスト期間(15点)+ パラメータ数(5点) |
| 5 | 実行リアリズム | 20 | スリッページ/フリクションがテスト済みか |
スコアリングの要点
- サンプルサイズ: 30未満=0点、100で15点、200+で満点。30未満は統計的に無意味
- 期待値: 勝率 x 平均利益 - 負率 x 平均損失。0以下なら0点(トレードすべきでない)
- リスク管理: ドローダウン(12点)+ Profit Factor(8点)。DD 50%超は全体0点にオーバーライド
- 堅牢性: テスト期間(15点、5年未満=0)+ パラメータ数(5点、4以下=5、8以上=0)
- 実行リアリズム: スリッページテスト済み=20点、未テスト=0点(二値判定)
判定基準
| 合計スコア | 判定 | アクション |
|---|---|---|
| 70-100 | Deploy | ストレステストを全て通過。実戦投入可能 |
| 40-69 | Refine | 核心ロジックは健全だがパラメータ調整が必要 |
| 0-39 | Abandon | ストレステストに失敗。脆弱な前提に依存 |
レッドフラグ検出
自動検出される主なレッドフラグ: トレード数30未満(高)、スリッページ未テスト(高)、ドローダウン50%超(高)、パラメータ7以上(中)、テスト期間5年未満(中)、負の期待値(高)、勝率90%超+DD5%未満(中、「結果が良すぎる」)。
5. 使用例
例1: 決算ギャップ平均回帰戦略の評価
プロンプト:
決算ギャップ+3%で日中に前日終値まで戻る平均回帰戦略のバックテストを評価して。
200トレード、勝率58%、平均利益1.5%、平均損失1.0%、最大ドローダウン12%、
10年間テスト、パラメータ4つ、スリッページテスト済み。
CLIコマンド:
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 200 \
--win-rate 58 \
--avg-win-pct 1.5 \
--avg-loss-pct 1.0 \
--max-drawdown-pct 12 \
--years-tested 10 \
--num-parameters 4 \
--slippage-tested \
--output-dir reports/
期待される結果: Deploy(高スコア)。十分なサンプルサイズ、正の期待値、適度なドローダウン、長期テスト、少ないパラメータ。
例2: テクニカルパターンスクリーナーのスコアリング
プロンプト:
カップ・ウィズ・ハンドルパターンのスクリーナー。80トレード、勝率55%、
平均利益2.5%、平均損失1.8%、最大ドローダウン22%、6年間、パラメータ5つ、
スリッページ未テスト。
CLIコマンド:
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 80 \
--win-rate 55 \
--avg-win-pct 2.5 \
--avg-loss-pct 1.8 \
--max-drawdown-pct 22 \
--years-tested 6 \
--num-parameters 5 \
--output-dir reports/
期待される結果: Refine。スリッページ未テスト(実行リアリズム=0点)がスコアを大きく下げる。サンプルサイズもやや不足。
なぜ有用か: 「まず何を改善すべきか」が明確になります。この場合、スリッページモデルの追加とサンプル拡大が最優先。
例3: レッドフラグ検出(脆弱なバックテストの特定)
プロンプト:
RSIリバーサル戦略。20トレード、勝率92%、平均利益0.8%、平均損失0.3%、
最大ドローダウン3%、3年間、パラメータ8つ、スリッページ未テスト。これは信頼できる?
CLIコマンド:
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 20 \
--win-rate 92 \
--avg-win-pct 0.8 \
--avg-loss-pct 0.3 \
--max-drawdown-pct 3 \
--years-tested 3 \
--num-parameters 8 \
--output-dir reports/
期待されるレッドフラグ: 小サンプル、スリッページ未テスト、過剰最適化、短テスト期間、結果が良すぎる – 5つ同時発生。一見優秀でも複数フラグが同時発生する結果は信頼できません。
例4: 2つの戦略の並列比較
プロンプト:
戦略A(モメンタム): 150トレード、勝率48%、利益3.2%、損失1.5%、DD25%、7年、3パラメータ
戦略B(平均回帰): 300トレード、勝率68%、利益0.9%、損失0.7%、DD18%、7年、5パラメータ
Claudeの動作: 両戦略を個別に評価し、5次元の強み・弱みを対比。同じフレームワークで横並び比較できるため、感覚的判断を排除できます。
例5: スリッページ1.5-2倍でのストレステスト
プロンプト:
スリッページを1.5倍と2倍に増やした場合のシミュレーションをして。
元: 200トレード、勝率60%、平均利益1.6%、平均損失1.0%。
1.5倍で平均利益1.525%、2倍で1.45%に下がる。
Claudeの動作: 3シナリオで評価スクリプトを実行し、期待値とProfit Factorの変化を比較表で提示。「スリッページ2倍でも正の期待値か」を判定します。
例6: パラメータ頑健性の評価
プロンプト:
ストップロスを2%, 2.5%, 3%, 3.5%, 4%で変えた結果がある。プラトーはあるか?
Claudeの動作: 5パターンをそれぞれ評価し、スコアが安定している範囲(プラトー)を特定。「2.5-3.5%の範囲でスコアが安定」→頑健性が高い、「3.0%でのみ高スコア」→カーブフィッティングの可能性、と判定します。
例7: ウォークフォワード検証
プロンプト:
ウォークフォワード検証の結果を評価して。
インサンプル(2014-2019): 勝率65%, 平均利益2.0%, 平均損失1.3%
アウトオブサンプル(2020-2023): 勝率58%, 平均利益1.6%, 平均損失1.4%
Claudeの動作: 両期間を個別に評価し、期待値の劣化率を計算。アウトオブサンプルがインサンプルの50%未満なら「要注意」、50%以上なら「許容範囲」の目安を提示します。
6. 出力の読み方
JSON出力の主要フィールド
| フィールド | 説明 |
|---|---|
total_score |
合計スコア(0-100) |
verdict |
Deploy / Refine / Abandon |
dimensions |
5次元の個別スコア(各0-20) |
red_flags |
検出されたレッドフラグのリスト |
metrics.expectancy |
期待値(%/トレード) |
metrics.profit_factor |
Profit Factor |
Markdownレポートの構成
- サマリー - 合計スコア、判定、レッドフラグ数
- 次元テーブル - 5次元の個別スコアと内訳
- 主要メトリクス - 期待値、Profit Factor、ドローダウン
- レッドフラグ詳細 - 各フラグのID、重要度、説明メッセージ
- 推奨アクション - 判定に基づく具体的な次のステップ
スコアの解釈指針
- 70+点(Deploy): 実戦投入可能。80+はほぼ全次元で高評価
- 40-69点(Refine): 核心ロジックは健全だが特定の次元(多くの場合、実行リアリズムやサンプルサイズ)に改善余地
- 0-39点(Abandon): 根本的な問題あり。複数の次元で不足
7. Tips & ベストプラクティス
バックテストの80/20ルール
- 20%: アイデアの生成とコード化に使う
- 80%: ストレステストとアイデアを壊す試みに使う
この比率を守ることで、「良い結果を見つける」バイアスを防げます。
「プラトー」を探す
- 良い戦略: ストップロス1.5%~3.0%の範囲で安定した利益
- 悪い戦略: ストップロスがちょうど2.13%のときだけ利益が出る
安定したパフォーマンスは本物のエッジの証拠。狭い最適値はカーブフィッティングの兆候です。
共通の失敗パターン
| パターン | 兆候 | 対策 |
|---|---|---|
| パラメータ過敏性 | 特定の値でのみ動作 | プラトー分析で確認 |
| レジーム依存 | 特定の年だけ好成績 | 年別分析で確認 |
| スリッページ過敏性 | コスト追加で赤字 | 1.5-2倍テスト |
| 小サンプル | 30未満のトレード | データ拡張/期間延長 |
| ルックアヘッドバイアス | 非現実的に良い結果 | タイムスタンプ監査 |
このスキルはシステマティック/定量的バックテストに特化しています。裁量トレーダーの手法評価には枠組みが必ずしも適用できません。
8. 他スキルとの連携
Earnings Trade Analyzer → Backtest Expert
決算ギャップの統計を蓄積し、Deploy/Refine/Abandon判定に活用。
Backtest Expert → Position Sizer
Deploy判定済みの勝率・平均損益をKelly Criterionに入力し、最適リスク配分を計算。
PEAD Screener → Backtest Expert
PEADシグナルの精度と損益統計をスコアリングし、実運用移行の可否を判定。
9. トラブルシューティング
「avg_loss_pct must be >= 0」エラー
原因: --avg-loss-pct に負の値を入力した
対処:
- 平均損失は正の数値で入力してください(例: 1.2%の損失なら
--avg-loss-pct 1.2) - スクリプトが内部で符号を処理します
実行リアリズムが常に0点
原因: --slippage-tested フラグが指定されていない
対処:
- スリッページ/フリクションをテスト済みの場合は
--slippage-testedフラグを追加 - この次元は二値判定(0点 or 20点)のため、スコアへの影響が大きい
- スリッページをまだテストしていない場合は、1.5-2倍のスリッページでバックテストを再実行してください
スコアが低い原因がわからない
対処:
- Markdownレポートの次元テーブルで、各次元の個別スコアを確認
- 最も低い次元が改善の最優先項目
- レッドフラグのリストも併せて確認(具体的な問題点と改善策が記載)
Profit Factorの計算が合わない
原因: PF 1.0-3.0を線形で0-8点に変換後、int()で整数に切り捨て。例: PF 1.25→1点、PF 1.50→2点。この離散化は意図的な設計です。
10. リファレンス
CLIオプション一覧
python3 skills/backtest-expert/scripts/evaluate_backtest.py [OPTIONS]
| オプション | 説明 | デフォルト |
|---|---|---|
--total-trades |
バックテストのトレード数(必須) | - |
--win-rate |
勝率(%単位、例: 58)(必須) | - |
--avg-win-pct |
平均利益トレード(%)(必須) | - |
--avg-loss-pct |
平均損失トレード(%、正の数値)(必須) | - |
--max-drawdown-pct |
最大ドローダウン(%)(必須) | - |
--years-tested |
バックテスト期間(年数)(必須) | - |
--num-parameters |
戦略のチューナブルパラメータ数(必須) | - |
--slippage-tested |
スリッページ/フリクションがテスト済みか(フラグ) | false |
--output-dir |
レポート出力先ディレクトリ | reports/ |
スコアリング早見表
| 次元 | 0点 | 10点 | 20点 |
|---|---|---|---|
| サンプルサイズ | <30トレード | ~70トレード | 200+トレード |
| 期待値 | 0%以下 | ~0.5% | 1.5%+ |
| リスク管理 | DD 50%+ or PF<1.0 | DD ~25%, PF ~1.5 | DD <20%, PF 3.0+ |
| 堅牢性 | <5年, 8+パラメータ | 7年, 5パラメータ | 10+年, 4以下パラメータ |
| 実行リアリズム | 未テスト | - | テスト済み |
スリッページの目安
ストレステストでは典型値の1.5-2倍を使用。メガキャップ: 0.01-0.02%(テスト時0.02-0.04%)、ラージ: 0.02-0.05%、ミッド: 0.05-0.10%、スモール: 0.10-0.20%、マイクロ: 0.20-0.50%+。
関連ファイル
| ファイル | 説明 |
|---|---|
skills/backtest-expert/SKILL.md |
スキル定義(ワークフロー) |
skills/backtest-expert/references/methodology.md |
テスト方法論の詳細(ストレステスト、バイアス防止等) |
skills/backtest-expert/references/failed_tests.md |
失敗パターン事例集とレッドフラグチェックリスト |
skills/backtest-expert/scripts/evaluate_backtest.py |
5次元評価スクリプト |