記事の目次
根拠と適用範囲
本稿は検証ワークフローを提案するものであり、収益性の高い戦略や新たなバックテスト方法を提示するものではありません。引用文献はパターン推論、シミュレーションの仕組み、統計的過学習について論じていますが、いずれも本ライブラリに含まれるすべての手法の収益性を保証するものではありません。
実践の流れ
- 仮説を登録する市場、ルール、コスト、指標、および許可された試験を凍結する。
- 入力値を検証する特定時点での入手可能性、ボリュームの意味、対象範囲、タイムスタンプを確認してください。
- 未来情報を使わず逐次再生する注文を作成したり、約定を許可したりする前に、シグナルを確認してください。
- リスクを抑制する注文数量、証拠金、エクスポージャー、価格ギャップのストレス条件を適用する。
- ウォークフォワードを評価する重複するラベルを削除し、検証に基づいて選択し、各テストを固定します。
- 証拠の全容を報告するアブレーション、ストレステスト、不確実性、およびエビデンスレベルを公表する。
4つの異なる質問に順番に答えてください
第一に、そのパターンは一貫して認識できるか? 第二に、そのパターンにはその後の結果に関する条件付き情報が含まれているか? 第三に、その情報は実行可能な注文によるプラスの純口座収益に変換できるか? 第四に、その結果は真に未知のデータでも持続するか? 一つの質問に答える研究を、これら4つの質問に答えているかのように提示してはならない。
形式的なパターン研究は、認識と統計的推論がどのように調査できるかを示しています [1]。視覚的に説得力のあるダブルトップや統計的に異なるリターン分布は、完全なトレーディングシステムではありません。エントリー、エグジット、コスト、ポジションサイズ、機会セットが依然として経済的結果を左右します。
パフォーマンスを検証する前に、仮説カードを作成してください。対象市場、期間、入力項目、形成ルール、確認遅延、エントリーおよびエグジットの仕組み、リスク予算、コスト、ベンチマーク、評価指標、および許容されるパラメータ変動を含めてください。このカードは、チャートの見た目を解釈することなく、他の人が実行できるほど正確である必要があります。
また、有用な否定的結果も定義しておく。例えば、ボリュームフィルターは、曝露量を一致させた後、正味の期待値を増加させない可能性がある。この結果を記録しておくことで、望ましい結果が得られなかった場合でも、研究プロセスが元の質問をひっそりと置き換えることを防ぐことができる。
1。時点データとボリュームの意味
イベントが発生した日時、データが受信された日時、そして戦略でそのデータを使用できる日時を区別する必要があります。バーのタイムスタンプだけでは、フィードの遅延、修正、または公開の遅延を明らかにできない場合があります。ヒストリカルシミュレーションでは、最新の修正済みデータベースを無差別に使用するのではなく、関連する情報セットを再構築する必要があります。
安定した銘柄ID、過去の対象銘柄構成、コーポレートアクションの記録を保管します。現在生き残る株式だけでは過去の投資対象全体を再現できません。上場廃止、ティッカー再利用、新規上場、価格欠損を明示的に扱います。コーポレートアクションの効力発生日と公表日は、異なる情報利用可能性の判断に使われます。
約定には生の取引価格を、シグナルには文書化された調整規則を使用してください。連続先物系列は分析上役立つ場合がありますが、約定は実際の契約で実際の価格で行われなければなりません。ロールオーバー取引、乗数、契約満期は、滑らかに繋ぎ合わせたチャートからは推測できません。
取引量は市場固有のものです。取引所の株式取引量、先物契約取引量、FXのティックカウント、暗号資産取引所の取引量はそれぞれ異なる指標です。買い量やデルタといったラベルには、実際の分類方法が必要です。一般的なOHLCVでは、参加者の身元や市場全体の注文フローは明らかになりません。
重複するバー、欠落した間隔、あり得ないOHLC関係、負のボリューム、タイムゾーンの不連続性について、整合性テストを作成します。データセットのバージョンと修正ログを保持します。バージョン管理されていない入力が変更される再現可能なコードベースでは、再現可能な実験は生成されません。
2。確認時間と接頭辞の不変性
インデックス i におけるピボットは、その右に r 本のバーが必要となる場合、i+r より前には確定しません。分析のために i にその位置を描画することはできますが、そこで遡って取引判断を行うことはできません。occurred_at と confirmed_at を別々のフィールドとして保存し、より後のタイムスタンプから実行してください。
各時点までのデータを順に増やしてアルゴリズムを実行し、すでに公表した確定イベントが変わらないか調べます。未来データを追記しても確定イベントを改変してはいけません。明示的に暫定とした候補は変わり得ますが、既存入力が同じなら確定履歴は安定すべきです。
より長い時間軸の入力にも同様の規律が必要です。完了した一時間足の値を分足戦略に組み込むのは、一時間足の観測データが利用可能になってからにしてください。現在未完了の一時間足の最終的な高値、安値、または終値を、それ以前の分足の決定に提供することはできません。
正規化、クラスタリングパラメータ、統計モデルは、許可された履歴パーティションに基づいて適合させます。データセット全体でトレーニングされたスケーラーは、個々の取引エントリが正しく遅延されている場合でも、将来の分布情報を漏洩します。因果関係は、前処理だけでなく指標にも適用されます。
情報提供を目的としたテストでは、過去のプレフィックスを固定したまま、将来の価格と出来高を意図的に変更します。以前に確認されたシグナルが変更された場合は、チャートプラットフォームが自動的に再描画問題を解決したと想定するのではなく、依存関係を追跡してください。
3. 約定には、その前に注文が存在する必要がある
シグナルから注文作成、送信、承認、トリガー、部分約定、完了またはキャンセルまでの一連の流れを表します。各段階で遅延が発生する可能性があります。注文承認前に発生した過去の価格接触は、その注文の約定には該当しません。
プラットフォーム文書はエミュレーターの処理時刻と注文仮定の確認に役立ちます[2]。ただしシミュレーターの規約であり実際の取引所の約定保証ではありません。ストップマーケット注文は発動条件を定めますが、最終約定価格は異なる場合があります。指値注文は価格を制限しますが、約定しない場合があります[3]。
OHLCバーは、バー内のイベントの順序を明らかにしません。エントリー、ストップ、ターゲットがすべて1つのバー内にある場合は、より詳細なデータを使用するか、結果の範囲を公開してください。戦略を改善するパスをどれでも選択しないでください。また、保留注文は、その存在によって生じた不利な約定を確認した後でもキャンセルできません。
部分約定と未約定数量をモデル化します。エントリー後に保護ストップを作るなら、無保護の時間を明示します。エントリーが完了する前に方向を反転する場合は、要求した目標数量に必ず到達したと仮定せず、実際の建玉と残存注文を照合します。
コストには手数料、スプレッド、スリッページ、価格インパクト、貸株料、適用される資金調達料・金利を含め、契約が定める実際の時刻に計上します。暗号資産商品すべてに一律の資金調達間隔を当てはめず、bid/askでの約定にスプレッドが含まれるなら重ねて加算しません。
4。リスクの規模決定には一貫した単位を使用する必要があります。
線形金融商品の場合、提案されるサイズ計算式は q=floor(B/(abs(E−S)×multiplier+c_unit)) であり、B は現金損失予算、E は計画エントリー、S はストップ、c_unit は単位当たりの推定往復コストです。通貨換算では、分子と分母を同じ口座通貨で表示する必要があります。
この計算式は計画損失を推定するものであり、ギャップ損失の上限を設定するものではありません。インバース契約、オプション、非線形商品は、株式の計算式を流用するのではなく、それぞれ独自のペイオフ計算を行う必要があります。最小取引単位やブローカーの証拠金によって、実行可能な数量がさらに減少する場合があります。
合成例で口座純資産を$20,000、リスクを0.5%とするとB=$100です。エントリー100、ストップ99.50、株あたり推定コスト$0.04ならq=floor(100/0.54)=185となります。コスト込みの予定損失は$99.90です。
退出が99.20で約定した場合、価格損失$148と同じ推定コスト$7.40で合計$155.40です。これを予定予算$100へ切り詰めて報告すれば、執行リスクを測る代わりに隠すことになります。
ポートフォリオレベルでは、未決済注文に対するエクスポージャーを確保し、総名目元本と純名目元本を制限し、相関リスクを統合します。個々のポジションが小さくても、同じ市場ショックに反応する可能性があります。計画ストップリスクと、同時発生的な不利な変動下でのストレス損失の両方を報告してください。
5。ウォークフォワード評価、パージ、およびエンバーゴ
開発、検証、評価を時間軸に沿って分離する。トレーニングデータに基づいてモデルを適合させ、検証データを用いて許容設定を選択し、次のテストセグメントを評価する前に設定を固定する。この時系列的なプロセスを繰り返すことで、後知恵で選択された単一の設定ではなく、更新手順を測定できる。
ラベルは境界をまたぐことがあります。トレーニング例の結果が検証またはテスト区間にまたがる場合は、その例をトレーニングフォールドから削除してください。同様に、選択に使用する検証ラベルには、テスト区間の結果を含めないでください。推測で固定数の行を削除するのではなく、各ラベルの開始と終了を記録してください。
エンバーゴは、クロスバリデーション設計上、将来側のトレーニングサンプルがテスト期間と情報を共有できるはずの近傍の観測値を除外します。これは時系列分離の普遍的な代替手段ではなく、誤った特徴タイムスタンプを修正するものでもありません。引用されている著者のプレゼンテーションではこれらのメカニズムについて議論されていますが、任意のエンバーゴの長さが十分であるという証拠にはなりません。[4]
研究プロセスでウォークフォワードの結果を繰り返し検証する場合は、追加の最終ホールドアウトを保持してください。これらの結果が改訂の指針となった時点で、開発に影響を与えたことになります。開発情報のみを使用して最終構成を選択し、ロックされたホールドアウトを一度評価して、再調整せずに報告してください。
適合させた変換はすべてフォールド内に含めなければなりません。これには、スケーラー、特徴選択、レジーム閾値、推定が必要なボリュームベースラインなどが含まれます。前処理ステップがサンプル全体に対して適合されていた場合、慎重にパージされたラベル分割であっても、情報が漏れる可能性があります。
6。アブレーション、複数回の試行、およびストレステスト
アブレーション分析では、各コンポーネントが何を追加しているかを検証します。同じ機会範囲、規模、実行条件を用いて、価格のみ、価格にRVOLを加えたもの、価格にRVOLとVWAPを加えたものを比較します。両方で新しいインジケーターを使用する場合は、エントリーロジックとエグジットロジックを個別に変更してください。そうしないと、改善の要因が不明瞭なままになります。
失敗したアイデア、手動チャートフィルター、期間、データセット、パラメーターグリッド、市場サブセットなどを含む試行記録を維持してください。最終的に成功した構成のみを報告すると、研究者が幸運な結果を発見する機会がどれだけあったかが隠されてしまいます。
デフレートシャープレシオは、その仮定の下での選択バイアスと非正規リターン挙動に対処するものです。[5] これは、戦略が実際に利益を上げる確率ではありません。バックテストの過学習確率は、そのフレームワークにおけるパーティション間のランキング低下に関するものであり、口座資本を失う直接的な確率ではありません。[6]
1.5や2などの事前に宣言された倍率で実行コストをストレステストし、エントリーを1バー遅らせ、近くのパラメーターをテストし、上位5つのトレードへの依存性を検証します。これらは提案された感度テストです。トレンド戦略は当然ながら大きな利益に依存します。それらを削除することは有益ですが、自動的に合否を判断するルールではありません。
十分な観測数を確保して、市場局面と運用可能規模への感度を調べます。好都合な小区分を大量に作ること自体が選択問題になります。コスト後にも安定した単純な効果は、一部の例外期間に合わせた複雑な説明より説得力があります。
7。指標、期待値、およびエビデンスレベル
機会数、発注注文数、約定数、完了取引数、および利益日数をそれぞれ個別に報告してください。フィルターを使用すると、多くの利益機会を除外しながら、取引の勝率を向上させることができます。利益日数は取引の勝率とは異なり、どちらもペイオフサイズなしでは期待収益率を決定できません。
未決済ポジションとコストを含む時価評価ベースの口座資産系列からドローダウンを計算します。不規則な取引ごとのリターンを日次リターンと同一視せず、シャープレシオに用いるリターンの頻度を明記します。総リターン、CAGR、キャッシュフローの影響を受けるIRR、回帰アルファを区別して保持します。
合成戦略の勝つ確率0.40、勝ち取引の平均利益2R、負け取引の平均損失1R、コスト0.08Rなら期待値は0.40×2−0.60×1−0.08=0.12Rです。この固定損益条件で損益分岐となる勝率は(1+0.08)/(2+1)=0.36です。
別の合成戦略では、65%回の取引で勝ち、勝った場合は0.5Rの利益を得、それ以外の場合は1Rの損失を出し、コストは同じで、期待値は0.65×0.5−0.35×1−0.08=−0.105Rとなります。したがって、勝率が高いシステムでも負けるシステムは共存できます。
テールロス、アンダーウォーター期間、売買回転率、参加率、エクスポージャー、不確実性区間を含めます。記述的手法、著者報告によるバックテスト、コードとデータの再現、独立したレビュー、フォワードペーパー取引、検証済みのライブエビデンスを区別します。これらの段階は段階的に異なる質問に答えるものであり、いずれも将来の収益を保証するものではありません。
他の研究者が検証できる成果物を公開する
仮説バージョン、入力データバージョン、試験登録簿、フォールド境界、シグナルイベント、注文イベント、フィル、コスト、およびエクイティ計算をアーカイブします。中間台帳のない最終パフォーマンス表は、別の実装と矛盾する場合に診断が困難になります。
以下のパイプラインは、繰り返し使用される開発期間と最終的な保留期間を分離します。その機能は、実装およびテストするための仕様であり、実行可能な正当性の証明ではありません。特に、パージ処理ではラベル間隔を検査する必要があり、実行では実際のイベントの可用性を尊重する必要があります。
有用なレビューパッケージには、少なくとも1つの成功例、1つの失敗例、1つの拒否された注文、および可能であれば1つの曖昧なイントラバーケースを含める必要があります。シミュレーターがそれぞれをどのように処理するかを説明してください。これにより、結果が都合の悪い場合でもルールが一貫して機能するという具体的な証拠が得られます。
最終的なホールドアウトデータを確認する前に、出版指標を固定してください。最終結果が期待外れだった場合は、その旨を報告し、新たな評価計画に基づいて新しい研究バージョンを開始してください。同じホールドアウトデータに対して同じ方法を繰り返し編集すると、ホールドアウトデータが本来提供しようとしていた証拠そのものが失われてしまいます。
spec = freeze_hypothesis_and_trial_registry()
data = load_versioned_point_in_time_inputs()
assert_data_integrity(data)
assert_confirmed_events_are_prefix_invariant(data)
development, final_test = split_chronologically_before_research(data)
for fold in chronological_folds(development, spec):
train = purge_overlapping_labels(fold.train, fold.validation + fold.test)
validation = purge_overlapping_labels(fold.validation, fold.test)
model = fit_using_train_only(train)
config = select_on_validation(model, validation)
freeze(config)
events = replay_causally(fold.test, config)
fills = simulate_orders_after_available_at(events, spec.execution)
equity = mark_to_market(fills, fees=spec.costs)
archive_all_results(config, events, fills, equity)
final_config = freeze_selection_using_development_only()
evaluate_final_holdout_once(final_test, final_config)
report_net_metrics_ablations_stress_and_uncertainty()
よくある落とし穴
魅力的な検出器を収益性の高い戦略として扱う
形状、予測情報、実行性能、およびサンプル外性能は、それぞれ独立した検証段階です。いずれか1つに合格しても、他の段階の合格は保証されません。
将来の確認情報を過去に描いて整ったチャートにする
ピボットをその履歴上の位置に描画すると、後日確認される時刻が隠蔽される可能性があります。occurred_atとconfirmed_atの両方を保存し、すべての決定について情報可用性を検証してください。
あらゆるコストを小さな手数料に集約する
スプレッド、影響、借入または資金調達、および約定漏れは、手数料よりも重要になる場合があります。金融商品とその流動性について、これらの要素をモデル化してください。
手数料は現実的でも約定仮定が非現実的
手数料は、不可能なシグナルクローズの約定、有利なイントラバー順序、または保証された指値約定に対して補償することはできません。
同じ試験期間を繰り返し検査する
テスト結果に基づいて改訂が行われると、その期間は開発の一部となります。使用状況を記録し、未変更の評価段階を新たに保存してください。
勝った設定のみを保存する
試行回数と失敗したバリアントの分布がなければ、選択された戦略の有効性を過大評価してしまう可能性がある。
統計的補正を収益性証明書として使用する
DSR、PBO、およびp値は、特定の仮定の下での推論に関する疑問に対処するものです。これらは、実行テストに取って代わるものではなく、将来の口座利益を確定するものでもありません。
この手法を使う前のチェックリスト
ご自身のデータで確認した項目にチェックを入れてください。進捗はこのブラウザに保存されますが、戦略の収益性を認定するものではありません。
よくある質問
戦略が有効であることを証明するには、何回の取引が必要でしょうか?
普遍的な閾値は存在しない。不確実性は、依存性、ペイオフの裾野、市場体制、効果の大きさによって決まる。固定された取引件数を証拠として扱うのではなく、これらの特徴を報告するべきである。
コスト増によって報告された優位性が失われる場合、その戦略は却下されるべきだろうか?
取引可能なバージョンは失敗する可能性があるが、根底にある統計的関係は依然として有用である。両方の結論を報告し、総効果を実行可能な純利益として提示することは避ける。
コードを公開することで、バックテストの再現性は確保されるのか?
コードは要件の一つに過ぎません。データバージョン、企業行動に関する規則、パラメータ、試行履歴、実行前提条件なども利用可能であるか、あるいは正確に文書化されている必要があります。
研究資料
各資料は、その横に記載された定義や根拠を支えています。擬似コード、架空の例、提案パラメータは別途検証が必要です。
- Foundations of Technical Analysis: Computational Algorithms, Statistical Inference, and Empirical ImplementationAndrew W. Lo, Harry Mamaysky, Jiang Wang. パターン認識と統計的推論の原著研究を参照。本ライブラリの全ルールの収益性を示すものではありません。 確認日: .
- Pine Script — StrategiesTradingView. 戦略の発注時刻とブローカーエミュレーター挙動の一次文書を参照。取引所すべてに通用する執行モデルとは扱いません。 確認日: .
- Understanding Order Types — Investor BulletinU.S. SEC — Investor.gov. 成行・指値・ストップ注文の仕組みと約定上の限界を説明する一次資料を参照。 確認日: .
- MLX 2018 — The 7 Reasons Most Machine Learning Funds FailMarcos López de Prado — bản trình bày đăng trên SlideShare. パージとエンバーゴによるデータ分割の扱いについて著者の講演スライドを参照。金融機械学習の書籍全文を入手または読了したという主張ではありません。 確認日: .
- The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-NormalityDavid H. Bailey, Marcos López de Prado — 2014. 方法論に関する論文全文を読んだ。選択バイアス調整には仮定と試行情報が必要であり、実際の利益確率を示すものではない。 確認日: .
- The Probability of Backtest OverfittingBailey, Borwein, López de Prado, Zhu. CSCVとPBOの方法論を参照。標本外での順位低下と口座で損失が生じる確率を区別します。 確認日: .
関連する手法
リスクについて
この内容は学習と研究設計を目的とし、金融上の助言ではありません。Backtestは過去データのシミュレーションであり、将来の成果を保証せず、実際の売買注文も行いません。このライブラリの手法が、そのままアプリで利用できる機能とは限りません。関連情報: 検証方法 および 学習センター.
実際の資金を使う前にルールを検証する
アプリの対応範囲、データ、個々の模擬取引を確認してください。高度な検出手法は別途実装が必要な場合があります。
App StoreでBacktestをダウンロード