回測局限性:回測有哪些限制?要怎麼避免無效回測?

在上一篇文章「回測是什麼」中,介紹了要跑回測的原因,理論上,回測可以驗證投資策略在過去是否可行,

但是,回測也有局限性,一不小心可能會落入過度最佳化(英文:Overfitting),或是誤認為回測結果好就代表未來績效一定會好。

一個現實中常常遇到的問題是,自己開發出一個歷史績效看起來很好、遠勝大盤、高報酬低風險、高夏普率的策略,但當策略在未來開始運作時,績效卻急轉直下。會發生這種問題,往往就是對回測不夠了解,使用錯誤的回測過程,或者對回測結果有錯誤判讀。

回測結果是很好的參考依據,但我們應該謹慎參考回測結果,而不是把回測結果當成絕對的準則。

以下市場先生會介紹回測的局限性,包括回測有哪些限制,以及要怎麼避免無效回測。

1. 數據有誤

回測結果的準確性取決於採用的歷史數據資料的品質,是否正確且完整。

如果選擇的數據有缺失遺漏或是錯誤,那回測結果必定有偏誤。

有句話說:garbage in garbage out垃圾進、垃圾出。

回測使用有問題的數據資料,那回測的結果也必然是有問題的,這樣的策略如果用於交易,那可能就是巨大的金錢損失。

  • 解決方法:回測開始之前,要先對使用的數據進行檢查,清洗資料(data cleaning)。
    包括空白值、錯誤值、誤植的數字,這些都可能存在原始資料中。

市場先生經驗談:即使是向專業廠商買來的資料,也不要全盤相信。

量化交易業內的朋友分享過,他們曾經在資料庫廠商的數據中,發現不少錯誤數值。更嚴謹的方式是,最好自己能用其他方式做檢核。

2. 數據樣本不足

任何回測數據,如果樣本數太小,就缺乏統計上的意義。

通常一個樣本,指的是一個交易。

例如一個中長期策略,卻只有3~5年的回測數據,最終可能交易筆數只有不到10筆,那我們很難說這個統計結果,在未來會重複發生。

  • 解決方法:回測時,確保樣本數足夠多。
    歷史資料究竟要取多長,主要的判斷依據應該以樣本數要夠多為基準,一般在統計上認為,至少有30個樣本的統計值,統計結果才具有參考意義,當然越多越好。

市場先生經驗談:樣本數越多越好,當然也有例外。

例如買進持有策略(Buy & Hold),本身就不會頻繁進出交易,因此就不會產生大量交易作為樣本。這時樣本依據就變成時間,而不是交易數量。例如能否有10年~20年甚至更多的統計數據,去說明當下回測結果,在未來也有參考價值。

又例如一個以秒甚至tick當單位的高頻交易策略,回測一天也許就產生上百筆交易,可能回測3~6個月就已經有成千上萬的交易筆數,歷史數據取樣幾個月或最多2~3年就足夠有代表性。

3. 回測涵蓋的區間不足

我們設定的回測區間,如果涵蓋的行情不夠完整時,回測結果就會有偏頗。

因為一個投資策略可能只在特定的歷史期間表現好,但在其他時間則很差,

例如同一個進出邏輯,也許在多頭市場期間有高收益、低風險,但在空頭或震盪盤整時期會有摩擦耗損導致虧損。但如果只回測牛市期間,因為投資策略沒有經歷過熊市的考驗,就會得到過度樂觀的結果。

又或者波段交易的策略,測試區間有明顯趨勢,但卻沒有取樣到市場盤整時期,就無法得知頻繁進出市場所產生的摩擦耗損會不會拉低績效。

  • 解決方法:回測盡量涵蓋不同行情情境,至少包含一次牛市、熊市。
    回測取樣的時間週期要夠長,所謂的夠長是指至少要可以經歷金融市場變化的考驗,經過完整的景氣循環,經歷牛市、熊市、盤整,甚至升息循環、降息循環、高通膨、低通膨等等不同環境。觀察策略在不同情境下的表現,綜合的結果,才更有助於我們評估策略在未來各種不確定市場中的表現。

市場先生經驗談:任何策略都有它最適合的市場環境,也一定有不適合的情境

一個策略不可能任何情況下都賺錢。而在過去表現不錯,則是因為讓它賺錢的情境比較多,不利它的環境比較少。

如果今天你開始運作一個策略,但突然有一整年績效很差、比以前回測時都差、甚至回檔突破MDD(歷史最大回檔),那到底是策略暫時失效,還是策略永久失效?

