【邢不行|量化小講堂系列56-實戰篇】量化策略回測表現好,但實盤卻很差?可能是底層數據就錯啦!

引言:

邢不行的系列帖子“量化小講堂”,通過實際案例教初學者使用python進行量化投資,瞭解行業研究方向,希望能對大家有幫助。

【歷史文章彙總】請點擊此處

【必讀文章】

【邢不行|量化小講堂系列27-Python量化入門】EOS期現套利,一週時間,15%無風險收益

【邢不行|量化小講堂系列20-Python量化入門】10年400倍策略分享(附視頻逐行代碼講解)

個人微信:xbx9025,有問題歡迎交流


量化策略回測表現好,但實盤卻很差?可能是底層數據就錯啦!

這是邢不行第 54 期量化小講堂的分享

經常有人跟我說他發現了一個很厲害的策略,年化收益有多高雲雲;或者看到策略研報、金融論文上面展現某結論非常非常顯著等等。

但是對於這些,我一般是持懷疑態度的。其中很重要的一個原因是,它們用來產生結論的原始數據可能是有問題的。

因爲我自己知道,整理一份乾淨、可用的歷史數據有多麼的難、有多少坑。

還有很多人在量化投資過程中會發現自己的策略明明歷史回測表現很好,但實盤卻不理想。這也很有可能是因爲底層數據有問題導致的。

俗話說:rubbish in,rubbish out。原始數據都是垃圾,策略怎麼能不是垃圾呢?

本文就講講在整理股票歷史數據中經常遇到的坑,來幫大家避免這些問題。

國內最有名的商業金融數據庫是萬得Wind。

在萬得客戶端的股票行情序列中,可以導出全部A股每天的行情數據:

                                                                                    截止目前A股共有3699只股票

很多沒有經驗的同學下載了這個數據,就興沖沖的開始研究量化策略,甚至寫學術論文了。

但其實這是有問題的。

因爲這些股票當中沒有包含那些已經退市的股票。比如圖中000001、000002之後就是000004了,那請問怎麼沒有000003?因爲它已經退市了。

當你策略的回測是基於這樣不完整的股票數據做出的,就會存在誤差。因爲在今天我們知道這些股票已經退市,但在當時,我們選股時並不知道哪些股票未來會退市。

並且往往退市的股票表現會很差,所以不包含退市股票,相當於提前開“天眼”刪除了部分垃圾股,間接的用到了“未來函數”,會讓你的策略表現的“更好”。

關於這種偏差, 有個專業術語叫做“倖存者偏差”。

A股目前退市股票有一百多隻,比例不高。但在美股、港股中,退市情況就非常普遍,如果沒有加入退市股票的數據,那麼策略結果會嚴重失真。

所以我們不管從哪裏獲取股票數據,都一定要去檢查下它是否包含退市的股票。

二戰期間,人們發現倖存的飛機中,機翼中彈數量多,而機身中彈的卻很少,因此認爲應該加固機翼。但其實剛好相反,因爲機身中彈的飛機都沒能飛回來,所以應該加強的是機身。這也是典型的“倖存者偏差”

A股的上市公司經常會變更名字。更名常見的一個原因是當業績不達標時,被動在名字前冠上ST,簡稱ST股。

下圖是600053這個股票,從上市以來的更名歷史。其中很長一段時間被叫做ST江紙,後來陸續改名爲中江地產、九鼎投資。

下面是從萬得客戶端的行情序列中下載的600053從2003-5-12到30日之間的股票數據。可以看到這段時間股票名稱應該爲“*ST江紙”,但是萬得只是簡單的用下載數據時的最新名稱“九鼎投資”代替。

                                                                                  萬得江西紙業的數據截圖

 

那麼這樣的數據就是有問題的。

股票如果名稱中帶有ST字樣,每日漲跌停限制就會由10%降爲5%。但是Wind的行情數據中,600053股票名稱一直是九鼎投資,並沒有標記出哪天是ST。

那用這樣的數據統計漲跌停情況,都只會按照10%來算。那麼有些時候,明明5%觸發了ST漲停,仍然會被當做沒漲停來對待。

這就會導致我們的一些交易策略失真。比如選中了某個股票,以爲當時可以買入,但其實當時該股票處於ST漲停狀態,其實根本無法買入。

我之前就看到過有些策略的選股記錄,選擇的全是連續漲停的ST股,這樣的策略結果看上去“很美麗”,但實際根本無法實現。

所以我們在獲得一份股票數據的時候,一定要看下它的歷史名稱是否正確,不然策略回測結果的真實性就要大打折扣。

上市公司一年要發四次財報,交易所規定了發佈的時間段:

1季報:4月1日——4月30日。

2季報(中報):7月1日——8月30日。

3季報:10月1日——10月31日

