【程式交易系列】#3 回測(Backtesting)

回測就是利用歷史資料去驗證你的交易策略是否有效,你可能都想過一些交易策略,像是均線交叉買進或是布林軌道跌破反向買進等策略,圖形上看起來會賺錢,但能否在長期下還能有正的利潤呢?也許我們就能夠利用歷史資料來驗證看看,換成財務工程的語言,這個叫做歷史模擬法(Historical Simulation)。


首先我們還是先把量化交易的架構拿出來看,這篇文章要講的重點在白色虛線裡的區域,這邊我把它稱為「量化研究」步驟,大部分網路上找得到有關程式交易的教材都是在講量化研究這個部分,你可能會很常聽到一些名詞,像是MDD(Max Drawdown)、Sharpe ratio、Overfitting等名詞,這都是屬於這個區塊的名詞,這篇文章的內容我想先讓大家清楚量化研究每一個環節的操作重點,在下一篇教學文章中,我將會實際拿一些資料結合這個架構來教大家怎麼回測。

交易策略發想

交易策略的重點在於市場擇時(Market Timing),換成白話文叫做知道什麼時候要買,及什麼時候要賣,交易策略的發想來源可以有很多維度,大家常用的歷史股價資料是一個維度,問你那個買入總是高檔賣在低檔的朋友也是一個維度,觀察PTT股版推文氣氛也是一個維度,所以交易策略的發想其實很廣泛的,但是大部分的交易策略都會狹義的侷限在由股價產出的技術指標上,當然用股價歷史資料和一些現成的技術指標,當然是一個很方便的做法,這樣就不用去找其他的資料源。

廣義一點來看,只要能夠將一些量化或質化的資料轉換成「量化」指標,就可以發展成一個產生交易訊號的指標,量化指標大家都會我就不在這邊說明,質化指標怎麼樣轉換成量化指標呢?舉一個例子來說明,如果你有20個投資操作準確率相當差的朋友,他們賠錢的機率是大於賺錢機率的,這時候你每個月初去發問券給那20個朋友,看他們現在是否會想進場,如果會就給5分,如果不會就給0分,20個朋友的意見結果加總會是一個0到100的數字,就可以去設計一下,當分數小於20的時候買進,大於80的時候賣出,這就是一個質化轉量化,再轉成交易策略的範例。

建議如果想要長期參與量化交易這個領域,必須要做到兩點,第一,把程式練好,有良好的程式撰寫能力,可以讓你在設計指標或交易策略時能夠更自由,第二,多攝取一些教導投資交易的書籍或教材,看看別人都是怎麼樣交易的,再用自己的資料來驗證好不好用,相信反覆的執行這些動作,絕對會讓你有一些交易策略的想法,不論是原創或是拼裝車,只要能賺錢的就是個好策略;最忌諱的是看到別人有美好的績效曲線,就去買策略或是買課程,美好的交易策略在未來是可能會失效的。

回測(Backtesting)

回測的重點就是將指標轉換成交易訊號(Trading Signal),交易訊號為1時,代表買進,交易訊號為0,代表賣出多單,而交易訊號為-1則為放空,經過以上的邏輯設定就可以很容易的獲取回測報酬,詳細作法我在下一篇教學文章再用Python算給大家看,另一個很重點就是設定進出場的交易成本,交易成本包含了手續費與交易稅,必須於交易當下就把交易成本從報酬率中扣除。

以Python操作回測必須對於時間序列資料操作熟悉,建議可以去學習Python的Pandas套件,透過這個套件讓我們的回測變得非常容易,回測比較容易變成一個既定的模板,可以先將交易訊號轉換成報酬,未來只要更新交易訊號即可進行切換,最後將產生一個累積的報酬加總的權益曲線(Equity Curve),也就是很常被拿來作文章45度角向上的曲線,曲線就是代表你的財富狀況。

績效評估

績效評估是屬於回測相當重要的一個階段,績效評估可以有幾個KPI,例如總報酬率、交易勝率、獲利因子(Profit Factor)或是最大撤回率(Max Drawdown)等,這些因子都是由權益曲線與交易進出明細彙整而出,可以拿來評估的種類相當多,在自建回測系統時,可以先去觀摩一下套裝的回測軟體都會看哪些數值,把一些基本的建近來,後續的就看自己要怎麼變化了,我也曾經看過利用迴歸分析的斜率或p-value來觀察權益曲線的狀況。

最佳化(Optimization)與過度配適(Overfitting)

不論回測出來是好是壞,我們都必須要丟進去做最佳化看看,最佳化除了可以讓我們找到最好的參數外,也可以來衡量這組策略參數是否在參數高原上,或只是一個剛好的點上,如果在一個參數高原上的狀態,稍微調整一下策略參數可能對於績效並沒有很明顯的下修,最適參數理想的狀況是一個參數區間,而不是一個單點的參數組。

過度配適的狀況就是代表參數績效表現良好,但並非於參數高原上,可能只是一個巧合,造成過度配適最主要的原因為參數過多,參數過多非常容易出現所謂的巧合,其中一個參數改變一點點就會導致策略績效崩盤,建議交易策略的參數不要超過三個

樣本內外測試(In-sample Out-sample test)可以避免資料間互相干擾,因為在實際交易時,我們也是用樣本內(歷史)的資料來去進行樣本外(未來)的交易,樣本內外測試其實就是將歷史資料區分為兩個部分,例如第一段為歷史資料的前面70%資料點,後面30%為第二段的測試資料,利用第一段的資料進行回測,並找出參數高原的組合,再利用第二段的測試資料來做樣本外測試,如果績效仍然表現得良好,我們就可以說這個是符合時間驗證下的策略,樣本內外測試換句話說也就是分段進行最佳化,看各時間分段的參數高原組是否變異過大。

結論

回測階段步驟可能看起來很繁雜,但是其實很多東西都是模組化的,只需要學會個一兩次,中間變的東西就是你的交易策略設計了,回測可以相信它,但是不能盡信它,它主要給我們的是一個參考,而不是一個僵化的指引,我們必須要思考的是如何在交易策略失效時即時停損停止策略,希望大家能夠在這個區塊相當熟悉且有能力自行做變化時,再開始進行自動交易。

前面內容可能會講得比較抽象,在下一篇教學內容學習時,建議可以來回對照,學習效果會更好!


雷大的Python投資筆記電子報

歡迎訂閱雷大的Python投資筆記電子報,每週將會發布定期市場分析文章與不定期的專案研究文章:

  1. 國際金融市場分析
  2. 量化交易策略分享
  3. Python程式撰寫教學

立即訂閱最新文章