當你過去回測有涵蓋到不同行情、不同情境,其中包含到表現差的環境,你就可以有能力判斷,當下不利於策略的市場環境,只是隨機的暫時現象、還是永久長期現象?

如此我們可以更有依據的去判斷一個策略到底是暫時失效,還是永久失效。

4. 使用不合時宜的數據

取樣資料有時也並不是時間越長就越好,任何歷史資料有效的前提,都是它要對未來有參考意義

例如法規已經變更、以前商品曾發生規格改變、參與者大幅改變、科技的進步、市場結構的變化等等,這時太過於老舊的歷史資料,有可能已經不符合當前的市場情況。

例如想回測黃金相關投資策略,卻選用到1970年以前的數據,以前的黃金價格和美金是有所掛鉤的,有明定黃金兌換美金的比率,這就是數據選用區間沒有考慮到歷史背景。

又例如2020年Covid 19時期,許多企業的財報都受到疫情影響,假如擬定的交易策略和財報指標有關,回測如果用到這幾年的資料,就會看到財報有不同於以往的特殊狀況。
然而這些狀況在未來並不是常態。
較好的做法是根據策略,去評估解讀數據時,是否要排除受疫情影響的幾期財報所產生的結果。

  • 解決方法:對回測使用的商品及資料數據,了解它過去歷史。
    一開始如果不知道怎麼著手,可以先從發生一些大漲大跌的行情開始,一路往回去看,了解當時時空背景。這樣對於某段時間的數據能否用於判斷未來,心裡就比較有底。

市場先生經驗談:重點是在統計上,判斷對未來的參考價值

現實交易市場存在一些無法預測的風險,例如自然災害、地緣政治事件、流行疾病等黑天鵝事件的發生,導致市場行情產生重大變化,這些事件持續重複的可能性並不高,每次產生影響的原因也不同。

但也有例外,例如對於農產品期貨來說,颱風、乾旱、水災等等影響,就幾乎是會持續發生的事情,每幾年就會持續遇到,甚至例如聖嬰現象或反聖嬰現象,是週期性的事件,這種時候就不應該把它視為極端偶發事件。

5. 解讀數據沒有排除極端值

在回測的數據,或者回測結果上,可能存在一些極端值。這些極端值在歷史上確實存在,對回測結果整體影響很大,但對判斷未來也許沒有幫助。

例如歷史上可能價格走勢上出現過一次閃崩,價格出現很異常的跳動。透過回測,我們雖然能模擬出當時情況,但不代表閃崩在未來會持續重複發生。如果你的策略從閃崩中賺到錢,或者大賠,那可以做為應對緊急事件的思考,甚至另外規劃應對方式,但不能當成策略的常態損益。

又例如在回測結果中發現,曾經有一筆大額獲利發生在歷史上在某個超大行情,在回測數據中,它高過第2名的獲利金額5倍、10倍。把這樣的數字納入整體統計,也會拉高整體策略績效表現。

在看回測統計結果時,除非你很確定這些情況會持續重複出現,否則應該把極端偏離的數值排除,理由是不應該把極少數極端值當成獲利來源。的確我們可能再次遇到類似情境,但萬一移除掉這些極端值,尤其是極端獲利後,策略本身績效變差很多,那說明策略整體獲利績效只來自及少數極端狀況。

  • 解決方法:排除掉一些極端值,重新看績效,可以得到更多策略常態下的表現。
    解讀回測數據時,要判斷整體績效是否僅是極少數交易帶來的。
    如果是的話,是一種危險訊號,因為極少數的交易,不一定具有統計上意義,無法證明這些少數能帶來高獲利的情境在未來會持續重複發生。

市場先生經驗談:過去與未來一定充滿意外事件,一個有效的投資策略能承受意外,而不是仰賴意外

意外並不是報酬的來源。但意外也是投資策略運作時,需要考慮的問題,因為有時意外發生,可能會讓我們原先獲利來源的基礎假設暫時失效。

所以策略規劃之餘如果有閒暇,可以額外做一些應對意外地壓力測試評估,或者策略調整的行動方案或者保險措施。

所謂的意外,輕則包括斷電、斷網路、券商無法下單等等,重則包括發生一些全球性的突發災難。如果有做好預案,才不會到時手忙腳亂。

6. 忽略交易成本

進行回測時一個常被忽略的一個設定就是交易成本花費,