4季報 (年報):1月1日——4月30日。

比方說2018年第二季度財報。最早的博騰股份在7月31日就發佈了,而最晚的格力電器在8月31日才發佈。

再比如目前2019年10月,是發佈三季報的時候。可以發現還沒有出報告的企業是沒有辦法獲得相關財務數據。

                                                                                    萬得數據數據界面截圖

但是去看歷史數據會怎麼樣呢?在萬得的行情序列中下載萬科的每股收益數據,會發現在2019-01-02的時候就已經更改了每股收益。

                                                                      萬德的行情序列中下載的萬科數據截圖

但是萬科的年報上可以看到,萬科2018年的年報在2019-03-26才發年報。所以萬得數據比年報發佈的數據足足早了2個月!

                                                                           萬科的2018年年報發佈時間截圖

那這樣的數據就有相當大的問題!

如果我用這個數據來進行回測,相當於我在2019年1月2日,就知道了萬科在2019年3月26日才發佈的年報數據。我能預測這麼久的未來,開發的策略能“不賺錢”嗎?

所以我們在使用財報數據的時候一定要注意財報發佈的時間。不然策略的年化結果再高也沒用。

我們用來回測交易策略的數據,時間不能太短。

回測時間太短會有什麼影響呢?

一方面,股票市場通常是週期性變化的。我們的數據最好至少包含一輪完整的牛熊週期,這樣纔可以評價我們的交易策略在不同週期的表現。

針對A股的話,回測數據一般從2006、2007年開始。從那之後已經有兩輪完整牛熊。並且07年股股權分制改革、財務報表改革,從那之後的財務數據都比較統一。

                                                                          上證指數及其2006年之後的兩輪牛熊

tushare這個Python第三方庫,是很多人的數據來源。安裝方便、免費,是他的優點。

但它的一個缺點是,目前只能獲取近3年的日線數據。

下面獲取新湖創業股票歷史數據的代碼,可以看到他只獲取了最早到2017-05-02的數據。

                                                                                          獲取數據的代碼

                                                                                             代碼運行結果

另一方面,股票數據中會有很高的噪聲。在回測時間比較短的情況下,還會出現在數據挖掘中經常遇到的一個情況:“過擬合”。

                                                                                          過度擬合示意圖

什麼是過擬合呢?舉個例子來說就是,我們的策略過於複雜,並且在用於尋找最優參數的樣本數據中表現很好。但是將優化好的模型應用在非樣本數據中表現卻很差。

增加樣本數量,也就是增加股票歷史數據的長度,可以幫助解決過擬合的問題。

在股票市場裏,因爲分紅派息、拆股送股等原因,股價會發生異常變化。

比如十送十的股票,在送完之後,股價會從原來的價格直接變爲一半。

爲了消除這些異常變化,大家往往會對股票數據進行復權處理。

如果沒有經過復權處理會發現有時候股票價格從30塊變爲15塊,一下子就跌了50%。所以未復權數據作爲回測策略輸入的時候,回測結果和實際情況會有很大的出入。

可以看下圖享通光電2015年9月中旬有一個巨大的價格缺口的情況。可以很好的說明覆權和未復權的差別。

                                                                             未復權(上圖)和復權(下圖)比較

可以再看看萬得數據庫中享通光電的數據。

                                                                                     享通光電未復權數據截圖

可以發現如果沒有選擇復權選項,那麼2015-9-23 到 2015-9-24 收盤價的變化將會非常大。

所以我們在獲取一份股票數據的時候,一定要去關注下,它的股票價格是否復權,如果沒有復權,這個數據是不能用的。

更詳細的有關股票復權的信息可以看邢不行之前的這篇公衆號文章:量化投資中,計算技術指標時常見的8個坑

如果對如何計算復權價格感興趣,可以加邢不行微信討論:xbx9025。

到目前我們已經看了這麼多準備數據的過程中可能會踩的坑。其實避免這些坑的目的都是爲了儘可能的還原歷史的真實情況。這樣我們的回測結果和對模型的評價才更加可靠。

爲了幫助《Pyhton股票量化投資》課程的同學解決數據準備中的這些問題,我也提供了我自己清洗整理的股票歷史數據,包含了完整、乾淨的數據。

長按識別上面的二維碼,進入量化小講堂網站,按照GIF的步驟做就可以獲取歷史數據。

 

聯繫邢不行

推薦閱讀

2018量化炒幣7大玩法覆盤 | 視頻、PPT分享

收藏!量化小講堂前50篇合集(含代碼)

量化投資中經常使用Excel,可能會被同事打

警惕!數字貨幣交易所排名陷阱:到底哪家交易最活躍?(下)

歷年排名前10的基金,在第2年表現如何?Python告訴你答案

在量化投資中,原來K線還能這麼畫(附畫K線代碼)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章