VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
策略學院 / 策略生成

當沖演算法:如何建立與測試

當沖演算法由四個規則區塊組成:進場、出場、時段過濾,以及在交易時段結束前(例如收盤前 5 分鐘)平掉所有部位的收盤出場。沒有所謂最好的演算法。請用下一根 K 棒成交、完整交易成本與它從未見過的資料來測試。

作者 · 發佈 · 更新於 · 編輯原則

目錄
  1. 什麼是當沖演算法?
  2. 當沖演算法有哪些組成區塊?
  3. 該用哪種 K 棒週期測試,委託何時成交?
  4. 為什麼交易成本對當沖演算法衝擊這麼大?
  5. 有沒有最好的當沖演算法?
  6. 實單交易前如何檢驗當沖演算法?
  7. 常見問題
  8. 參考文獻

什麼是當沖演算法?

當沖演算法是一組規則,決定何時進場、何時出場、一天中哪些時間可以交易,並強制在交易時段收盤前讓部位回到空手。交易者一次建立一個規則區塊,用下一根 K 棒成交與完整交易成本做回測,再用未見過的資料檢驗。沒有所謂最好的演算法。

當沖是在同一個交易時段內開倉並平倉,因此不留隔夜部位。空手指的是不持有任何部位。當沖演算法把規則寫得非常精確,讓電腦不必問你任何問題就能照著執行。可以把它想成食譜:兩位廚師照著做,會做出同一道菜。需要你主觀判斷的規則,例如「市場看起來強勢時進場」,還不算演算法的一部分,因為它無法回測。當沖演算法是程式交易裡範圍較窄的一種:一樣是寫好的規則,只是每個部位都在收盤前了結。

回測是把規則套用在歷史價格資料上,列出這些規則會做出的每一筆交易。只有當回測的規則與你實際交易的規則完全相同時,回測才值得信賴。

當沖演算法有哪些組成區塊?

多數日內策略使用四個區塊:進場、出場、時段過濾,以及收盤前平倉。每個區塊回答一個問題,而且每個區塊都會改變測試結果。

區塊回答的問題規則範例(僅為示意)
進場我何時開倉?價格突破開盤前 30 分鐘高點時買進
出場我何時平掉獲利或虧損的交易?固定距離的停損;停利為該距離的兩倍
時段過濾演算法可以在哪些時間開新倉?開盤前 15 分鐘與收盤前最後 30 分鐘不開新倉
收盤前平倉一天結束時未平倉的部位怎麼處理?在交易時段結束前 5 分鐘全部平倉

時段過濾是依時間決定允許或禁止新進場的規則。日內市場並非整天表現一致。開盤後的幾分鐘常常波動最大,成交也最差。午間則常常比較平靜。有了過濾,你就能測試進場規則在某些時間窗口是否比其他時間更有效。

收盤前平倉是在交易時段結束前的固定時間,平掉所有未平倉部位的規則。正是這條規則讓演算法成為當沖演算法。請設定在實際收盤前幾分鐘,讓你的出場委託有時間成交。

收盤時間依市場而定。例如台指期的一般日盤為台灣時間 08:45 至 13:45,夜盤則是另一個獨立的交易時段。交易所可能調整交易時段,因此設定時間前請先查看交易所的合約頁面。免費的期貨交易時間工具會以你所在的時區顯示各個交易時段。同時也要決定你的 K 棒包含哪些交易時段。只含日盤的 K 棒與全時段 K 棒,即使規則相同也會得到不同結果。

台指期日盤 08:45 至 13:45 的時間軸與範例過濾時間:08:45 至 09:00 及 13:15 之後不新進場,09:00 至 13:15 允許進場,所有部位於 13:40 全數平倉,早於 13:45 收盤 只在中段進場 台指期日盤,範例時間 08:45 09:00 13:15 13:45 不新進場 允許進場 13:40 全部出場 接近收盤只管理部位。 所以:收盤前先空手。
日盤搭配示例時段過濾與收盤前平倉。過濾時間只是示意用的選擇,並非建議。

在 AlphaPrime(Valynox)中,策略生成就是以這些元件運作:規則與指標、參數範圍、進場與出場條件,以及搜尋限制。因此你從第一次執行起,就能讓時段過濾與收盤前平倉成為每個候選策略的一部分。

該用哪種 K 棒週期測試,委託何時成交?

請用演算法實際交易的 K 棒週期來測試,並且讓每個訊號在下一根 K 棒成交,而不是在產生訊號的那根 K 棒成交。

資料解析度是資料中每根價格 K 棒的長度,例如 1 分鐘、5 分鐘或 15 分鐘 K 棒。較短的 K 棒會有更多訊號與更多交易,但也包含更多雜訊,而且每筆交易通常可移動的空間較小,因此交易成本佔的比例更大。資料解析度是 AlphaPrime 回測的設定之一,同一條規則的 1 分鐘、5 分鐘與 15 分鐘版本會套用相同的手續費與滑價,成本佔的比例就能直接比較。

