2026年九月5日 · 風險

你的回測從未被強制平倉:保證金、標記價格,以及你忽略的槓桿界線

你的回測從未被強制平倉:保證金、標記價格,以及你忽略的槓桿界線

上個月,有個生成策略跑出了一條淨值曲線,裡頭有 63% 的回撤。跌得深、慘不忍睹,接著在後續 6 週穩穩回升——這種走勢會讓研究員瞇起眼睛,覺得只要縮小部位就還撐得住。我把它重新丟進一個懂維持保證金級距的保證金引擎。帳戶在第 41 天、回撤尚未結束時就被強制平倉了;第 41 天之後的一切都是虛構。

這是我所知代價最高的一類回測錯誤,因為它不只是讓報酬率偏差幾個基點,而是把模擬中的吸收狀態整個刪掉。可能歸零的策略和不會歸零的策略,是兩種不同的策略;從不檢查保證金的回測,根本無法告訴你自己做的是哪一種。

我最常看到 3 種錯誤做法。

錯誤做法 1:把槓桿當成報酬率的乘數

最常見的做法是先根據訊號計算報酬序列,決定用 10x 槓桿,再把報酬乘上 10。有時會稍微複雜一點——部位大小設為 equity * leverage / price——但帳戶狀態仍只是單一數值,上下波動而已。沒有保證金餘額、沒有名目金額上限,也沒有失敗條件。

問題造成的破壞很隱晦,所以才逃過審查。Sharpe 不受尺度影響,因此槓桿從 3x 調到 30x,表面上的數字完全不變,研究員便認定槓桿是個免費旋鈕,只要用波動度換取報酬就好。最大回撤則線性放大,卻因為算術上的巧合而維持在 100% 以下:一串乘上倍數的報酬會漸近於零,卻永遠不會跌破零。把 -9% 的單日報酬乘以 12,在誠實的版本中會得到 -108%;在天真的版本中則可能是「-108%,但淨值曲線仍為正」,取決於你是複利計算還是直接相加。我兩種都見過。

問題在於槓桿不是套用在你的報酬上,而是套用在你的擔保品上;擔保品數量有限,交易所每秒都在監控。一旦低於維持保證金要求,部位就不再屬於你。

判斷方法:如果你的模擬在任何槓桿下都不可能出現全部虧損,那它就沒有真正模擬槓桿。

錯誤做法 2:只根據槓桿推算強平價格

第二種稍微進階的做法會加入強平檢查,通常像這樣:20x 槓桿下,5% 的不利波動會耗盡保證金,因此做多就在進場價 × 0.95 強平。乾淨、直覺,但同時在 4 個方向上都錯了。

永續合約交易場所不會看你的槓桿設定來決定何時強平,而是依照維持保證金率,並根據部位名目金額在級距表中逐級調整。以下是 BTCUSDT USDⓈ-M 的近似級距,交易場所修訂規則時也會變動:

部位名目金額(USDT)維持保證金率最高槓桿
0 – 50,0000.40%125x
50,000 – 600,0000.50%100x
600,000 – 3,000,0001.00%50x
3,000,000 – 12,000,0002.50%20x
12,000,000 – 70,000,0005.00%10x

因此,逐倉做多能承受的不利波動約為 1/L − MMR,而非 1/L。在第 2 級距使用 20x 槓桿時,是 5% − 0.5% = 4.5%。半個百分點聽起來像是四捨五入的差異。以 BTC 價格 84,000 計算,這相當於 420 美元的價格差;在劇烈波動的一小時內,420 美元可能決定你會不會被一根影線掃出場。每根影線都像擲硬幣,而你的回測把每一次結果都偏向對你有利。

接著是手續費。進場 taker 手續費會在成交當下從保證金扣除:名目金額 500,000 的 0.045% 是 225 USDT,會從 25,000 的保證金餘額中扣掉,部位甚至還沒開始波動,強平價格就已經改變。資金費率也會持續產生相同影響;對槓桿名目金額來說,影響遠比研究員預期的大:

4.55%20x 槓桿下強平所需的實際不利波動,含進場手續費
0.60%20x 槓桿、資金費率每 8 小時 0.01% 時,每日對保證金造成的資金費率拖累
18%盤整一個月後,保證金已消耗的比例

一個 30 天毫無動靜的部位——沒有不利波動,也沒有交易——已經燒掉近五分之一的擔保品,強平價格也明顯更近了。還有第 3 和第 4 個錯誤方向:加倉會改變級距,因此一開始在 0.5% 級距、後來一路加碼進入 1.0% 級距的部位,強平價格會比進場時算出的更差;而全倉保證金會讓多個部位共用擔保品,所以你的 BTC 多單能否存續,取決於 ETH 空單的狀況。如果你把全倉保證金模擬成一組互相獨立的逐倉部位,你對自己帳戶的相關結構就完全弄反了。