真正在市場中進行交易時,買賣股票都會需要手續費、交易稅、買賣價差、市場流動性不足無法以預期價格成交導致追價產生滑價,這些都是交易成本。

多數回測程式軟體,交易成本預設為0,這有助於策略原始的績效解讀,但不足以評估策略實際運作時的績效。回測過程中忽略交易成本,會導致高估預期獲利。

這些成本會顯著影響實際交易中交易策略的表現,尤其是對當沖或高頻交易影響更大。

譬如一個高頻交易策略的回測結果本來是有小幅度獲利的,但實際交易時卻因高頻進出而被手續費吃掉收益,最終收益曲線加上交易成本變得很難看,這種策略就無法實際使用。

  • 解決方法:找到一個理想策略後,重新評估一次包含費用的回測結果
    例如,在已經設定固定手續費的前提下,再額外加上0.1%的費用,或者期貨交易再加上2 ticks點數價值的手續費和滑價,模擬市場交易成本相關費用。

市場先生經驗談:交易成本對週期短、交易頻率高的策略影響大,滑價對順勢交易影響大

設定交易成本,看似會讓回測結果變差,但這是必要的。因為回測結果有多賺錢都不重要,真的交易能獲利才重要。保守估計不是壞事。

週期越長、交易頻率越低、平均單筆獲利越高的策略,手續費和交易稅影響就越小。

反之,週期越短、交易頻率越高、平均單筆獲利越低的策略,手續費和交易稅影響就越大,尤其高頻交易當沖交易、短線交易,交易成本影響都很高,回測時務必要把交易成本算進去。

滑價對於順勢交易影響較大,因為順勢追突破,比較容易滑價,設定滑價時可以保守設略大一點。反之,滑價對逆勢交易策略影響較小,逆勢交易策略大多能成交在理想的點位。

此外像是低流動性的商品,交易成本也要估計的高一點,比較符合真實情況。

7. 策略設計或程式碼有誤

在回測策略設計時,由於要把策略程式化,因此過程可能會發生一些錯誤。

一個常見的錯誤,就是邏輯自我矛盾

舉個例子,例如你設計一個價值投資策略,理論上是某些標的變便宜、價格下跌時要買進,但在此同時你卻又加上了一行停損的程式碼。於是當下跌發生、股價變便宜,在價值投資裡面,理論上更值得購買時,卻同時有買進及賣出的兩種指令互相衝突。

幸運的是,透過得到很差的回測結果,我們很容易發現這類問題。

另一個常見錯誤,就是回測結果使用到未來的資料

例如你假設某個經濟數據發生某些改變條件時,就進場及出場,回測結果也呈現漂亮的歷史績效,於是你認為這策略很有用。

但實際上,回測中可能是用到未來數據。

例如:「用3月份的GDP或CPI通膨,去判斷3月的股價。」
你看得出這策略拿去回測,會有什麼問題嗎?

問題答案就是,
3月的時候,股價已經在走,但3月的GDP和CPI,其實當時根本還沒公佈,還要等一兩個月後才會公布。

這就是用到未來資料的例子,通常用到未來資料,會看到一個過於漂亮的績效走勢圖,但等到實際運作才發現有問題,策略根本就不成立。

  • 解決方法:回測不是只判讀結果,也要檢查一下交易和程式碼

回測完除了看結果報表,應該也要挑幾筆交易出來檢查,
去實際核對數據、根據經驗判斷、對照時間點,才比較容易判斷自己程式碼,或者數據上,是否有設計錯誤的地方。

市場先生經驗談:過於亮眼的績效表現,通常不是發現聖杯,而是程式寫錯

記得剛開始學寫程式交易和作回測時,有段時間聽友人說他們朋友找到好幾個超強的聖杯,報酬超高、風險超低,夏普率超高,於是他們開開心心的開始交易。

沒多久後聽說實單績效很隨機、表現跟回測時結果完全不同,檢查之下發現原來回測時用到未來資料,於是策略訊號都能預知未來,績效當然好。

我們身處未來,在看過去的時候,自然都會帶著上帝視角,已經知道過去曾經發生什麼事。但在回測時,應該要精確的假定當時已知資訊和數據,才能得到對未來有用的回測結果。

績效只要好到太誇張,報酬超級高、回檔超級小,
先不要覺得找到聖杯,通常是程式碼寫錯、用到未來資料。

8. 策略過度最佳化Overfitting

