A股一直有新股不敗的神話。打新股幾乎是穩(wěn)賺不賠的生意。但是新股中簽率一般只有萬分之一到五之間。中國電信是最容易打中的新股之一,中簽率也只有0.95%。既然新股如此難中,我們能否退而求其次,在二級(jí)市場(chǎng)上參與新股的投資?
實(shí)際上,作者提出這個(gè)問題,是受三峽能源的啟示。三峽能源低價(jià)上市,上市第三天即打開漲停板,給了普通投資者一個(gè)非常好的參與的機(jī)會(huì)。如果當(dāng)天上車,后面短短7個(gè)交易日,出現(xiàn)了幾乎翻倍的行情。關(guān)鍵是,能否提前預(yù)測(cè)出新股的價(jià)格?如果不能,那么參與新股炒作,無疑只是一種賭博而已。
這篇文章探索了通過機(jī)器學(xué)習(xí)模型預(yù)測(cè)新股上市前幾日表現(xiàn)的問題。我們通過模型預(yù)測(cè)新股上市前幾日的收益率,分別就以下四種情況,做出了四個(gè)模型:
在上市交易前進(jìn)行預(yù)測(cè)的模型,我們稱之為零日模型(zero),在上市后進(jìn)行預(yù)測(cè)的模型,則稱之為day one模型。
新股數(shù)據(jù)可以從東方財(cái)富網(wǎng)上抓取。從網(wǎng)上抓取的數(shù)據(jù)中,我們主要關(guān)心的是以下幾個(gè)字段:
上述字段為兩種模型共用。
day one模型還需要的字段有:
預(yù)測(cè)目標(biāo)則分別是連續(xù)漲停的一字板數(shù),以及最高漲幅(連續(xù)上漲至首次回調(diào)前)。這樣我們大概能得到2700條左右的數(shù)據(jù)。這個(gè)數(shù)據(jù)量,也只能使用機(jī)器學(xué)習(xí)模型來進(jìn)行訓(xùn)練了。
其中注冊(cè)制新股的數(shù)據(jù)還要更少一點(diǎn)。所以在訓(xùn)練注冊(cè)制新股預(yù)測(cè)模型時(shí),我們將連續(xù)一字板漲停、及以后不回調(diào)情況下的上漲出現(xiàn)的最高點(diǎn)數(shù)據(jù)作為target,來進(jìn)行訓(xùn)練,這樣可以也能得到2000多條數(shù)據(jù)。
當(dāng)然,漲停板有助漲助跌的效果,這樣換算的數(shù)據(jù),應(yīng)該不是最佳的。
首選的模型當(dāng)然是xgboost。由于我們要預(yù)測(cè)的對(duì)象,無論是連續(xù)板個(gè)數(shù),還是最高漲幅,都不具有類別屬性,因此,這是一個(gè)回歸問題,我們需要采用回歸模型。
為了找出最佳超參數(shù),我們直接使用了grid search的方法,并且在構(gòu)造RandomizedSearchCV時(shí),傳入`refit=True`。這樣一旦最佳超參數(shù)確立,RandomizedSearchCV還將使用最佳超參數(shù)訓(xùn)練出最佳模型。然后我們保存這個(gè)模型,即可用于此后的預(yù)測(cè)。
在sklearn的grid search方法中,帶CV字樣的,表明它使用了cross validation方法,這也是在樣本量不足的情況下,常用的一種方法。
它的原理是,正常情況下,為了防止data leak,我們?cè)谟?xùn)練前,將數(shù)據(jù)劃分為train、validation和test三個(gè)子集。訓(xùn)練時(shí)只使用train和validation數(shù)據(jù)集,訓(xùn)練完成后,再用test來測(cè)試一下,該模型對(duì)從未見過的數(shù)據(jù),其效果如何。
但這樣做也會(huì)導(dǎo)致validation的數(shù)據(jù)無法用于訓(xùn)練,從而使得小樣本數(shù)據(jù)量下,訓(xùn)練更是捉襟見肘。所以我們使用cross validation的方法,只將數(shù)據(jù)劃分為train和test兩個(gè)數(shù)據(jù)集,在train數(shù)據(jù)集中,再滾動(dòng)劃分train和validation子集。當(dāng)一部分?jǐn)?shù)據(jù)(n-1)/n用于訓(xùn)練時(shí),另一部分?jǐn)?shù)據(jù)(1/n)用以驗(yàn)證,然后再進(jìn)行輪換。
上述代碼中,使用了三分法(`cv=3`),即每次使用1/3的數(shù)據(jù)用以驗(yàn)證。在超參數(shù)指定的空間里,我們又將其劃分為100個(gè)迭代進(jìn)行參數(shù)搜尋。因此上面定義的`search`對(duì)象,實(shí)際上會(huì)進(jìn)行300次訓(xùn)練。
如果有GPU可以用的話,在定義model時(shí),可以加上這樣的參數(shù),以啟用GPU:```model = XGBRegressor(tree_method='gpu_hist')```這樣訓(xùn)練的速度要提升幾倍(當(dāng)然遠(yuǎn)不及深度學(xué)習(xí)那樣提升得多)。
我們先感性地認(rèn)識(shí)一下預(yù)測(cè)與真實(shí)值之間的差異:
day-one模型預(yù)測(cè)結(jié)果
zero模型預(yù)測(cè)結(jié)果
可以看出,day-one模型由于有了真實(shí)交易數(shù)據(jù),預(yù)測(cè)結(jié)果比較準(zhǔn)確;zero模型也不算差。
不過,究竟這兩個(gè)模型的誤差有多大呢?我們還需要通過定量的方法來評(píng)估一下。
在訓(xùn)練時(shí)我們使用了RMSE(這是regressor默認(rèn)的loss)。但在結(jié)果評(píng)估時(shí),為了更直觀地理解誤差大小,我們使用了MAE(mean absolute error),即預(yù)測(cè)值與真實(shí)值之間的絕對(duì)值誤差。
MAE
這個(gè)結(jié)果好得令人難以置信。特別是day-one模型,平均誤差僅為0.48個(gè)板!當(dāng)然,這個(gè)數(shù)據(jù)是在全體非注冊(cè)制新股記錄中獲取的,它們有一部分已經(jīng)參與了訓(xùn)練,可能發(fā)生data leak。但是,在訓(xùn)練結(jié)束后,通過計(jì)算在test數(shù)據(jù)集上的MAE,我們得到day-one模型的誤差僅為0.45,確實(shí)是相當(dāng)好的結(jié)果。
股價(jià)預(yù)測(cè)是一件很難的事。為什么我們的模型可以很好地預(yù)測(cè)新股上市的漲停板個(gè)數(shù)?這很可能跟當(dāng)前的發(fā)行制度有關(guān)。新股流通股的持有者主要是機(jī)構(gòu),機(jī)構(gòu)關(guān)于定價(jià),有自己的固有邏輯,因此,股價(jià)較為確定。這是股價(jià)可以預(yù)測(cè)的客觀因素。只有當(dāng)一件事有規(guī)律可尋,我們才能發(fā)現(xiàn)規(guī)律。如果股價(jià)真的是隨機(jī)的,不確定的,那么無論用什么樣的方法,都是無法預(yù)測(cè)的。
這件事的第二個(gè)意義就是,在股票市場(chǎng)上,一定存在著在某些條件下,證券有確定的定價(jià)的情況。因此,大力使用機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的方法,完成可能找到這些場(chǎng)景下的套利機(jī)會(huì)。
第三點(diǎn)思考的則是一則壞消息。盡管漲停板的個(gè)數(shù)可以準(zhǔn)確地預(yù)測(cè),但對(duì)于散戶來講,新股即使是上市以后,仍然很難買到。這個(gè)模型的主要作用,一是對(duì)機(jī)構(gòu)和有VIP通道的大戶有用;二是對(duì)于中簽的散戶,可以提前知道大概應(yīng)該何時(shí)下車。
聯(lián)系客服