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

股票交易演算法:運作原理與如何測試

股票演算法是一組固定的買進、賣出與持有規則,多半屬於趨勢、均值回歸或再平衡規則。沒有單一最佳演算法,每一個都必須用乾淨的資料、真實的成本,並在它從未見過的資料上測試。

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

目錄
  1. 股票交易演算法如何運作?
  2. 股票演算法有哪些主要類型?
  3. 股票回測有哪些特有的資料問題?
  4. 股票回測中的倖存者偏差是什麼?
  5. 回測應如何處理股票分割與股利?
  6. 成本與流動性會對股票演算法造成多大改變?
  7. 有最佳的股票演算法嗎?
  8. 交易之前如何測試股票演算法?
  9. 常見問題
  10. 參考文獻

股票交易演算法是一組固定的規則,告訴電腦何時買進、賣出或持有一檔股票。大多數屬於三大類:趨勢跟隨、均值回歸與再平衡。沒有單一最佳的演算法:結果取決於市場、成本與期間,因此每個演算法都必須在它從未見過的資料上測試。

股票交易演算法如何運作?

每個股票演算法都經由同一條簡短的步驟鏈,把價格資料轉成委託單。可以把它想成食譜:相同的食材、相同的步驟,每次都得到相同的結果,而且廚師不會疲倦,也不會緊張。

  1. 輸入資料。演算法讀取 K 棒。K 棒是把一段交易期間彙整為開盤、最高、最低、收盤與成交量,例如一天或五分鐘。
  2. 訊號。它根據 K 棒計算出某些東西,例如 50 日移動平均線是否在 200 日移動平均線之上。
  3. 規則。它把訊號轉成決策:「如果訊號在收盤時成立,就在下一根 K 棒的開盤買進。」
  4. 部位大小與出場。它決定要買多少股、停損放在哪裡,以及什麼條件會結束這筆交易。
  5. 下單。它把委託單送給券商,或在測試中記錄一筆模擬成交。

回測是把這些規則在歷史資料上跑一遍,報告這些規則會產生的交易與權益曲線。步驟的順序很重要。如果規則在收盤時做決定,又在同一個收盤價成交,用的就是你根本無法成交的價格。對於在 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)提議依嘗試過的策略數量,下調所報告的夏普比率。回測過度最佳化研究一文更深入探討這些想法。

交易之前如何測試股票演算法?

在任何資金承擔風險之前,用它從未見過的資料、搭配真實成本來測試股票演算法。樣本外資料是你建構過程中,規則與其參數從未見過的歷史。樣本內資料則是你用來建構與調整的部分。

  1. 在看結果之前,先把規則完整寫下來:股票清單、進場、出場、部位大小與再平衡日。
  2. 準備資料:每個日期當時的股票清單、已針對分割調整的價格,以及對股利的一個明確選擇。
  3. 保留樣本外資料,例如歷史中最近的部分,調整期間不要去看它。
  4. 在每一次執行中都納入成本與下一根 K 棒成交,而不只是最後一次。
  5. 執行推進分析:在一個窗口上調整,在下一個窗口上測試,往前推進並重複。此方法的說明請見推進分析。
  6. 計算你的變體數量。寫下你嘗試了多少種規則與參數組合,並以這個數字來評斷贏家。
  7. 前向測試。用即時價格執行最終規則,不投入資金或只用極小的部位,以比較實際成交與回測假設的成交。
時間軸分為較長的樣本內區段(用於建構與調整)和較短的樣本外區段(用於測試);在樣本外區段,一條權益曲線持續上升並維持穩健,另一條則因為只擬合了雜訊而趨於平緩 在新資料上站得住腳嗎? 兩種可能的樣本外結果 站得住腳 擬合雜訊 樣本內 樣本外 唯有新資料能顯示真本事。 因此:調整結束後只測一次。
在樣本內部分建構與調整,然後在樣本外部分只測試一次。樣本外的曲線顯示規則是真的學到了東西,還是只是擬合了過去。

比較兩個部分時,請留意這些跡象:

衡量項目好的跡象壞的跡象
樣本外淨平均每筆損益仍明顯高於一買一賣(來回)成本接近零或低於成本
樣本外交易筆數有足夠的交易可供判斷,而不只是寥寥幾筆交易太少,無法分辨運氣與實力
鄰近的參數設定設定稍微移動時結果相近只有一個精確的設定有效
最大回撤大小與樣本內回撤相近比樣本內的任何狀況都深得多
推進分析窗口大多數窗口的表現相似一兩個幸運的窗口撐起了整體

對每個候選策略都用同樣的方式執行這些檢查,正是策略檢驗的用途:相同的步驟、相同的門檻,並且對每個演算法都套用推進分析,而不只是你最喜歡的那一個。

如果你使用 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 棒成交與交易時段。接著,策略檢驗會對每個候選策略套用推進分析與你自己設定的門檻。

看方案與價格