錯誤做法 3:用錯價格、在錯的時點、以錯的成交價處理強平

假設你抓對了觸發價。接下來要問:是什麼價格觸發?何時檢查?最後以什麼價格成交?

強平以標記價格觸發。標記價格是多個現貨交易場所指數的綜合值,含有經平滑處理的基差成分,刻意設計來避免受單一交易場所的影線影響。你的停損則可能依照設定,以最新成交價觸發。這兩個價格會在最關鍵的時候出現分歧。行情連環下跌時,永續合約的最新成交價可能在數十秒內比標記價格低 1–2%。若回測以同一個 OHLCV 最低價處理停損和強平,它模擬的交易場所根本不存在。

這兩種錯誤都真實存在,也不會互相抵銷。以最新成交價觸發強平,會把交易場所忽略的影線當成強平依據;以標記價格觸發,則可能漏掉標記價格本身移動的情況——現貨交易場所的指數偏離,確實可能讓你在永續合約上從未出現過的價格遭到強平。

再來是成交。天真的引擎會在強平價格平倉,並像停損一樣記錄虧損。實際上,部位會被強平引擎接手,成交價格是破產價格——也就是保證金恰好歸零的價位,比觸發強平的價格更差——此外還會收取強平清算費,費率依級距而定,較低級距大約是名目金額的 1%。在 20x 槓桿下,名目金額的 1% 等於剩餘保證金的 20%。如果引擎的成交價低於破產價格,保險基金會填補差額;有些交易場所若保險基金耗盡,還會將損失分攤到帳簿中獲利的一方。你的實際虧損不只是跌到強平價格的回撤,而是更多;而在流動性最薄、情況最糟的日子,額外虧損也最大。

盤中機制的時點問題,在這裡尤其致命。如果 1-minute K 線同時包含停利價和強平價,先檢查出場條件再檢查保證金的回測,會樂於把獲利記下來。交易場所會在每次標記價格更新時檢查保證金,大約每秒一次,而且優先於你原本希望發生的任何其他事。

引擎必須追蹤哪些狀態

這些都不需要多高深的設計,只需要保留狀態。帳戶是一個包含餘額的物件,而不是一串報酬;每根 K 線都要依照交易場所更新的順序處理:

  1. 錢包餘額與未實現 PnL 分開記錄。 保證金比率是維持保證金除以保證金餘額,而保證金餘額包含未實現 PnL。把兩者混為一談,會讓虧損中的部位看起來比實際上有更充足的擔保品。
  2. 每個交易標的的級距表,並依日期記錄版本。 級距會修訂。用 2026 年級距回測 2023 年,會造成隱性的前視偏誤——通常還是對策略有利的偏誤,因為交易場所長期以來通常都放寬了主流標的的要求。
  3. 標記價格序列,不只是 K 線資料。 如果找不到標記價格歷史資料,就在結果中明確說明並採用保守的替代值。絕不要默默改用最新成交價。
  4. 將保證金檢查排在該根 K 線事件順序的第一位,優先於停損、停利、訊號或再平衡。
  5. 以破產價格成交,並計入強平清算費,費率須與維持保證金率取自同一個級距列。
  6. 設置不可逆的終止狀態。 淨值歸零時,回測就結束。不重新設定基準,不「假設交易者追加保證金」,也不從新的名目金額繼續跑完整串序列。

最後一點最常引起爭論。總有人會說,真實的交易團隊會再存入擔保品,所以結束模擬太不切實際。或許如此。但「只要爆倉後繼續投入資金,這個策略就有效」這項主張,就該明白寫成這樣,並刻意納入追加資金作為明確輸入來測試,而不是偷偷設成預設值。坦白寫清楚後,大多數人就會發現自己其實不是這個意思。

這一切帶來的實際好處是:你把同一個策略以模擬交易方式對照實際交易場所運作時,交易所回報的保證金比率,應該能和模擬器算出的數字全天保持在 1 或 2 個基點內。這項一致性可以免費檢查,每分鐘都能針對每個未平倉部位進行。它是整個系統中成本最低的對等性測試,卻幾乎沒有人執行——而當兩個數字開始偏離時,交易所的數字才是對的;你有個值得在回撤替你找出問題前先修正的錯誤。

永續合約槓桿強制平倉保證金引擎回測
← 所有文章