當沖演算法:如何建立與測試
當沖演算法由四個規則區塊組成:進場、出場、時段過濾,以及在交易時段結束前(例如收盤前 5 分鐘)平掉所有部位的收盤出場。沒有所謂最好的演算法。請用下一根 K 棒成交、完整交易成本與它從未見過的資料來測試。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
什麼是當沖演算法?
當沖演算法是一組規則,決定何時進場、何時出場、一天中哪些時間可以交易,並強制在交易時段收盤前讓部位回到空手。交易者一次建立一個規則區塊,用下一根 K 棒成交與完整交易成本做回測,再用未見過的資料檢驗。沒有所謂最好的演算法。
當沖是在同一個交易時段內開倉並平倉,因此不留隔夜部位。空手指的是不持有任何部位。當沖演算法把規則寫得非常精確,讓電腦不必問你任何問題就能照著執行。可以把它想成食譜:兩位廚師照著做,會做出同一道菜。需要你主觀判斷的規則,例如「市場看起來強勢時進場」,還不算演算法的一部分,因為它無法回測。當沖演算法是程式交易裡範圍較窄的一種:一樣是寫好的規則,只是每個部位都在收盤前了結。
回測是把規則套用在歷史價格資料上,列出這些規則會做出的每一筆交易。只有當回測的規則與你實際交易的規則完全相同時,回測才值得信賴。
當沖演算法有哪些組成區塊?
多數日內策略使用四個區塊:進場、出場、時段過濾,以及收盤前平倉。每個區塊回答一個問題,而且每個區塊都會改變測試結果。
| 區塊 | 回答的問題 | 規則範例(僅為示意) |
|---|---|---|
| 進場 | 我何時開倉? | 價格突破開盤前 30 分鐘高點時買進 |
| 出場 | 我何時平掉獲利或虧損的交易? | 固定距離的停損;停利為該距離的兩倍 |
| 時段過濾 | 演算法可以在哪些時間開新倉? | 開盤前 15 分鐘與收盤前最後 30 分鐘不開新倉 |
| 收盤前平倉 | 一天結束時未平倉的部位怎麼處理? | 在交易時段結束前 5 分鐘全部平倉 |
時段過濾是依時間決定允許或禁止新進場的規則。日內市場並非整天表現一致。開盤後的幾分鐘常常波動最大,成交也最差。午間則常常比較平靜。有了過濾,你就能測試進場規則在某些時間窗口是否比其他時間更有效。
收盤前平倉是在交易時段結束前的固定時間,平掉所有未平倉部位的規則。正是這條規則讓演算法成為當沖演算法。請設定在實際收盤前幾分鐘,讓你的出場委託有時間成交。
收盤時間依市場而定。例如台指期的一般日盤為台灣時間 08:45 至 13:45,夜盤則是另一個獨立的交易時段。交易所可能調整交易時段,因此設定時間前請先查看交易所的合約頁面。免費的期貨交易時間工具會以你所在的時區顯示各個交易時段。同時也要決定你的 K 棒包含哪些交易時段。只含日盤的 K 棒與全時段 K 棒,即使規則相同也會得到不同結果。
在 AlphaPrime(Valynox)中,策略生成就是以這些元件運作:規則與指標、參數範圍、進場與出場條件,以及搜尋限制。因此你從第一次執行起,就能讓時段過濾與收盤前平倉成為每個候選策略的一部分。
該用哪種 K 棒週期測試,委託何時成交?
請用演算法實際交易的 K 棒週期來測試,並且讓每個訊號在下一根 K 棒成交,而不是在產生訊號的那根 K 棒成交。
資料解析度是資料中每根價格 K 棒的長度,例如 1 分鐘、5 分鐘或 15 分鐘 K 棒。較短的 K 棒會有更多訊號與更多交易,但也包含更多雜訊,而且每筆交易通常可移動的空間較小,因此交易成本佔的比例更大。資料解析度是 AlphaPrime 回測的設定之一,同一條規則的 1 分鐘、5 分鐘與 15 分鐘版本會套用相同的手續費與滑價,成本佔的比例就能直接比較。
下一根 K 棒執行是一種成交規則:在一根 K 棒收盤時算出的訊號,於下一根 K 棒的開盤成交。這與你即時能做到的情況一致。你要等 K 棒收盤後才知道訊號,所以最早能拿到的價格就是下一個價格。若回測在同一根 K 棒的收盤價成交,用的就是你根本無法成交的價格。在日線策略上,這種誤差很小。但在平均每筆損益很小的 5 分鐘策略上,這個誤差可能比整個優勢還大。
每根 K 棒內部還有第二個問題。一根 K 棒只顯示開盤、最高、最低與收盤。假設某根 5 分鐘 K 棒同時觸及你的停損與停利,資料無法告訴你哪一個先發生。有兩種解法。你可以假設停損先被觸發,這是保守的做法。或者你可以在更短的 K 棒週期上測試出場,在那裡兩個價位很少在同一根 K 棒內同時被觸及。
為什麼交易成本對當沖演算法衝擊這麼大?
當沖演算法交易頻繁,每筆賺的金額又小,所以每筆固定的成本會吃掉每筆交易獲利的一大部分。
平均每筆損益是所有交易的淨損益除以交易筆數,與每筆交易的期望值是同一個數字。免費的勝率與期望值計算器可以根據勝率與平均獲利、平均虧損算出來。對當沖演算法而言,請把平均每筆損益與一筆交易的成本相比:
扣成本後的平均每筆損益 = 毛平均每筆損益 − 一買一賣(來回)成本
毛平均每筆損益是扣除任何成本之前,每筆交易的平均結果。一買一賣(來回)成本是一筆完整交易讓你花費的所有成本,包含進場與出場的手續費與交易所費用,以及雙邊的滑價。滑價是回測假設的價格與你實際成交價格之間的差異。
假設性範例
兩個日內策略交易一種合約,其中一個跳動點價值 $5。每一個一買一賣(來回)的手續費與費用為 $4,再加上進場一個跳動點的滑價與出場一個跳動點的滑價($10)。合計每個一買一賣(來回)為 $14。
| 策略 A(快) | 策略 B(較慢) | |
|---|---|---|
| 每年交易筆數 | 500 | 100 |
| 毛平均每筆損益 | $18 | $70 |
| 一買一賣(來回)成本 | $14 | $14 |
| 淨平均每筆損益 | $4 | $56 |
| 每年淨損益 | $2,000 | $5,600 |
| 成本佔毛損益的比例 | 78% | 20% |
扣除成本之前,策略 A 看起來比較好:每年毛損益 $9,000,對比 $7,000。扣除成本後,它保留的金額不到 B 淨損益的一半。如果滑價加倍為每邊兩個跳動點,成本就變成 $24。這時策略 A 每筆虧損 $6,而策略 B 仍然每筆賺 $46。
對慢速策略幾乎無關緊要的成本,卻決定了快速策略的結果。這就是為什麼成本應該放進第一次回測,而不是最後一次。如果你在排名策略時不計入成本,排名會偏向許多小額交易,之後再加入成本,大部分入選者就會被淘汰。手續費、滑價與價差在回測中的交易成本有更詳細的說明。
有沒有最好的當沖演算法?
沒有。不存在最好的當沖演算法,因為日內優勢取決於一個市場、一個交易時段與一種成本水準,而這三者都會變動。
- 市場會變。波動、成交量與開盤附近的行為會隨年份改變。在每日波動區間很大時有效的突破規則,區間縮小時可能虧損。
- 成本會變。手續費、交易所費用與你實際遇到的滑價都會隨時間變動。對於很小的平均每筆損益,成本小幅上升就可能讓淨損益轉為負值,如上面的範例所示。
- 規則是特定的。在某一合約日盤調校出的進場規則,放到另一種合約或夜盤上,表現往往不同。
- 「最好」的結果通常是一長串名單的榜首。許多變體在同一段歷史上被測試,贏家是事後挑出來的。
讓足夠多的人待在一個房間裡擲硬幣,其中一個人會連續擲出十次正面。那個人並不是擲硬幣高手;只是房間夠大。關於資料窺探的研究在交易規則上也顯示出同樣的效應。當許多規則在同一份資料上被測試,其中最好的那個可能只因偶然就看起來很強。因此公平的測試必須考慮試過多少條規則(Sullivan、Timmermann 與 White,1999;White,2000)。Bailey 及其共同作者(2014)指出,你嘗試的變體越多,最好的回測就越傾向高估策略在新資料上的表現。
實單交易前如何檢驗當沖演算法?
用規則從未見過的資料、納入交易成本來檢驗,之後才用小部位或模擬交易。
樣本外資料是未用於建立或調校規則的價格歷史。它在你的回測中扮演未來的角色。請依下列順序使用:
- 預留一段保留資料。在任何搜尋之前,保留歷史中最近的一部分(例如最後 20–30%)不去動它。
- 用其餘資料建立與調校,並開啟下一根 K 棒執行、收盤前平倉與完整交易成本。
- 執行推進測試。在一個窗口調校,在下一個窗口測試,向前移動並重複。推進分析說明如何選擇窗口。
- 對成本做壓力測試。把滑價加倍後重新執行。
- 拆解結果:依年份、多單與空單、以及一天中的時間來看。
- 只測試一次保留資料。如果你在看過它之後又修改規則,這段保留資料就不再是未見過的了。
- 以小部位或模擬交易,並將你的實際成交與回測假設的價格相比較。
| 檢查項目 | 好跡象 | 壞跡象 |
|---|---|---|
| 樣本外 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.

