2018年6月24日 星期日

AxisTradeCult 開發日誌 (6) - 簡單回測驗證

這周主要實作了簡單的回測功能以及針對Validation的方法做了調整, 之前Validation的方法是以ForwardingBlock的方式(我隨便取的, 我也不知道這有沒有專有名詞XD), 將整個Data Set切成N筆, 然後用第一筆當Training, 第二筆當Testing; 再用第二筆當Training, 第三筆當Testing....總計有N-1筆Training以及Testing的資料來作Validation, 可是這方法會有很大的問題, 像之前把2000~2018年的資料切成三筆, 會變成用2000-2006年的資料去建training model, 然後預測2007-2012的股價, 如果是有確定答案的問題或許沒問題, 可是像股價資料這種是時間越久關聯性就越低的, 所以基本上並不適合用這樣的方式來作驗證。 現在想想當初結果會這麼爛應該也是因為這驗證方式很有問題啊XD

總之, 現在改成了使用ForwardingLeaveOneOut的方法來驗證(一樣是我隨便取的名XD), 基本上就是往前shift的LOOCV, 首先會取出最前面的N筆資料來當training, 然後N+1天的資料來預測, 之後就shift 1天, 一樣使用N筆資料預測下一個N+1天, 所以最後總共會建立ALL-N組training model, 由於這時間開銷太大所以之前才沒有使用, 現在則是覺得好像只能這樣做了囧 反正現在都是用很簡單的分類算法做測試, 不要使用神經網路類的演算法應該是不會有太大問題。

首先設定TrDataSize = 250, 使用250個交易日資料去訓練model, 然後一直往前shift做LOOCV, 分類標籤一樣為ChangeN = 5%, pred_days = 5, 只要未來五天的收盤價平均漲超過5%就是+1,  跌超過5%就是-1, 其他則是盤整設定為0,  要預測的股票為迪士尼(DIS), 首先來看看資料分布:

---------------------
Label   Count
 0          4319
 1            143
-1            122
---------------------

一樣是非常的imbalance data, 這表示DIS本身波動性其實是不高的,  先來跑個分類模型看看結果:



結果跟之前ForwardingBlock天差地遠啊!!!  這代表用過去六年的資料來預測未來六年這件事本身就是超現實阿XDD  也代表股價資料越遠關聯性就真的越低, 如果要建Training model就不能使用太過久遠的資料。

除了跑DIS的資料以外, 由於現在手頭持股也有FB, 所以也來測測FB看看:




這樣看起來不同的分類算法用在不同的股價資料效果也更不相同, 對DIS的資料來說GaussianNB比較好, 而FB的話則是MLP較強, 另外基本上我比較關心的是上漲以及下跌的預測, 盤整反而是不這麼重要, 從資料來看普遍上漲比下跌還要好預測, 這也是因為以這兩檔來說都是穩定上漲的公司(DIS例外, 這3年一直起起落落XD)。

這樣看起來至少用ML來預測股價是都比亂猜好得多的, 不過最需要關心的問題並不是ML預測漲跌強不強, 而是他能不能幫我賺錢阿!!

為了測試這樣的預測是不是有用的, 我寫了一個簡單的回測功能, 起始資金設定為50000, 如果預測會漲就買100股, 預測會跌就全出清(下跌比上漲還難預測, 而且下跌50%等於要漲100%才能打平, 所以逃難逃得準以及快我覺得是很重要的), 由於要計算整體獲利所以最後一天會出清全部持股, 來看一下回測結果如何:




結論: "爛透了!!!!"

呼...為什麼說爛透了呢? 首先, 資料部分DIS我是取2000年1月~2018年6月, 而FB則是2012年才上市所以是2012年5月~2018年6月,  這段時間DIS從40元漲到100元總共2.5倍, 而FB則是從30元漲到200元總共6倍多, 雖然說這種話只能是後話(畢竟是從未來看回去), 不過要最賺的方法就是買了就不要賣了, 哪還需要什麼程式交易阿(翻桌!!)

嘛...先不管只有神能做到的事(預測未來), 基本上以DIS來說只有KNN有賺錢, 而ROI 62%雖然看起來很多, 可是我資料是從2000年~2018年, 扣到training的250天交易日, 等於我16年多來只賺62%, 這報酬率真的太低了, 更不用提其他模型都是賠錢的狀況!!

而以FB來說, 那種走勢本來就是避著眼睛買賣都會賺, 就看賺多賺少罷了, 除了NB的5年多2倍算不錯以外, 其他的根本不合格!!

從結果來看, 也能知道分類器預測的好壞跟能不能賺錢並不是完全正向的關係, 雖然也必須考慮回測的問題(驗證的回測只能做多不能做空), 以上述情況就像預測對了只有小賺, 預測錯了卻是大賠的感覺, 這部分就得在研究看看之後要怎麼做比較好, 要怎麼把預測用在買賣以及籌碼運用上。

另外為了讓比較結果客觀些, 這裡也做了下Random交易的回測, 回測的方法一樣, 只是用Random的方式去決定買賣, 一樣不頻繁交易情況, 2%機率買, 2%機率賣, 96%不做任何事, 然後跑Random 1000次取平均, 來看看結果:


喔喔, 沒想到Random的報酬率比我想像中的還爛, 這代表或許並不是預測太差, 而是回測的方法不好, 導致就算預測對了也賺不到錢, 這也是未來的課題之一, 要怎麼把股價預測在跟籌碼運用結合, 畢竟我真正想做的並不是預測股價, 真正要做的應該是怎麼結合預測以及交易策略來賺錢, 感覺又有幹勁了啊!!!

最後來實際看看整個回測的詳細交易內容吧, 這樣也能分析出到底問題在哪裡, 由於FB整個趨勢就是上漲看了也沒意思,  先來看看最好報酬的KNN預測DIS:




綠色是買進而紅色是賣出, 其實看得出來他找到的買賣點是十分不錯的, 這代表最大的問題並不在於預測準確度, 而是籌碼的運用上, 由於我策略就是找到買點就是買100股, 所以閒置資金的部位是十分驚人的, 這也是為什麼ROI這麼低的關係, 儘管如此, 我也不能因為閒置資金的關係就有買點就全押, 這樣到時賠也是會賠到脫褲的...。 不過看這張圖也能清楚了解, 如果籌碼運用得當, 這個回測績效應該會是ㄅㄧㄤˋㄅㄧㄤˋ叫才是XD


最後的最後, 爽完了一下該來面對下現實, 既然KNN預測DIS賺那麼少是因為籌碼問題, 那決策樹ROI -23%又是搞什麼鬼哩?  來看看到底是怎麼一回事:




結果揭曉....看來決策樹是Overfitting了, 而且還外帶大量的過度交易, 交易是有成本的, 我現在的簡單回測還沒考慮交易成本, 如果考慮進去這個ROI可能虧到60%甚至80%都有可能也說不定, 可怕可怕囧

這樣整個做下來, 又知道自己下一步要做什麼了, 再來該來研究怎麼將預測跟籌碼使用結合在一起, 這塊做出來後就等於是做個交易機器人了, 終於要開始接觸這一塊了嘛XDDD

總之, 再來我會再把預測這塊做得更完善些, code也要整理一下而且也要跟GUI稍微整合, 等完工後再來就是新計畫始動啦!!

沒有留言:

張貼留言