先月、生成したストラテジーのエクイティカーブに63%のドローダウンが出ました。深く、ひどい落ち込みのあと、続く6週間できれいに回復する――研究者が目を細めて眺め、サイズを落とせば耐えられると判断する、あの形です。維持証拠金のティアを把握する証拠金エンジンに通して再実行したところ、ドローダウンの途中、41日目に口座が清算されました。41日目以降はすべて作り話でした。
私が知る限り、これは最も高くつくバックテストのバグです。リターンを数ベーシスポイント歪めるのではありません。シミュレーションから、いったん入ると抜け出せない状態を消してしまいます。ゼロになり得るストラテジーと、そうならないストラテジーは別物です。証拠金を一度も確認しないバックテストでは、自分がどちらを扱っているのか分かりません。
私が何度も目にする、誤ったやり方を3つ紹介します。
誤りその1:リターンに掛けるだけのレバレッジ倍率
最もよくある形です。シグナルからリターン系列を計算し、10xで運用すると決めて、倍率を掛ける。少し凝ったものでは、ポジションサイズをequity * leverage / priceとすることもありますが、口座の状態は依然として上下するだけの単一の数値です。証拠金残高も、名目額の上限も、破綻条件もありません。
問題は見つけにくく、だからレビューをすり抜けます。Sharpeはスケール不変なので、レバレッジを3xから30xに変えても、見出しになる数値は動きません。研究者は、レバレッジはボラティリティとリターンを交換する無料のつまみだと考えてしまいます。最大ドローダウンは算術上の偶然で線形に拡大しても100%未満に収まります。リターンを何倍しても、系列は漸近的にゼロへ近づくだけで、そこを下回らないからです。-9%の日を12倍すると、正しく計算すれば-108%になります。一方、単純な実装では、複利計算か単純合算かによって、「-108%なのにエクイティカーブはまだプラス」という結果になります。両方の例を見たことがあります。
欠けているのは、レバレッジをリターンに掛けるのではないという点です。レバレッジを掛けるのは担保であり、担保は有限の資金です。取引所はそれを毎秒監視しています。残高が維持証拠金の要件を下回ると、そのポジションは自分のものではなくなります。
見分けるポイント:どのレバレッジでもシミュレーション上で全損になり得ないなら、それはレバレッジをモデル化できていません。
誤りその2:レバレッジだけから清算価格を算出する
もう一段進んだ実装では清算チェックを加えます。たとえば、20xなら不利な値動きが5%に達すると証拠金が尽きるので、ロングはエントリー価格×0.95で清算する、といった具合です。分かりやすく、直感的ですが、4つの点で同時に間違っています。
無期限先物の取引所は、レバレッジ設定を使って清算のタイミングを決めるわけではありません。ポジションの名目額に応じて段階的に上がる維持証拠金率を、ティア表に基づいて使います。BTCUSDT USDⓈ-Mの概算例です。取引所の改定に伴って変わります:
| ポジション名目額(USDT) | 維持証拠金率 | 最大レバレッジ |
|---|---|---|
| 0 – 50,000 | 0.40% | 125x |
| 50,000 – 600,000 | 0.50% | 100x |
| 600,000 – 3,000,000 | 1.00% | 50x |
| 3,000,000 – 12,000,000 | 2.50% | 20x |
| 12,000,000 – 70,000,000 | 5.00% | 10x |
つまり、分離マージンのロングで耐えられる不利な値動きは、およそ1/L − MMRであり、1/Lではありません。2つ目のティアで20xなら、5% − 0.5% = 4.5%です。0.5%は丸め誤差に聞こえるかもしれません。BTCが84,000ドルなら価格にして420ドルです。荒れた1時間のうちでは、その420ドルがヒゲでポジションを失うか、持ちこたえるかの分かれ目です。すべてのヒゲがコイントスなのに、どれも自分に有利な方向へ偏らせていることになります。
さらに手数料があります。エントリー時のtaker手数料は約定した瞬間に証拠金から差し引かれます。名目額500,000に対する0.045%は225 USDTで、証拠金残高25,000 USDTから引かれます。ポジションが何も動いていないうちに、清算価格が変わるのです。ファンディングも継続的に同じ影響を与えます。レバレッジをかけた名目額では、研究者が思うよりずっと大きくなります:
不利な値動きも取引もなく、30日間何も起きないポジションでも、担保の5分の1近くが削られ、清算価格は目に見えて近づきます。間違いの3つ目と4つ目はこうです。ポジションを追加するにつれてティアが変わるため、0.5%のティアで始めたポジションを買い増して1.0%のティアに入れると、エントリー時に計算したものより清算価格が不利になります。また、クロスマージンでは複数のポジションが担保を共有するので、BTCロングが生き残れるかはETHショートの状況にも左右されます。クロスマージンを、互いに独立した分離ポジションの集合としてシミュレーションしているなら、自分の口座の相関構造を逆に捉えています。
誤りその3:誤った価格を誤ったタイミングで使い、誤った価格で清算を処理する
トリガー水準は正しく設定できたとしましょう。では、どの価格がその水準を超えたら、いつチェックし、どの価格で約定するのでしょうか?
清算はマーク価格を基準に発動します。マーク価格は複数の現物取引所の価格と平滑化されたベーシス要素から算出され、単一取引所のヒゲに左右されにくいよう設計されています。一方、ストップロスは設定次第ですが、おそらく最終約定価格を基準に発動します。この2つの価格が食い違うのは、まさに重要な局面です。急落時には、無期限先物の最終価格がマーク価格を1–2%下回る状態が数十秒続くことがあります。ストップと清算の両方を同じOHLCVの安値で判定するバックテストは、実在しない取引所をモデル化しています。
ここでは、どちらの誤りも起こり得ますし、互いに相殺もしません。最終価格を基準にすると、取引所が無視したヒゲで清算されます。マーク価格を基準にすると、マーク価格自体が動いたケースを見落とします。現物取引所で指数価格が乖離すれば、取引していた無期限先物では一度も付かなかった価格で清算されることも現実にあります。
次は約定です。単純なエンジンは清算価格でポジションを閉じ、ストップにかかったかのように損失を計上します。実際には、ポジションは清算エンジンに引き継がれ、破産価格で処理されます。破産価格は証拠金がちょうどゼロになる水準で、トリガー価格より不利です。さらに、ティアに応じた清算手数料が上乗せされ、下位ティアでは名目額の約1%になることもあります。20xでは、名目額の1%は残っている証拠金の20%にあたります。破産価格を下回って約定した場合は保険基金が差額を負担します。取引所によっては基金が枯渇すると、損失が利益側の注文板にも分担されます。実現損失は清算価格までのドローダウンではありません。それより大きく、板が薄くて最悪の事態になりやすい日に、その差も最大になります。
バー内の値動きに関するタイミングの問題も、ここでは普段以上に深刻です。1-minuteバーの中に利確水準と清算水準の両方が含まれているとき、証拠金チェックより先に決済を判定するバックテストは、平気で利益を計上します。取引所はマーク価格が更新されるたび、およそ1秒ごとに、ほかに起きてほしかったことより先に証拠金をチェックします。
代わりにエンジンが保持すべきもの
どれも複雑な仕組みは要りません。必要なのは状態を持たせることです。口座はリターン系列ではなく残高を持つオブジェクトであり、各バーで取引所が行う順番どおりに更新します:
- ウォレット残高と未実現PnLを別々に管理する。 証拠金比率は維持証拠金を証拠金残高で割った値であり、証拠金残高には未実現PnLが含まれます。これらを混同すると、含み損のあるポジションが実際より多く担保されているように見えてしまいます。
- すべての銘柄のティア表を、日付ごとにバージョン管理する。 ティアは改定されます。2023年のバックテストを2026年のティアで実行すると、気づきにくい先読みになります。通常は有利な方向です。主要銘柄では、取引所が時間とともに要件を緩和してきたからです。
- ローソク足データだけでなく、マーク価格の系列を使う。 マーク価格の履歴を取得できないなら、結果にその旨を明記し、保守的な代替値を使ってください。最終価格で黙って代用してはいけません。
- バー内のイベント処理では、最初に証拠金をチェックする。ストップ、利確目標、シグナル、リバランスより前です。
- 破産価格で約定させ、清算手数料を加える。手数料率はMMRと同じティア行から読み取ります。
- 吸収状態となる終了条件を設ける。 エクイティがゼロになったら実行を終了します。基準を置き直したり、「トレーダーが追加資金を入れると仮定」したり、新しい名目額で系列を再開したりしません。
最後の点は、最も議論になりがちです。必ず誰かが、実際の運用デスクなら追加担保を入れるのだから、シミュレーションをそこで終わらせるのは非現実的に厳しいと言います。そうかもしれません。しかし「資金を吹き飛ばしたあとも入金し続ければ、このストラテジーは機能する」という主張は、その言葉どおりに明示し、追加資金を明確な入力として、意図的に検証すべきです。デフォルトの仮定に紛れ込ませてはいけません。正直に書き下ろしてみると、そういうつもりではなかったと気づく人がほとんどです。
これを実装する実益は、同じストラテジーをライブ取引所に対してペーパー運用するとき、取引所が表示する証拠金比率とシミュレーターの計算値が、1日を通して1〜2ベーシスポイント以内で追随することです。この一致は、すべてのオープンポジションについて毎分、無料で確認できます。システム全体で最も手軽なパリティテストなのに、実施している人はほとんどいません。そして2つの数値がずれたら、正しいのは取引所側です。ドローダウンに発見させられる前に見つけるべきバグがあります。
← 記事一覧