交易者的策略會在回測過程中進行優化,有可能根據所選的歷史資料最佳化導致過度最佳化(Overfitting)。

過度最佳化的意思是,對於歷史資料,測試多種策略和參數組合,最終選擇在歷史數據中表現最好的策略和參數組合,並且期待未來也會和過去一樣好。

但現實是,過去最佳的參數,不一定是未來最佳的參數。

甚至如果你分段去測試,你會發現歷史上每一段時期,最佳的參數都不一樣。

舉一個例子,有一個利用移動平均線交叉的策略,交易者一直調整參數和回測不同歷史數據資料,從5日均線、6日、7日均線,一路測試到500日均線,最後他選擇了其中某一日期均線,理由是因為回測結果最漂亮。

但通常未來的績效,並不會如同他回測時一樣滿意。

  • 解決方法:不要對參數過度最佳化。選擇結果平滑的參數高原,而不是參數孤島。
    設計策略和選擇參數,是回測中一定要碰到的問題。
    選參數時最怕的狀況,就是那個參數績效特別好,但那個參數高一點或低一點的參數,績效就差很多,這種情況就稱為 參數孤島。
    所謂 參數高原,就是你測是一個參數,整體表現不錯或還行,它附近高一點或低一點的參數表現也都差不多好,不會落差很大。這代表未來行情變化後,這個參數也不至於會有太大變化,這是比較理想的情況。
    要理解到,未來的行情一定會跟過去有差異,任何時間點最佳的參數一定都不同。
    選擇參數應該是根據邏輯,回測結果只是輔助,參數優化時要選擇的是在過去各時期都能平穩的結果,而不是認為過去最佳結果在未來就一定會最好。

市場先生經驗談:回測時,可以分成樣本內測試(in-sample test) 和 樣本外測試(out-sample test)。

例如你有12年的數據,你可以先用其中8年回測、優化調整策略和參數,稱為樣本內測試(in-sample test)。

最終設定好之後,用另外4年回測,但只看結果,不調整策略和參數,評估是否和自己原本樣本內測試時的結果有一致性,稱為樣本外測試(out-sample test)。

反之,如果一開始就直接拿12年的歷史資料去回測,那回測結果就沒有驗證的空間,只能等待未來實單(實際交易)或空氣單(模擬交易)。

把歷史資料用這種分段的方式,假裝一部分樣本數的資料是未來實際運作的狀況、不納入一開始的回測,能讓我們更客觀的去判斷一個策略好壞。

9. 策略曲線套入 Curve fitting

曲線套入Curve fitting指的是策略設計時,為了讓策略在歷史上回測績效更好,使用過於複雜的策略,最後導致策略能相當貼合歷史表現、在過去表現很好,但也只能貼合過去,當未來行情與過去不同時,就完全無法有好的表現。

比方說,你發現過去歷史上一段時間,行情只要下跌20%就會發生反彈,於是你在原本的策略之上,加了一條只要跌到20%就進場買進。然後你又發現過去行情只要從低點上漲50%左右就會反轉,於是你又設了一個新條件…以此類推。

當這種條件「對過去歷史走是客製化」的條件越設越多,你的回測績效會越來越好,但這個策略其實也廢了,因為未來的行情特性,並不會完全和過去一樣。而這些複雜的條件,如果越適合過去市場,就越不會適合未來市場。

  • 解決方法:策略簡單就好。
    在程式交易回測裡面,策略其實越精簡越好。越簡單的策略,也許不見得有超高的績效,但往往因為簡單,它在歷史及未來不容易失效。
    要補充一下,簡單指的是策略的核心邏輯簡單,不見得是程式碼簡單。當然程式碼最好越簡單越好,也能減少出錯的可能。
    其他包括樣本外測試(out-sample test)、或者用多種商品去測試同一策略的有效性,也都是可以輔助我們判斷策略有效性的方式。

市場先生經驗談:不要過度追求回測績效。

這需要的是心態上克制住自己想最佳化的衝動,畢竟每個剛開始做回測的人,心裡都有追求聖杯的願望(聖杯就是指績效超好、風險低、能長期幫你印鈔的策略)。

但如果克制不住,也沒關係,

你只要把最佳化後的策略拿去實際交易,等到未來績效不好、大幅不如預期時,回頭就能理解到為什麼不要過度追求回測績效了。

10. 沒有考慮可執行性

在回測數據上,有一些價格是看的到,但成交不到的。