下一根 K 棒執行是一種成交規則:在一根 K 棒收盤時算出的訊號,於下一根 K 棒的開盤成交。這與你即時能做到的情況一致。你要等 K 棒收盤後才知道訊號,所以最早能拿到的價格就是下一個價格。若回測在同一根 K 棒的收盤價成交,用的就是你根本無法成交的價格。在日線策略上,這種誤差很小。但在平均每筆損益很小的 5 分鐘策略上,這個誤差可能比整個優勢還大。

10:00、10:05、10:10 三根 5 分鐘 K 棒:訊號在 10:05 K 棒收盤時才確定,以該收盤價成交被劃掉,箭頭指向 10:10 K 棒的開盤價,作為可成交的價位 在下一根 K 棒成交 訊號收盤時才確定 收盤出訊號 不能在此 在此成交 10:00 10:05 10:10 該收盤價已經成交不了。 所以:以下一根 K 棒開盤價成交。
下一根 K 棒執行:在一根 K 棒收盤時得知的訊號,只能在下一根 K 棒的開盤成交。

每根 K 棒內部還有第二個問題。一根 K 棒只顯示開盤、最高、最低與收盤。假設某根 5 分鐘 K 棒同時觸及你的停損與停利,資料無法告訴你哪一個先發生。有兩種解法。你可以假設停損先被觸發,這是保守的做法。或者你可以在更短的 K 棒週期上測試出場,在那裡兩個價位很少在同一根 K 棒內同時被觸及。

為什麼交易成本對當沖演算法衝擊這麼大?

當沖演算法交易頻繁,每筆賺的金額又小,所以每筆固定的成本會吃掉每筆交易獲利的一大部分。

平均每筆損益是所有交易的淨損益除以交易筆數,與每筆交易的期望值是同一個數字。免費的勝率與期望值計算器可以根據勝率與平均獲利、平均虧損算出來。對當沖演算法而言,請把平均每筆損益與一筆交易的成本相比:

扣成本後的平均每筆損益 = 毛平均每筆損益 − 一買一賣(來回)成本

毛平均每筆損益是扣除任何成本之前,每筆交易的平均結果。一買一賣(來回)成本是一筆完整交易讓你花費的所有成本,包含進場與出場的手續費與交易所費用,以及雙邊的滑價。滑價是回測假設的價格與你實際成交價格之間的差異。

假設性範例

兩個日內策略交易一種合約,其中一個跳動點價值 $5。每一個一買一賣(來回)的手續費與費用為 $4,再加上進場一個跳動點的滑價與出場一個跳動點的滑價($10)。合計每個一買一賣(來回)為 $14。

策略 A(快)策略 B(較慢)
每年交易筆數500100
毛平均每筆損益$18$70
一買一賣(來回)成本$14$14
淨平均每筆損益$4$56
每年淨損益$2,000$5,600
成本佔毛損益的比例78%20%

扣除成本之前,策略 A 看起來比較好:每年毛損益 $9,000,對比 $7,000。扣除成本後,它保留的金額不到 B 淨損益的一半。如果滑價加倍為每邊兩個跳動點,成本就變成 $24。這時策略 A 每筆虧損 $6,而策略 B 仍然每筆賺 $46。

假設範例:策略 A 扣除成本前每筆賺 18 美元,其中一買一賣成本 14 美元佔了大部分,只剩 4 美元;策略 B 每筆賺 70 美元,同樣付出 14 美元,保留 56 美元 成本相同,衝擊更大 平均每筆損益,假設範例 A:快 $14 淨 $4 B:慢 $14 淨 $56 一買一賣成本 淨損益 成本吃掉 A 平均每筆損益的 78%。 所以:第一次回測就要計入成本。
同樣是 $14 的一買一賣(來回)成本,吃掉快速策略大部分的平均每筆損益,對較慢策略則只佔一小部分(假設性範例)。

對慢速策略幾乎無關緊要的成本,卻決定了快速策略的結果。這就是為什麼成本應該放進第一次回測,而不是最後一次。如果你在排名策略時不計入成本,排名會偏向許多小額交易,之後再加入成本,大部分入選者就會被淘汰。手續費、滑價與價差在回測中的交易成本有更詳細的說明。

有沒有最好的當沖演算法?

沒有。不存在最好的當沖演算法,因為日內優勢取決於一個市場、一個交易時段與一種成本水準,而這三者都會變動。

  • 市場會變。波動、成交量與開盤附近的行為會隨年份改變。在每日波動區間很大時有效的突破規則,區間縮小時可能虧損。
  • 成本會變。手續費、交易所費用與你實際遇到的滑價都會隨時間變動。對於很小的平均每筆損益,成本小幅上升就可能讓淨損益轉為負值,如上面的範例所示。
  • 規則是特定的。在某一合約日盤調校出的進場規則,放到另一種合約或夜盤上,表現往往不同。
  • 「最好」的結果通常是一長串名單的榜首。許多變體在同一段歷史上被測試,贏家是事後挑出來的。

讓足夠多的人待在一個房間裡擲硬幣,其中一個人會連續擲出十次正面。那個人並不是擲硬幣高手;只是房間夠大。關於資料窺探的研究在交易規則上也顯示出同樣的效應。當許多規則在同一份資料上被測試,其中最好的那個可能只因偶然就看起來很強。因此公平的測試必須考慮試過多少條規則(Sullivan、Timmermann 與 White,1999;White,2000)。Bailey 及其共同作者(2014)指出,你嘗試的變體越多,最好的回測就越傾向高估策略在新資料上的表現。

實單交易前如何檢驗當沖演算法?

用規則從未見過的資料、納入交易成本來檢驗,之後才用小部位或模擬交易。

樣本外資料是未用於建立或調校規則的價格歷史。它在你的回測中扮演未來的角色。請依下列順序使用:

  1. 預留一段保留資料。在任何搜尋之前,保留歷史中最近的一部分(例如最後 20–30%)不去動它。
  2. 用其餘資料建立與調校,並開啟下一根 K 棒執行、收盤前平倉與完整交易成本。
  3. 執行推進測試。在一個窗口調校,在下一個窗口測試,向前移動並重複。推進分析說明如何選擇窗口。
  4. 對成本做壓力測試。把滑價加倍後重新執行。
  5. 拆解結果:依年份、多單與空單、以及一天中的時間來看。
  6. 只測試一次保留資料。如果你在看過它之後又修改規則,這段保留資料就不再是未見過的了。
  7. 以小部位或模擬交易,並將你的實際成交與回測假設的價格相比較。
檢查項目好跡象壞跡象
樣本外 vs 樣本內未見過的資料保留了樣本內平均每筆損益中相當明確的一部分平均每筆損益在未見過的資料上崩塌或轉為負值
滑價加倍淨平均每筆損益仍為正淨損益轉為負值
相鄰參數附近的設定給出相近的結果只有某一個精確設定有效
逐年結果大多數年份都有貢獻一兩年就創造了全部結果
多單 vs 空單兩邊的表現都能解釋一邊撐起一切,卻說不出原因

AlphaPrime 的策略檢驗把檢查依耗時分為基礎、標準與完整,並包含推進分析。你可以用相同標準對每個候選策略執行這些檢查,而不是憑肉眼逐一判斷。

如果你使用 AlphaPrime,這代表:用明確的進場、出場、時段與收盤前平倉規則來建立日內策略,並在搜尋開始前設定合理的手續費與滑價。然後依每個候選策略在從未見過的資料上的表現來評判,而不是看它最好的回測。

常見問題

最好的當沖演算法是什麼?

沒有最好的當沖演算法。日內優勢取決於市場、交易時段與成本水準,而這些都會隨時間改變。被稱為「最好」的策略,往往只是在同一段歷史上測試許多變體後的榜首結果。評判任何演算法,請看它在未見過的資料上、扣除完整交易成本後的結果。

當沖演算法該用哪種 K 棒週期?

使用策略實際交易的 K 棒週期,並以下一根 K 棒成交來測試。較短的 K 棒有更多交易,但每筆的波動較小,所以成本佔的比例更大。如果你的出場很緊,請在更短的 K 棒週期上檢查,讓同一根 K 棒很少同時觸及停損與停利。

當沖演算法一定要在交易時段結束前平倉嗎?

是的。在交易時段結束前平掉所有部位,正是讓它成為當沖演算法的原因。多數交易者會把收盤前平倉設在正式收盤前幾分鐘,讓出場委託有時間成交。收盤時間依交易所與交易時段而異,所以請查看交易所的合約頁面。

回測需要多少筆交易,才能信任當沖演算法?

沒有固定數字。你需要足夠多的交易,讓結果不取決於少數幾個不尋常的日子。一個快速的檢查方法:移除最好的幾天,看淨損益是否仍為正。也要檢查大多數年份都有貢獻,而不是只有一兩年。

參考文獻

  • Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.
  • Sullivan, R., Timmermann, A., & White, H. (1999). Data-Snooping, Technical Trading Rule Performance, and the Bootstrap. The Journal of Finance, 54(5), 1647–1691.
  • White, H. (2000). A Reality Check for Data Snooping. Econometrica, 68(5), 1097–1126.