股票交易演算法:運作原理與如何測試
股票演算法是一組固定的買進、賣出與持有規則,多半屬於趨勢、均值回歸或再平衡規則。沒有單一最佳演算法,每一個都必須用乾淨的資料、真實的成本,並在它從未見過的資料上測試。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
股票交易演算法是一組固定的規則,告訴電腦何時買進、賣出或持有一檔股票。大多數屬於三大類:趨勢跟隨、均值回歸與再平衡。沒有單一最佳的演算法:結果取決於市場、成本與期間,因此每個演算法都必須在它從未見過的資料上測試。
股票交易演算法如何運作?
每個股票演算法都經由同一條簡短的步驟鏈,把價格資料轉成委託單。可以把它想成食譜:相同的食材、相同的步驟,每次都得到相同的結果,而且廚師不會疲倦,也不會緊張。
- 輸入資料。演算法讀取 K 棒。K 棒是把一段交易期間彙整為開盤、最高、最低、收盤與成交量,例如一天或五分鐘。
- 訊號。它根據 K 棒計算出某些東西,例如 50 日移動平均線是否在 200 日移動平均線之上。
- 規則。它把訊號轉成決策:「如果訊號在收盤時成立,就在下一根 K 棒的開盤買進。」
- 部位大小與出場。它決定要買多少股、停損放在哪裡,以及什麼條件會結束這筆交易。
- 下單。它把委託單送給券商,或在測試中記錄一筆模擬成交。
回測是把這些規則在歷史資料上跑一遍,報告這些規則會產生的交易與權益曲線。步驟的順序很重要。如果規則在收盤時做決定,又在同一個收盤價成交,用的就是你根本無法成交的價格。對於在 K 棒收盤時做決定的規則,在下一根 K 棒成交才是符合實際的預設做法。
股票演算法有哪些主要類型?
大多數股票演算法建立在三種想法之一:順著走勢、押注回歸正常,或按時程重設投資組合。每一種在不同的條件下獲利,也各有典型的虧損方式。
趨勢跟隨是買進已在上漲的標的(或賣出正在下跌的標的),並在走勢持續期間持有。均值回歸是指價格偏離近期平均很遠之後,傾向往平均回頭。再平衡是在固定日期把投資組合重設為目標權重,或換成新的排名股票清單。
| 方法 | 規則範例 | 典型持有時間 | 常見的交易型態 | 什麼會傷害它 |
|---|---|---|---|---|
| 趨勢跟隨 | 收盤創 100 日新高時買進;創 50 日新低時出場 | 數週到數月 | 許多小額虧損,少數大額獲利 | 橫盤、震盪的市場 |
| 均值回歸 | 短線急跌後買進,例如長期均線之上的股票 RSI 很低時;反彈後賣出 | 數天 | 許多小額獲利,偶爾一次大額虧損 | 持續下殺的走勢 |
| 再平衡 | 每月依六個月報酬率為股票清單排名,持有前 20 名 | 一個再平衡週期或更久 | 結果來自整籃股票,而非單筆交易 | 周轉成本與有偏差的股票清單 |
交易型態決定了交易這個演算法的感受。趨勢系統可以連續虧損十次,卻仍然照設計運作。均值回歸系統可以連贏好幾個月,然後在一筆交易中吐回很大一部分。在評斷結果之前,先弄清楚你測試的是哪一種型態。
股票回測有哪些特有的資料問題?
股票資料有三個專屬的陷阱:消失的公司、股票分割與股利。每一個都可能讓回測看起來比你實際能交易的歷史更好或更差。
股票回測中的倖存者偏差是什麼?
倖存者偏差是指只用今天仍然存在的股票來測試,因此破產、下市或被收購的公司都不在測試裡。把今天的指數成分股清單往回測許多年,其實悄悄地只包含贏家,因為輸家在過程中已被移出指數。
假設性範例
你用今天某個指數的 100 檔股票,往回測十年,測試「買進跌最多的股票」這條規則。十年前,指數有 100 檔不同的成分股,其中 15 檔後來崩跌並被移除。你的測試從不會買進這 15 檔,因為它們不在今天的清單裡。這條規則看起來總是在復甦之前買到低點,但只是因為從未復甦的那些下跌沒有被納入。
回測應如何處理股票分割與股利?
1 拆 2 的股票分割會讓股數加倍、價格減半,但公司的價值沒有任何改變。未調整的資料會把這顯示為隔夜下跌 50%,停損或突破規則會對一個從未發生的走勢做出反應。經分割調整的資料會把較早的價格除以分割比率,讓數列連續。
在除息日,價格通常會下跌約等於股利的金額。經股利調整的資料會調降所有較早的價格,讓這個下跌消失,數列呈現的是總報酬。放空者還必須把股利付給借出股票的人,因此跨越該日期持有的空單,成本比價格圖表顯示的更高。
| 問題 | 會出什麼錯 | 要檢查什麼 |
|---|---|---|
| 倖存者偏差 | 失敗的公司不見了,結果看起來太好 | 測試中每個日期當時的股票清單,包括已下市的股票 |
| 股票分割 | 虛假的價格跳空觸發停損與訊號 | 價格已針對每次分割調整,成交量也以同樣方式調整 |
| 股利 | 除息日出現虛假的下跌,或多單缺少收入 | 你的數列是僅含價格還是總報酬,以及空單是否要支付股利 |
| 固定價格水準 | 像「只買高於 $10 的股票」這種規則,在調整與未調整的資料上會挑出不同的股票 | 價格篩選要套用在該日期實際報出的價格上 |
成本與流動性會對股票演算法造成多大改變?
成本往往決定股票演算法是否還有任何優勢,而流動性決定這些成本有多大。價差是最佳買價與最佳賣價之間的差距。滑價是回測假設的價格與你實際成交價格之間的差異。流動性是指你能買進或賣出多少而不推動價格,在股票中通常以每日平均成交值與價差寬度來判斷。
最簡單的檢查只要一行:
淨平均每筆損益 = 毛平均每筆損益 − 一買一賣(來回)成本
毛平均每筆損益是扣除任何成本之前,每筆交易的平均結果。一買一賣(來回)成本是你進場與出場各一次所付的全部費用:手續費、兩側各一半的價差,以及兩側各自的滑價。
假設性範例
某演算法交易 500 股,毛平均每筆損益為每股 $0.06,也就是每筆 $30。在一檔價差 2 美分的流動性大型股上,兩側各負擔一半價差,每股每側 $0.01,滑價每側再加 $0.01。這是每股 $0.04,也就是 $20,再加上 $2 手續費:一買一賣(來回)成本為 $22。淨平均每筆損益為 $8。同一條規則用在價差 10 美分的小型股上,光是價差每側就要付 $0.05,每筆 $50,在還沒計入滑價與手續費之前,淨平均每筆損益就已轉為負值。
三個流動性習慣能讓股票測試更貼近實際。依每日平均成交值而不是價格來篩選股票清單。讓你的委託量維持在該股票正常日成交量的一小部分。對開盤時的交易與成交清淡的股票,模擬更寬的滑價。再平衡演算法還需要多一個數字:周轉率,也就是每次再平衡時被替換的投資組合比例,因為每個被替換的部位都要付一次完整的一買一賣(來回)成本。關於手續費與滑價設定的完整說明,請見回測中的交易成本。
有最佳的股票演算法嗎?
沒有最佳的股票演算法。表現取決於會改變的條件,而且任何搜尋得出的「最佳」結果,都會被搜尋本身灌水。
第一個原因是適配度。適合大型、緩慢移動股票的趨勢規則,可能在波動大的小型股上失敗。手續費低時有效的均值回歸規則,手續費較高時可能失效。適合某個帳戶規模的規則,對另一個帳戶可能成本太高或流動性不足。
第二個原因是篩選。想像一百個人各擲十次硬幣,總會有人擲出八次或九次正面。那個人並不是擲硬幣高手;高分來自嘗試的人數。測試許多演算法變體再留下最好的那個,道理相同。最頂尖的回測,一部分是實力,一部分是在眾多嘗試中拔得頭籌的運氣。
Sullivan、Timmermann 與 White(1999)測試了大量技術交易規則,並顯示最佳規則必須對照整個搜尋範圍來評斷,而不能單獨看。White(2000)描述了針對這類資料窺探的「現實檢驗」。Bailey、Borwein、López de Prado 與 Zhu(2014)顯示,眾多嘗試中最佳的回測,在樣本外往往表現較差。夏普比率是平均報酬除以報酬的波動程度,是每單位風險報酬的衡量。Harvey 與 Liu(2015)提議依嘗試過的策略數量,下調所報告的夏普比率。回測過度最佳化研究一文更深入探討這些想法。
交易之前如何測試股票演算法?
在任何資金承擔風險之前,用它從未見過的資料、搭配真實成本來測試股票演算法。樣本外資料是你建構過程中,規則與其參數從未見過的歷史。樣本內資料則是你用來建構與調整的部分。
- 在看結果之前,先把規則完整寫下來:股票清單、進場、出場、部位大小與再平衡日。
- 準備資料:每個日期當時的股票清單、已針對分割調整的價格,以及對股利的一個明確選擇。
- 保留樣本外資料,例如歷史中最近的部分,調整期間不要去看它。
- 在每一次執行中都納入成本與下一根 K 棒成交,而不只是最後一次。
- 執行推進分析:在一個窗口上調整,在下一個窗口上測試,往前推進並重複。此方法的說明請見推進分析。
- 計算你的變體數量。寫下你嘗試了多少種規則與參數組合,並以這個數字來評斷贏家。
- 前向測試。用即時價格執行最終規則,不投入資金或只用極小的部位,以比較實際成交與回測假設的成交。
比較兩個部分時,請留意這些跡象:
| 衡量項目 | 好的跡象 | 壞的跡象 |
|---|---|---|
| 樣本外淨平均每筆損益 | 仍明顯高於一買一賣(來回)成本 | 接近零或低於成本 |
| 樣本外交易筆數 | 有足夠的交易可供判斷,而不只是寥寥幾筆 | 交易太少,無法分辨運氣與實力 |
| 鄰近的參數設定 | 設定稍微移動時結果相近 | 只有一個精確的設定有效 |
| 最大回撤 | 大小與樣本內回撤相近 | 比樣本內的任何狀況都深得多 |
| 推進分析窗口 | 大多數窗口的表現相似 | 一兩個幸運的窗口撐起了整體 |
對每個候選策略都用同樣的方式執行這些檢查,正是策略檢驗的用途:相同的步驟、相同的門檻,並且對每個演算法都套用推進分析,而不只是你最喜歡的那一個。
如果你使用 AlphaPrime (Valynox),這代表:AlphaPrime 把這套測試紀律套用在期貨的 K 棒資料上,因此像是指數期貨上的趨勢規則這類股票市場的想法,每次測試都會納入成本、下一根 K 棒成交與樣本外檢查。倖存者與股利的問題屬於個股;指數期貨則有它自己的資料問題,也就是合約轉倉。
常見問題
對初學者來說,最好的股票演算法是什麼?
沒有哪個演算法對所有人都是最好的,因為結果取決於股票、成本與期間。不錯的起點是參數很少的簡單規則,例如在流動性佳的大型股上使用移動平均線趨勢規則。用實際的成本測試它,並保留一部分歷史不動,用於樣本外檢查。
個人交易者可以對股票使用演算法交易嗎?
可以。個人交易者可以撰寫規則、在歷史 K 棒上回測,並透過券商或交易平台執行。個人通常比的是持有期間與耐心,而不是速度,因此成本遠低於平均每筆損益的日線或週線規則,是實務上合適的起點。
股票回測中的倖存者偏差是什麼?
倖存者偏差是指只用今天仍然存在的股票來測試,而漏掉失敗或下市的公司。因為最糟的結果不見了,會讓回測看起來比現實更好。解法是使用每個日期當時的股票清單,包括之後被移除的股票。
股票回測應該使用經分割與股利調整的價格嗎?
幾乎每個股票測試都需要分割調整,因為未調整的分割看起來像是巨大的價格跳空,會觸發錯誤的訊號。股利調整則是一種選擇:總報酬資料包含股利收入,而僅含價格的資料則呈現除息日的價格下跌。選一種,並在整個測試中一致使用。
測試股票演算法需要多少資料?
你需要足夠的歷史來涵蓋數個市場階段,例如上漲、下跌與橫盤的年份。樣本外部分也需要足夠的交易筆數,才能分辨實力與運氣。快速的規則可能幾年就夠,而每月再平衡的規則則需要長得多的歷史。
參考文獻
- 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.
- 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.
- Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.
AlphaPrime 在這裡能幫上什麼
AlphaPrime 的策略生成會把趨勢與均值回歸的想法轉成可測試的規則,而它的回測在每次評估中都納入手續費、滑價、下一根 K 棒成交與交易時段。接著,策略檢驗會對每個候選策略套用推進分析與你自己設定的門檻。

