2026年11月1日 · リサーチ

ルックバックを成績に数えずにバックテストをウォームアップするには?

ルックバックを成績に数えずにバックテストをウォームアップするには?

仕様では20日Donchianは無害に見える。エージェントは20本のローリング最大値を書き、バックテストはparquetファイルの1行目から始まり、最初の2週間の「20日高値」は存在するバーの累積最大値にすぎない。4日目には4日高値である。テストしているつもりだった戦略は、最初の十数件の約定を出した戦略ではない。

手元のETHUSDT日足ノートブックでは、全サンプルSharpeは1.4。最初の20セッションを切ると0.6に落ちる。その20を残して1年目の残りを落とすと、3.1と出る。誰も明日をリークしていない。戦略は過去を使っていた。ただ量が足りず、レポートはそれらの未完成のトレードを証拠として扱った。

1.4全サンプルSharpe、未完成ウィンドウを含む
0.620セッション完成後の同じコード
3.1バーンインのトレードだけを残した場合のSharpe

ウィンドウがまだ埋まっていないうちに取引させる

よくある残骸は min_periods=1。Pandasは放っておけば1本のバーでローリング平均を計算する。エージェントはこれをしょっちゅうやる。フレーム先頭のNaNがバグに見え、埋めるとユニットテストがグリーンになるからだ。

リターン観測が2つしかない20日実現ボラのターゲットはサイズ爆発になる。2つの数の分散はコイントスで、それを逆数にすると、最初のポジションは意図したリスクの数倍になる。ほぼゼロの標準偏差に対するz-scoreも符号つきで同じ手品をやる。ウィンドウが正直になると二度と現れない剃刀のようなエントリーを、戦略が持っているように見える。

ブレイクアウトはさらに悪い。本物のルールに見えるからだ。6本目のバーでの20本チャネルは6本チャネルである。開始直後にトレードの固まりが出て、完成したインジケーターでは発火しなかった静かな区間であることが多い。静かな市場は少しドリフトする。狭いチャネルが発火する。エクイティカーブは、後のどの年も繰り返さないヘッドスタートを得る。

ゼロ埋めと前方埋めは別の嘘を発明する。RSIが0だと売られすぎに読める。欠けたATRの0はユニットサイズを爆発させ、バックテストは律儀に倉庫を買う。0が注文を発明するより、NaNが注文を殺す方がいい。

チャート左の空白の月が未完成に見えるので、今でもついrow 0からプロットしてしまう。空白の月こそ正直な部分だ。

エクイティカーブを切り取り、ポジションは残す

これはコードレビューを生き延びる。20日の特徴量を正しく計算し、プロットした曲線から最初の20行を落とし、1月21日から公開する。1月21日のポジションは1月14日に建てられている。トレーリングストップのハイウォーター、ピラミッド回数、それらのバーン後の現金。すべてが「クリーン」サンプルに入り込んでいる。

残骸は、記事に書かれた日付では開始できないペーパー戦略である。報告された開始日からフラットで再起動すると、最初の1週間の注文が食い違う。バックテストがすでにトレード中で、ペーパーシステムには入る理由がないこともある。ルックバックが冷えているためにペーパーシステムが入り、隠れた月ですでにブレイクアウトを取ったバックテストは見送りになることもある。開始帳簿は2つ、公開された開始日は1つ。

ウォークフォワードのフォールドはこれを静かにやる。各テストウィンドウにはプロットしないルックバックの尻尾がある。その尻尾のシミュレーションを飛ばすと、最初のテストトレードはまた未完成ウィンドウのトレードになる。シミュレーションしてテスト日だけを報告すると、テスト日のポジションは見せていない約定に条件付きになる。後者は正当なリサーチの選択になりうる。フォールドの最初の朝をコールドスタートと呼びながら、トレーリングストップが尻尾からすでに生きている。それが、1つの設定から2人の研究者が2つのSharpeを得る方法だ。

公開開始日からフラットで再起動してP&Lが変わるなら、ウォームアップはトラックレコードに入っている。ルックバックデータはあってよい。ルックバックのトレードはだめだ。

特徴量が日ではないのにカレンダー日でウォームアップする

「30日与えろ」では特徴量の指定が足りない。5分Donchianに30カレンダー日は、20期間のルックバックを何千本も超える。20セッション必要な日次特徴量に30日は、週末と穴次第で太すぎるか細すぎる。

私たちのperp会場の1つで、ファンディングレートのz-scoreに30日ウォームアップがついた。仕様が30期間と書いてあり、誰かが期間をカレンダーに訳したからだ。そこのファンディングは8時間ごとにプリントされる。30日は約90回の決済。30期間は10日。余分な2か月のバーンインがたまたまデペッグの週を含んでいた。それを落とすと、ライブウィンドウが戦略の本当の履歴より穏やかに見えた。人々は開始日感度を責めた。ウォームアップがレジームを食べていた。

そして暗号と株式では、誰もパラメータを編集しなくても同じ数字の意味が変わる。ETHの20「日」には土曜日が含まれる。株式の20セッションはほぼカレンダー1か月。株式ノートブックの20日ルックバックを時間足のパーペチュアルのローソク足にコピーすると、20日という名前の20時間チャネルになる。最初の有効バーは20時間後か、後の関数がリサンプルすれば20日後かで、同じエージェントのdiffで両方を見たことがある。

最初の取引可能タイムスタンプを固定する

ウォームアップはデータ要件であり、ボーナスサンプルではない。どの特徴量も、計算する単位で必要な完成観測数を名指しする。最初の取引可能タイムスタンプは、それらがすべて真であり、フラットな口座が注文を出せた最初のバーである。

特徴量仕様が通常書くこと実際に存在しなければならないもの黙って入る代用品
20日Donchian20個の日次高値20の完成セッションmin_periods=1のrunning max
30日実現ボラ30日ウィンドウ30本の終値対終値リターン2日分散を逆数にしてサイズへ
20プリントのファンディングz-score20日20回のファンディング決済20カレンダー日 (~90プリント)、または誤った時間足の20本
5mの14期間RSI14期間14本の確定5分バー14日、またはギャップを前方埋めた14本

そのタイムスタンプより前のP&Lはトラックレコードに入れない。そのタイムスタンプより前の状態はシミュレーションが必要な場合があり、時計が最初の取引可能バーに達したときトレーリングストップやクールダウンは本物だが、それらの約定はSharpe、トレード数、キャパシティ計算には入らない。それから醜いチェックを走らせる。そのタイムスタンプからフラットで再起動し、ルックバックはデータとしてだけ使えるようにする。注文が変わるなら、隠れたトレードを出荷していたことになる。

ペーパートレーディングも同じ契約で始まる。各ウォークフォワードのテストウィンドウもそうだ。チャートが1か月欠けているように見えても、欠けたままにしておけ。

バックテストデータエンジニアリングウォークフォワードAIエージェントペーパートレーディング
← 記事一覧