先扯點閑篇兒,直取干貨者,可以點擊這里。
我曾誤打誤撞的搞過一年多的量化交易,期間嘗試過做價格和漲跌的預測,當時全憑一腔熱血,拿到行情數據就迫不及待地開始測試各種算法。
最基本的算法是技術指標類型的,原生的技術指標,改版的技術指標,以技術指標為特征構造機器學習算法,都做過。不論哪種方法,都繞不開一件事——如何使用歷史數據驗證算法的性能。
當時我是純純的小白,對數據集划分完全沒有概念,一個很自然的想法就是拿全量數據跑回測,看資金曲線的年華收益、最大回撤、sharpe什么的。那時國內很多量化平台正在蓬勃發展,在知乎、CSDN上大力宣傳某某算法的回測曲線多么完美無瑕,收益高、回撤小,看得我滿腦子都是發財的幻覺。那時我還沒意識到這里的問題,直到我們的賬戶開始虧錢。
回過頭去找原因,猛然看到一個詞——過擬合。原來,采用全量數據做回測就是在自欺欺人!
那么,怎么克服過擬合呢?最簡單的辦法就是把數據分成兩部分,train和test,或者說樣本內和樣本外。train set上做訓練,練出了模型,拿到test set上檢驗一下,看看效果怎么樣。這樣做還存在兩個問題,一是如何把全量數據划分成train set和test set,二是要把訓練和檢驗的過程做多次,該怎么做。
一位量化老兵在知乎live上推薦了一本書,The Evaluation and Optimization of Trading Strategies,這本書里推薦了一個方法,叫做 walk-forward backtest,看似完美的解決了上面兩個問題。walk-forward的具體原理網上例子很多,請自行百度。這種方法的本質就是做了很多次的樣本內訓練+樣本外測試,目的是檢驗模型在樣本外的表現有多穩定。嗯嗯嗯,看起來很有道理。
但是,
walk-forward有沒有幫助模型克服過擬合呢?
並沒有。我們依然在樣本內訓練時選取最優參數,或者選取最優參數平台的中心點,這樣選出的參數必然和樣本數據高度吻合,很容易過擬合。而且每次訓練得到的最優參數或參數中心點都不同,如何確定最優參數也是棘手的問題。
要盡量克服過擬合,就要在選擇模型參數時避開train set,可是test set是不能用來調參的,不然test set就變成train set了,那么該怎么辦呢?答案就是加入一個validate set。
=============干貨從這里開始===============
我們使用機器學習算法處理問題時,都會遇到兩個問題,一是選哪個模型好,二是如何選擇最優的模型參數。為了解決這兩個問題,需要對數據集做出划分,如果數據足夠多,可行的划分方法是分為三部分:train set, validate set, test set。
用train set做多個模型的初步訓練,得到一組模型和在訓練集上的最優參數,然后用這些模型在validate set做驗證,一邊驗證一邊調整模型參數和復雜度,找到最優模型和對應的最優參數,然后用test set做模型評估,估計出模型的泛化能力。
train validate test三部分數據的比例,一般為50-25-25,采用隨機采樣即可。
如果覺得這樣做還有些不妥,可以把上面的過程重復多次,對比多次的結果,找到最優模型和最優參數。
這種划分三個數據集的方法在大數據場景下十分適合。
如果數據沒有那么多,可以采用兩種方法:一是 交叉驗證的方法,具體可以分為簡單交叉驗證、S折交叉驗證和留一交叉驗證,二是自助法,可以作為一個選項,一般不推薦使用。方法的具體內容參見周志華《機器學習》2.2節。
上面提到的方法都缺少了validate set這個數據集,相比於三個數據集,這些方法對模型和參數的選取存在更高的過擬合風險,不過這個風險並非完全由數據的選取引起,主要原因是數據總量太少。
這里還要補充一句,並非划分成三個數據集一定比交叉驗證更好,只是加入了validate set,更有可能避免模型和參數的過擬合,尤其是由於復雜度過高引起的過擬合。
遺留問題:
關於train validate 和 test的作用,Ripley, B.D 在 Pattern Recognition and Neural Networks中給出了這三個詞的定義:
Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier.
Validation set: A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.
Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier.
其中讓我比較迷惑的一點是 標紅的部分,有些文章以ANN為例,說train set用於確定ANN的權重,validate set用於確定ANN的深度和單層網絡的節點數,我暫時還不能其中的邏輯。
周志華老師的書中只是簡單的提及了validate set, 原文是:“我們用測試集上的判別效果來估計模型在實際使用時的泛化能力,而把訓練數據另外划分成訓練集和驗證集,基於驗證集上的性能來進行模型選擇和調參。”
我目前對train set和validate set的理解是,train set用來做模型和參數的初步篩選,選定了幾個模型和參數后,拿到validate set上做驗證和調整,選出最優的一個或多個模型-參數組合,然后用test set做評估,得到評估結果。
參考文獻:
https://www.cnblogs.com/xfzhang/archive/2013/05/24/3096412.html
http://baijiahao.baidu.com/s?id=1583759543555552397&wfr=spider&for=pc
周志華 《機器學習》