2026年十月20日 · 研究

收取期貨部位轉倉成本後,策略就不再奏效了

收取期貨部位轉倉成本後,策略就不再奏效了

週二早上,我們的原油期貨趨勢策略持有即將到期的合約多頭部位。訊號完全照我們設定的方式運作:只要趨勢維持正向,就繼續持有。回測顯示小幅獲利;模擬帳戶則記錄了一筆賣出、在下一個合約買進、兩筆手續費,以及比圖表暗示更差的進場價格。

訊號本身沒有任何神祕變化。回測把「期貨價格」當成一個連續的數值;但帳戶必須平掉一個合約,再買進另一個合約,而且是在兩個不同的委託簿、以兩個不同的價格成交。

我們在檢視一筆跨越轉倉時段的部位時,發現了這個落差。策略使用流動性高的近月合約,並持有到日曆規則將部位移至次月為止。這項規則本身合理,但相關帳務處理並不合理。

我們的連續合約序列經過回溯調整,以消除合約間的價差。這讓圖表適合用來計算趨勢,但也代表序列中沒有任何實際價格,能讓我們平掉舊合約或買進新合約。回測用調整後的價格水準標記轉倉期間的交易,之後又假設部位只是自然延續,繼續交易。

對訊號來說,連續合約序列可以是實用的衡量工具;對成交來說,它卻不是真實價格。轉倉包含兩筆交易,合約間的價差是市場結構的一部分,不是可以為了讓圖表平滑而抹去的表面跳空。

2 個部位腿平掉並重新建立期貨部位
2 個委託簿各自有買價、賣價與深度
1 個訊號可能完全不需要改變

我們用兩個掛牌合約重建了這次事件。舊月份的買價是 79.98,賣價是 80.00;次月的買價是 80.42,賣價是 80.45。我們的多頭部位必須在舊合約的買價賣出,再以新合約的賣價買進。兩個可成交方向的跨月價差是 44 美分。

這個數字不代表必然損失 44 美分。兩個合約的交割月份不同,價差反映了持有成本、倉儲、融資與供應預期。部位轉倉後,仍會承受新合約價格走勢的影響;不會把報價中的整個價差當成手續費付掉。但策略必須實現舊合約的出場,並建立新合約的進場。如果報酬計算把兩者當成同一個商品來比較,就可能憑空創造或抹去 P&L。

我們在重播中把不同工作拆開處理。連續合約序列仍用來產生趨勢訊號;標記價格與下單則使用各合約自己的價格。轉倉時,模擬器會送出平倉單,賣出即將到期的月份,再送出開倉單,買進次月合約;兩個合約各自套用手續費,並依照各自委託簿的價差與可用深度估算成交。

第一次重播的結果仍與模擬帳戶不一致。我們把兩筆成交都設在同一個時間戳,儘管實際上是依序送出委託。舊月份的平倉單成交了,但買進單抵達委託簿之前,次月的賣價已經變動。若交易場所支援,可以用跨月價差單執行轉倉;也可以分成兩筆交易,在兩腿之間承受部位風險。這是兩種不同的執行假設。我們比對時採用模擬帳戶實際的下單順序。

接著我們發現,日曆規則本身也沒有明確定義。「到期前 5 天轉倉」聽起來很精確,但假日會改變交易日曆、流動性可能更早移轉,不同合約的到期慣例也可能不同。我們一處程式計算的是日曆天數,另一處計算的卻是營業日。模擬策略在最後交易日前第 5 個交易時段轉倉;回測則在最後交易日前 5 個日曆日轉倉。

轉倉日期是一項交易規則。請寫明交易所日曆,以及觸發轉倉的事件,否則回測和帳戶終究會對你持有哪個合約產生不同認定。

我們修改了轉倉指令,明確指定合約的最後交易日,依照該合約所屬交易所的日曆計算交易時段,並要求轉倉前先通過最低流動性檢查。這個門檻是實務上的防護措施,不代表一定能取得更好的成交價格:成交量和未平倉量都無法完美反映我們的委託實際能否成交。我們記錄選定的合約及兩腿價格,讓每次重播都能說明部位如何交接。

完成這些修改後,策略的歷史報酬下降了。差異並非來自某一次巨大的轉倉虧損,而是許多小幅修正累積而成:使用正確的合約、正確的交易時段、兩腿都計入實際手續費,並以各自委託簿中的價格計算出場與進場。其中一次流動性較薄的轉倉特別昂貴,所以我們保留了這筆結果,沒有用平均值把它沖淡。

如果你的期貨回測使用連續合約圖表,請確認這個圖表能用來做什麼。它可以為訊號提供一致的輸入,但不能代替你實際買進或賣出的合約。每筆跨越到期日的部位,都應在研究紀錄中列明舊合約、新合約、轉倉觸發條件、執行模型,以及因此產生的兩筆現金流。

那筆週二的交易並不是什麼高深莫測的失敗。它只是圖表上一條看似獲利的線,漏掉了帳戶必須改變持倉內容的那一刻。把那一刻放回重播後,結果沒那麼好看,卻實用得多。

期貨轉倉成本回測市場微結構交易成本
← 所有文章