manifoldbt-backtester について
manifoldbt Backtesterは、指定した取引戦略をOHLCVデータで実行し、backtest-expertの評価用指標を生成するスキルです。対応する戦略ルールを検証し、コストやドローダウンを含むエンジン結果を評価器の入力形式に変換します。
主な機能
- 01戦略仕様の検証
- 02OHLCVデータでの戦略実行
- 03SMA、EMA、RSI指標への対応
- 04コスト控除後の往復取引指標の算出
- 05結果の評価器入力への変換
- 06非対応の戦略形式の拒否
活用シーン
- 01過去データでルールベース戦略を測定
- 02backtest-expert用の指標を準備
- 03手数料とスリッページを結果に反映
- 04往復取引数とドローダウン換算の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tradermonty/ claude-trading-skills --skill manifoldbt-backtesterインストール後、Claude Code で/manifoldbt-backtesterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
requirements.txtreferences/metric_bridge.mdstrategy_spec.mdscripts/bridge.pyround_trips.pyrun_backtest.pyspec.pyscripts/tests/conftest.pytest_bridge.pytest_round_trips.pytest_run_backtest.pytest_spec.py詳細
manifoldbt バックテスタースキル
目的
backtest-expert が教える内容を実行します。このスキルはバックテストを5つの観点で評価しますが、前提条件には「メトリクスはユーザーが提供する」とあり、数値を生成しないまま採点します。このスキルがその数値を生成します。実際のバーで戦略を実行し、評価ツールが求める8つの入力値を返します。
この2つは一方向に連携します。仕様を作成し、実行し、評価します。
このスキルを使用する場面
- ユーザーがルールを説明し、その測定を希望している
backtest-expertを実行しようとしているが、数値がまだない- 勝率、平均利益、平均損失、またはドローダウンをバーから算出する必要がある
- スコアリングのために戦略のパラメーター数を確定する必要がある
判定は backtest-expert に任せてください。しきい値と警告事項はそちらが担当するため、このスキルでは重複して扱いません。
前提条件
- Python 3.9+
pip install manifoldbt(Apache 2.0 with Commons Clause。無料プランでこのスキルのすべての処理を実行できます)timestamp, open, high, low, close, volume列を含む、CSV または Parquet 形式の OHLCV バー- API キーは不要です
ワークフロー
1. 戦略仕様を作成する
仕様には、インジケーターと1つのエントリー条件を記載します。仮説を明確に示す最小限のルールにしてください。ノブを追加するたびに、偶然にインサンプルへ適合しやすくなり、評価ツールではその数がペナルティの対象になります。
{
"name": "sma_cross_costed",
"indicators": {
"fast": { "type": "sma", "period": 20 },
"slow": { "type": "sma", "period": 60 }
},
"entry": { "left": "fast", "op": ">", "right": "slow" },
"size": 1.0,
"stop_loss_pct": 1.5,
"fees_bps": 5.0,
"slippage_bps": 2.0
}
各フィールドの説明:references/strategy_spec.md。
結果を確認する前に、fees_bps と slippage_bps を現実的な値に設定してください。摩擦を考慮しない実行では、約定の現実性が0点になります。保有期間が短い場合は、コストによってエッジが維持されるかどうかが決まります。
2. 実行する
python3 scripts/run_backtest.py \
--spec strategy.json \
--data bars.csv \
--symbol BTCUSDT \
--json-out result.json
スクリプトはデータに触れる前に仕様を検証するため、長時間の読み込みが終わるのを待たずに、仕様の誤りをすぐに確認できます。
3. 数値を確認する前に警告を読む
実行時には、結果の読み取り方に影響する警告が表示されます。取引数が30件未満、期間が1年未満、摩擦が未モデル化、またはエンジンの勝率とペアごとの勝率に差がある場合などです。いずれも、設定を修正して再実行する理由になります。
採点結果を出さずに引き継ぎを停止する条件が3つあります。完了した往復取引がない、最大ドローダウンが欠落しているか有限値でない、スクラッチ取引がある、のいずれかです。評価ツールにはスクラッチ取引の入力項目がありません。そのため、これらを含む母集団を渡すと、算出された期待値が完了済み取引と一致しなくなります。
4. backtest-expert に引き継ぐ
実行の最後に、コピーして貼り付けられるコマンドが表示されます。そのコマンドを実行するか、同じ数値を使って backtest-expert スキルを呼び出してください。
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 3854 --win-rate 20.24 \
--avg-win-pct 0.2917 --avg-loss-pct 0.2342 \
--max-drawdown-pct 99.2893 --years-tested 0 \
--num-parameters 3 --slippage-tested
エラーなしで誤る4つの変換
エンジンの出力と評価ツールの入力の間には、4つの変換があります。それぞれ、もっともらしい数値を出しながら、戦略の採点を誤らせます。いずれもエラーは発生しません。
約定は1回の執行、往復取引は2回の執行です。 生の取引数は、往復取引数のおよそ2倍になります。サンプルサイズの評価に約定数を渡すと、見かけ上のサンプル数が倍になり、本来は基準に達するべきでない小規模なバックテストが、しきい値を超えてしまうことがあります。
最も単純なケース以外では、買いと売りは交互になりません。 これは、ポジションを積み増さない単一銘柄のロングのみの戦略で成り立ちます。ショートでは売りがポジションを開くことがあるため、前提が崩れます。ポジションの積み増しでは、1回の決済が複数のエントリーに対応するため、前提が崩れます。ユニバースを使う場合は、複数銘柄の約定が交錯するため、前提が崩れます。このスキルは銘柄ごとにポジションを追跡し、ポジションがフラットを通過した時点で往復取引を決済します。エントリーと決済の数量および現金額は、そのライフサイクル全体で累積します。加重平均価格は表示用の値であり、損益は実際のキャッシュフローから算出されます。
コストによって小さな取引の成否が決まります。 片道7 bpsの場合、価格が0.1%上昇しても取引は損失になります。期待値は勝率と平均利益の両方から算出されるため、グロス勝率とネットの平均値を並べると、エッジを誤って表すことになります。ここでのパーセンテージは手数料控除後の値であり、確認用に gross_return_pct も併記されます。
エンジンのドローダウンは負の値になります。 評価ツールが求めるのは正の絶対値です。生の値を渡すと、38%の下落でも完璧な結果として採点されます。
対応範囲
対応対象:任意の OHLC 列に対する sma、ema、rsi。別のインジケーター、価格列、または数値に対する >、<、>=、<= を使ったエントリー条件を 1 つ設定できます。ストップロスとテイクプロフィットは任意で設定でき、手数料とスリッページはベーシスポイントで指定します。ロングのみ対応します。
非対応:複数条件によるエントリー、ショート、複数資産のユニバース、上記 3 種類以外のインジケーター。エンジンはこれらすべてに対応しています。このスキルでは、1 文の仮説から生じる形式を扱い、それ以外は中途半端に処理せず拒否します。
リファレンスファイル
references/strategy_spec.mdでは、すべての仕様フィールドとそのデフォルト値、バリデーションで拒否される内容を説明しますreferences/metric_bridge.mdでは、8 つの入力と、それぞれの導出方法、および各変換に潜む落とし穴を説明します
スクリプト
scripts/run_backtest.pyはバーに対して仕様を実行しますscripts/spec.pyは仕様を検証し、パラメーターの数を数えますscripts/round_trips.pyは約定を往復取引に対応付け、純リターンを算出しますscripts/bridge.pyは評価器の 8 つの入力を組み立てます
spec.py、round_trips.py、bridge.py には依存関係がなく、エンジンなしでインポートできるため、バックテストを実行せずにロジックをテストできます。