最典型的例子是追漲停策略,漲停的股票,隔天開盤上漲的機率相當高,因此如果你可以回測,如果能在前一天就買進漲停股票,長期能得到不錯的績效。

但現實的問題是,漲停的股票很可能是鎖住、完全無法成交的。

這就是可以回測,但缺乏可執行性的策略。

其他例如回測流動性較低的商品時,在歷史上是否真的能夠買進,或者股票做空的策略,但該股票是否真的能做空?如果不行有沒有替代方式?這都是要考慮的問題。

  • 解決方法:標的要考慮成交量、漲跌停、能否做空、法規因素。
    許多商品會有漲跌停、處置股、無法做空等等現實交易問題,導致一些回測中理想的交易無法真正實現。無法真正實現的交易,回測結果再好也沒有意義。

市場先生經驗談:如果資金更大,針對低流動性市場時,就要考慮市場胃納量

例如某一個量化選股策略,在中小型股找到一些有利可圖的機會,但問題是許多中小型股可能每天成交量只有幾百萬或千萬,也許你100萬資金進去,就會吃完流動性或者對市場產生價格衝擊。但當你的資金是幾千萬或更多時,策略很可能根本無法執行,因為市場不足以容納你的資金。

資金大到衝擊市場不是好事,因為這可能代表你買進一堆標的後,無法輕易地退出,或者退場需要有很大的損失。

低流動性的商品,雖然比較有可能潛藏一些獲利機會,但對大多數人來說,一般仍盡量選擇高流動性的金融商品做交易。

快速總結:回測有哪些限制?要怎麼避免無效回測?

1. 確保歷史數據的完整性與正確性,回測開始前檢查數據,才能獲得具參考價值的回測結果。

2. 確保樣本數足夠多,樣本數根據交易策略類型可以是交易筆數或是時間長度。

3. 取樣區間涵蓋行情要夠完整,可以經歷金融市場變化的考驗。

4. 歷史資料取樣時間要夠長,但前提它是對未來有參考意義,對回測使用的資料數據要先了解過去時空背景,才能判斷數據是否適用於未來。

5. 排除極端值,可以看到交易策略在常態表現下的績效結果,投資策略要能承受意外,而不該仰賴意外事件的績效表現。

6. 盡量模擬真實的交易成本,無法預估的話,就保守估計稍微降低預期報酬。

7. 回測除了判讀結果以外,也要檢查策略設計和程式碼是否有誤,例如邏輯自我矛盾,或是使用到未來的資料判斷過去的市場。

8. 避免過度追求參數最佳化、回測績效最佳化,對歷史數據客製化,回測績效顯示很好,但未來市場行情特性並不會和過去一模一樣,最好在回測時將歷史資料分段測試,分成樣本內測試(in-sample test)和樣本外測試(out-sample test),評估策略是否在樣本內外測試皆有一致性。

9. 回測時要考慮到可執行性,標的價格會受到成交量、漲跌停、能否做空等因素影響,導致有些出現過的價格在實際交易中無法真正實現,而無法執行的交易,回測結果再好都沒有意義。

雖然回測有它的局限性,過去不代表未來,回測並不能保證未來能賺錢,

但交易策略沒有經過回測驗證就直接投入真金白銀進市場,這風險就跟沒有帶地圖去徒步登山一樣危險,沒有走在一條驗證過的路徑上,非常有可能迷路,甚至無法折返,

所以,應該要了解回測的限制,並盡量減少回測的偏誤和負面影響,更謹慎的評估交易策略的風險和限制,審慎參考回測結果而不過度依賴。

這篇文章為市場先生資訊整理與觀念教學分享,無任何投資推薦之意,投資必定有風險,投資前務必自行研究分析判斷。

分享幾篇回測實作教學:

1. 回測是什麼?為什麼需要回測?

2. 如何用TradingView設定避開空頭的技術指標【指標篇】

3. 如何用TradingView腳本編輯器功能設定避開空頭的技術指標【程式篇】

4. TradingView 回測教學:用策略測試器帶入內建策略進行回測?

5. TradingView回測教學:用Pine編輯器建立策略腳本?(完整圖解)

加入市場先生FB社團,充實更多理財好知識

50歲之前想退休一定要懂理財,
解決投資的煩惱!


如果覺得這篇文章有幫助,
幫我按個讚,分享給更多人看到,謝謝!

編輯:Crystal 主編:市場先生

上 / 下一篇文章

一般留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *