期貨回測怎麼做才對:合約規格、轉倉、每跳動點價值、交易成本
期貨回測需要五項股票回測用不到的設定:選定轉倉方式的連續月、每個合約正確的跳動點與點值、每口手續費加上以跳動點計的滑價、精確的交易時段與假日曆,以及由保證金和回撤推算出的帳戶規模。先依序確認這些設定,再相信回測結果。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
期貨回測和股票回測有什麼不同?
期貨回測與股票回測的差異在五項設定:合約會到期,必須接成一條連續的序列;價格以跳動點為單位移動,每個跳動點有固定的金額價值;部位以保證金持有,而不是付全額價款;手續費與滑價按每口、每一邊計算;交易分成不同時段,中間有休市與提早收盤。每一項都要各自設定。
股票回測可以略過其中大部分,因為股票沒有到期日、以已知價格全額買進,而且只在一個日盤時段交易。如果期貨回測照搬股票的設定,金額規模、交易筆數和回撤會同時算錯,而且這些錯誤不會互相抵消。下表列出有哪些地方不同。
| 設定 | 股票 | 期貨 |
|---|---|---|
| 到期 | 無,每檔股票一條序列 | 月份或季度合約,以轉倉接起來 |
| 價格單位 | 每股幾分錢 | 跳動點,每口合約有固定金額價值 |
| 資金 | 股票全額價款 | 每口合約的保證金 |
| 成本 | 按每股或每筆委託 | 手續費與交易所費用按每口、每一邊計算,再加上以跳動點計的滑價 |
| 時間 | 一個日盤時段 | 近 24 小時的交易時段,每日有休市,另有假日與提早收盤 |
如何建立連續月?該用哪一種轉倉方式?
連續月是把各個到期合約首尾相接而成的一條價格序列,而你選擇的接法,決定了每次轉倉時的價格跳空會不會在結果裡變成一筆假交易。轉倉就是停止使用即將到期的合約、改用下一個合約的那個時點。
問題很簡單。轉倉當天,舊合約可能是一個價格,新合約是另一個價格,因為在新合約到期之前,它帶有不同的資金成本與股利預期。如果只是把兩條序列直接黏起來,圖上轉倉當天會出現一個沒有人能實際交易的落差。突破規則會看到突破,停損會被觸發,回測就會記下一筆根本不存在的獲利或虧損。
常見的接法有三種,每一種保證的是不同的東西:
- 未調整。真實成交價格,落差原樣保留。適合用來確認當時螢幕上實際的價格,不適合拿來跨轉倉執行規則。
- 差額調整(也稱回溯調整)。所有較舊的價格依每次落差的大小整體上移或下移。點數差維持正確,因此以點數或跳動點衡量的停損與停利是對的。但多年前的價格水準會與歷史不符,序列很長時甚至可能低於零。
- 比率調整。較舊的價格在每次轉倉時乘上兩個合約之間的比率。百分比漲跌維持正確;點數漲跌只是近似。
轉倉時機是第二個選擇。常見的規則有兩種:到期前固定天數,或是日成交量(或未平倉量)轉移到下一個合約的那一天。成交量規則貼近多數交易者實際的做法;固定天數規則則比較容易重現。無論選哪一種,整段歷史都要用同一條規則,並把它記在結果旁邊。
還有兩點能讓轉倉處理得更誠實。第一,實際交易中,跨轉倉持有的部位要多付一次一買一賣(來回)的成本,因為你要平掉舊合約再開新合約。調整後的序列會把這件事藏起來,所以策略每跨一次轉倉持有,就要多加一次來回成本。第二,落差的大小與方向來自市場的期限結構;逆價差、正價差與連續月回測中的轉倉落差這篇文章說明了為什麼落差這一年可能是正的、下一年卻變成負的。
跳動點、每跳動點價值與點值如何影響回測?
跳動點、每跳動點價值與點值決定了績效報表中每個數字的金額規模,所以只要有一個值錯了,所有獲利、虧損與滑價數字都會被同一個錯誤倍數放大或縮小。跳動點是合約能移動的最小價格單位。每跳動點價值是一口合約一個跳動點所值的金額。點值是一個整數點所值的金額,等於每跳動點價值除以跳動點大小。
這三個數字是一條連鎖關係。知道其中兩個,第三個就跟著確定,而任何一筆交易的損益,都由點值與賺到的點數推得。
不同合約的這些值差異很大,同一個指數的全尺寸與微型版本之間也不同。期貨合約計算機列出常見合約的跳動點大小、每跳動點價值與點值,並據此算出一筆交易的損益。交易所可能調整這些規格,所以最終應以交易所的合約頁面為準。以下數值取自撰文時的 CME Group 與臺灣期貨交易所合約規格:
| 合約 | 跳動點大小 | 每跳動點價值 | 點值 |
|---|---|---|---|
| E-mini S&P 500 (ES) | 0.25 指數點 | US$12.50 | US$50 |
| Micro E-mini S&P 500 (MES) | 0.25 指數點 | US$1.25 | US$5 |
| E-mini Nasdaq-100 (NQ) | 0.25 指數點 | US$5 | US$20 |
| 台指期 (TX) | 1 指數點 | NT$200 | NT$200 |
| 小型台指期 (MTX) | 1 指數點 | NT$50 | NT$50 |
數值有誤時,會出三種問題。淨損益與回撤會被放大或縮小,策略可能無端看起來很安全或很危險。以跳動點數輸入的滑價會變成錯誤的金額。任何依金額停損決定部位大小的做法,也會算出錯誤的口數。每個合約都要檢查一次這些值,在全尺寸與微型合約之間切換時還要再檢查一次,因為兩者的比例不一定是十倍。
期貨回測該用哪些偏保守的成本假設?
期貨回測應該按每口、每一邊計入手續費加上交易所與結算費用,流動性好的合約每邊至少加一個跳動點的滑價,交易清淡的合約則加更多,然後再用兩倍滑價重跑一次,看優勢還剩多少。滑價是回測假設的價格與真實委託實際成交價格之間的差距。
成本請依這個順序處理:
- 取券商每口、每一邊的手續費,再加上該合約的交易所與結算費用。進場與出場都要收。
- 每邊加上以跳動點計的滑價。對於在主要交易時段以市價單或停損單交易的流動性好的指數期貨,一個跳動點是合理的下限。夜盤、交易清淡的合約,以及在開盤或預定新聞前後進場,要用更多。
- 用每跳動點價值把總額換成金額,得到每口一次一買一賣(來回)的成本。
- 把這個來回成本和未扣成本的平均每筆損益比較。如果未扣成本的平均每筆損益只比成本高一點點,成交比預期差時就什麼都不剩。
- 用兩倍滑價重跑。如果結果轉為負,代表策略靠的是便宜的執行,而不是價格走勢。
假設範例
某策略交易一口合約,未扣成本的平均每筆損益為 $60。手續費與交易所費用每邊 $2.50,所以每個來回 $5。這個合約的每跳動點價值為 $12.50,每邊一個跳動點的滑價,每個來回要 $25。扣成本後的平均每筆損益為 $60 − $5 − $25 = $30。若滑價加倍,每筆交易成本是 $55,只剩 $5。在一般假設下優勢已少了一半,在偏保守的假設下則幾乎全沒了。
成本屬於搜尋的一部分,不是最後才檢查的項目。如果候選策略排名時不含成本,排名會偏向交易很多筆但每筆很小的策略,其中大多數一加上成本就失敗。AlphaPrime(Valynox)在回測設定中,會以手續費、滑價與下一根 K 棒執行來評估每個候選策略,所以排名已經反映你實際能交易的結果。關於交易成本與平均每筆損益的 Learn 文章,會更深入說明如何從自己的成交紀錄估算滑價。
期貨回測需要哪些交易時段與假日資料?
期貨回測需要三項日曆資訊:策略交易哪個時段、該時段的第一根與最後一根 K 棒是哪一根,以及資料標記所用的時區。大多數指數期貨幾乎 24 小時交易,只有每日短暫休市,而交易所假日與提早收盤會讓部分交易日縮短。
以 CME Group 的股價指數期貨為例。它們從週日晚上交易到週五下午,每日有一段維護休市,時間是美中時間下午 4:00 到 5:00。美國現貨股市的交易時間為美中時間上午 8:30 到下午 3:00,所以這些合約上的「日盤」策略,只使用長得多的交易日中的這一段。臺灣期貨交易所的台指期分法不同:日盤為上午 8:45 到下午 1:45,夜盤為下午 3:00 到次日凌晨 5:00,皆為台灣時間。交易所可能調整這些時間,所以請到交易所的合約頁面,或用期貨交易時間工具確認,該工具會以你自己的時區顯示。
三項檢查可以避免最常見的時段錯誤:
- 時段選擇。決定策略交易日盤、夜盤還是兩者,並且只用這些時間建立 K 棒。包含隔夜時段的日 K,其開盤、最高與最低價,與只含現貨時段的日 K 並不相同。
- 第一根與最後一根 K 棒。要知道你的資料是以 K 棒的開始時間還是結束時間標記。「在時段收盤出場」的規則如果放在錯誤的時間標記上,會提早一根 K 棒出場,或意外持有到隔夜。
- 時區與日曆。資料可能以交易所時間、UTC 或你的當地時間標記。對台灣的交易者而言,美中時間在冬季比台灣晚 14 小時,在美國夏令時間則晚 13 小時,所以除非資料採用交易所時間,否則固定時鐘的規則每年會偏移兩次。假日與提早收盤應取自交易所日曆,這樣縮短的交易日才不會被當成資料缺漏;股市假日工具列出交易所假日與提早收盤,讓你與資料中的日期對照。
保證金該如何決定期貨回測的帳戶規模?
期貨回測的帳戶規模,應該由每口保證金加上帶有緩衝的歷史最差回撤來決定,因為同一個策略會隨你假設的帳戶規模不同,呈現出差異很大的回撤百分比。保證金是交易所要求持有一口合約所需的押金;它只是合約全額價值的一小部分,不是合約的價格。
可以把保證金想成租一個座位的租金,而不是買下整棟房子的價錢。座位讓你進場交易,但虧損是以整棟房子來衡量的。股票回測可以從買股票所付的錢起算。期貨回測沒有這樣自然的起點,所以必須自己選一個,而這個選擇決定了報表中的每一個百分比。
一條公式就夠了:
帳戶規模 = 每口保證金 × 口數 + 最差回撤 × 緩衝
這裡的「每口保證金」是交易所對一口合約的原始保證金,「口數」是你打算交易的口數,「最差回撤」是回測中以金額計的最大高點到低點虧損,「緩衝」則是大於一的倍數,容許下一次回撤比目前看到的最差一次更糟。許多交易者用 1.5 到 2 作為緩衝。
假設範例
某個交易一口合約的策略需要 $6,000 的保證金,回測中的最差回撤為 $4,000。帳戶為 $10,000 時,回撤是 40%,回撤到谷底時帳戶剛好只剩保證金,完全沒有空間承受下一筆虧損交易。帳戶為 $20,000 時,同樣的回撤是 20%,保證金之上還留有 $10,000 的緩衝。策略本身一點都沒變,變的只是起始數字。
交易所會在波動劇烈時調高保證金,往往正好是回撤發生的時候。如果回測以今天的保證金、不留緩衝來決定帳戶規模,過去就會被迫減少口數,而權益曲線不會顯示這一點。對所有要比較的策略都使用同一條帳戶規模規則,也能讓回撤百分比維持可比較;否則假設最寬鬆的那個策略永遠看起來最安全。
檢查清單:相信期貨回測之前要確認什麼
請依以下順序確認這七項設定,因為每一項都依賴前一項,而通過全部七項的期貨回測,就可以進入推進分析檢驗。例如在確認每跳動點價值之前先檢查滑價,就是在檢查一個一旦每跳動點價值被修正就會改變的數字。
- 合約規格取自交易所的合約頁面:到期月份、跳動點大小、點值、交易時間。記下你查證的日期。
- 連續月方式與轉倉日期:以跳動點為基礎的規則用差額調整,以百分比為基礎的規則用比率調整,整段歷史只用一條轉倉規則,每跨一次轉倉持有多加一次來回成本。
- 跳動點大小、每跳動點價值與點值要填入實際測試的那個合約,微型與全尺寸的值不能混用。
- 手續費、交易所費用與滑價按每口、每一邊計算,並以兩倍滑價重跑,再與未扣成本的平均每筆損益比較。
- 交易時段、時區與假日:策略交易的時段、第一根與最後一根 K 棒、資料的時間標記慣例,以及交易所的假日與提早收盤日曆。
- 下一根 K 棒執行:在某根 K 棒收盤時做出決定的規則,要在下一根 K 棒的開盤成交,絕不能在它當時看到的收盤價成交。
- 由保證金加上回撤緩衝決定的帳戶規模,對你比較的每個策略使用同一條規則。
七項都成立時,這一次單獨的回測已經做到單次回測所能做到的誠實。但它衡量的仍然只是規則對過去的擬合程度。下一步是推進分析,它在一個視窗上調整、在下一個視窗上測試,所以結果來自調整時沒看過的資料。AlphaPrime 的策略檢驗內建推進分析和你自己設定的門檻,用這七項設定做出來的期貨回測,會拿調整時沒碰過的視窗來評判。
如果你使用 AlphaPrime,這代表:手續費、滑價、交易時段與下一根 K 棒執行,都是在搜尋之前輸入的研究設定,AlphaPrime 會把它們套用到評估的每一個候選策略;連續月來自你自己的 K 棒資料,帳戶規模規則則由你套用到報表上,所以進入策略資料庫的策略,已經在你實際交易時會採用的成本與交易時段假設下被評判過。
常見問題
期貨回測用哪一種轉倉方式最好?
要看策略如何衡量距離。以跳動點或點數設定停損與停利的規則,在差額調整的序列上才會正確,因為點數差在轉倉前後得以保留。以百分比為基礎的規則,則在比率調整的序列上才會正確。未調整的序列只用來確認某一天螢幕上實際的價格。
什麼是每跳動點價值?它為什麼對回測重要?
每跳動點價值是一口合約一個跳動點所值的金額,而跳動點是合約能移動的最小價格單位。回測會把每一次價格變動乘上這個值來換算成金額,所以每跳動點價值一錯,所有獲利、虧損與滑價數字都會被同一個錯誤倍數放大或縮小。請到交易所的合約頁面,針對實際測試的合約確認這個值,因為全尺寸與微型版本並不相同。
期貨回測該假設多少滑價?
對於在主要交易時段以市價單或停損單交易的流動性好的指數期貨,先從每邊一個跳動點開始。夜盤、交易清淡的合約,以及在開盤或預定新聞前後進場,要用更多。然後用兩倍滑價重跑回測;只在較低數字下才有效的策略,靠的是執行,而不是價格走勢。
可以免費回測期貨嗎?
有些看盤平台內建免費的策略測試器,試算表也能用日 K 測試簡單的規則。比工具更重要的是設定:無論用哪一種,連續月方式、跳動點與點值、每口成本、交易時段與帳戶規模都必須設定正確。每跳動點價值錯誤或沒有處理轉倉的免費測試,告訴你的比什麼都不知道還糟,因為它看起來像一個結果。
期貨回測需要納入夜盤嗎?
只有在策略交易夜盤時才需要。日盤策略應該只用日盤的 K 棒測試,並明確設定第一根與最後一根 K 棒。隔夜持有的策略則需要全時段,因為每日休市前後與週一開盤的跳空,會成為它風險的一部分,也應該反映在回撤中。

