鄭樹挺,徐菲菲
(上海電力大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,上海 200000)
金融市場(chǎng)被認(rèn)為是世界經(jīng)濟(jì)的核心,每天交易額巨大,對(duì)市場(chǎng)未來行為的預(yù)測(cè)對(duì)投資者來說具有重要的價(jià)值,包括股票市場(chǎng)、貨幣匯率[1]、原油價(jià)格[2]、商品價(jià)格和比特幣[3]等加密貨幣。由于市場(chǎng)的動(dòng)態(tài)和嘈雜的行為,市場(chǎng)預(yù)測(cè)也是一項(xiàng)非常具有挑戰(zhàn)性的任務(wù),吸引了較多學(xué)者的關(guān)注。
對(duì)股票市場(chǎng)的預(yù)測(cè)是一個(gè)非常具有挑戰(zhàn)性的問題,影響股票市場(chǎng)價(jià)格有很多因素,如公司新聞和業(yè)績(jī)、行業(yè)表現(xiàn)、投資者情緒、社交媒體情緒和經(jīng)濟(jì)因素,用于預(yù)測(cè)的特征更是多種多樣:價(jià)格數(shù)據(jù),歷史數(shù)據(jù)的技術(shù)指標(biāo),與個(gè)股有關(guān)的其他市場(chǎng)價(jià)格波動(dòng),貨幣匯率,油價(jià)等。自動(dòng)提取特征并進(jìn)行準(zhǔn)確的市場(chǎng)預(yù)測(cè)受到了較多學(xué)者的關(guān)注。
現(xiàn)有的金融市場(chǎng)分析方法一般分為兩大類,一是基本面分析,另一個(gè)是技術(shù)分析。
在技術(shù)分析中,目標(biāo)市場(chǎng)的歷史數(shù)據(jù)和其他一些技術(shù)指標(biāo)均是預(yù)測(cè)的重要因素。根據(jù)有效市場(chǎng)假設(shè)[4],股票價(jià)格可以反映出它們的所有信息。技術(shù)分析通過分析以前的價(jià)格數(shù)據(jù)和技術(shù)指標(biāo)預(yù)測(cè)市場(chǎng)價(jià)格的未來趨勢(shì)。而基本面分析研究證券投資的內(nèi)在價(jià)值,可以通過獲取相關(guān)資產(chǎn)(主要是股票或交易所交易基金)的財(cái)務(wù)報(bào)表的詳細(xì)信息來實(shí)現(xiàn),如現(xiàn)金流量、增長(zhǎng)率、貼現(xiàn)因子、每年折扣和資本化率等,以深入了解公司的未來發(fā)展前途?;久娣治鐾ǔS糜跊Q定應(yīng)選擇哪種股票進(jìn)行交易。
已經(jīng)有多種機(jī)器學(xué)習(xí)技術(shù)廣泛應(yīng)用于金融市場(chǎng)的預(yù)測(cè),并取得了一定的效果,其中神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)(support vector machine,SVM)[5-7]使用的最多,例如,趙澄[8]使用SVM來預(yù)測(cè)金融新聞對(duì)股票市場(chǎng)的影響。此外,隨機(jī)森林[9]、遺傳算法[10-13]、集成學(xué)習(xí)[14-15]等技術(shù)也已成功應(yīng)用于從原始金融數(shù)據(jù)中提取特征并基于特征進(jìn)行預(yù)測(cè)[16-17]。
深度學(xué)習(xí)(deep learning)[18-19]是一類適合自動(dòng)特征提取和預(yù)測(cè)的方法,在許多領(lǐng)域如機(jī)器視覺、自然語(yǔ)言處理以及語(yǔ)音信號(hào)處理,深度學(xué)習(xí)方法能夠從原始數(shù)據(jù)或更簡(jiǎn)單的特征逐漸構(gòu)建有用的復(fù)雜特征。由于股票市場(chǎng)的行為是復(fù)雜的、非線性的,而且股票數(shù)據(jù)具有噪聲,提取出準(zhǔn)確的特征以進(jìn)行預(yù)測(cè)面臨著巨大的挑戰(zhàn)。研究者嘗試了多種深度學(xué)習(xí)算法用于預(yù)測(cè)股票市場(chǎng),如:深層多層感知器(MLP)[20]、Restricted Boltzmann Machine(RBM)[21-22]、Long Short-Term Memory(LSTM)[23-25]、Auto-Encoder(AE)[26]和Convolutional Neural Network(CNN)。
Periso & Honchar[27]將CNN用于股票分析中,根據(jù)收盤價(jià)的歷史數(shù)據(jù)進(jìn)行預(yù)測(cè),由于忽略了技術(shù)指標(biāo)等其他可能的信息數(shù)據(jù),預(yù)測(cè)的準(zhǔn)確率并不高。Gunduz[28]將每個(gè)樣本的相關(guān)技術(shù)指標(biāo)送入CNN中,提高了預(yù)測(cè)的準(zhǔn)確率。Ding[29]通過對(duì)上市公司發(fā)出的公告進(jìn)行事件提取來進(jìn)行預(yù)測(cè)股價(jià)走向;Nguyen[30]、劉斌[31]則是基于社交媒體情緒分析的主題建模,然后用于股票市場(chǎng)預(yù)測(cè)?;谖谋拘畔⑻幚淼姆椒m然取得了一定的效果,但因?yàn)槟壳白匀徽Z(yǔ)言處理技術(shù)中語(yǔ)義理解方面仍然是一個(gè)難題,所以有一定的局限。
總體來說,現(xiàn)有的機(jī)器學(xué)習(xí)應(yīng)用于股票預(yù)測(cè)主要分為兩類方法。第一類包括通過增強(qiáng)預(yù)測(cè)模型來提高預(yù)測(cè)性能的算法,而第二類算法側(cè)重于改進(jìn)基于預(yù)測(cè)的輸入特征。雖然現(xiàn)有的研究取得了一些成果,但預(yù)測(cè)的準(zhǔn)確率有待進(jìn)一步的提升。該文通過改進(jìn)Self-Attention結(jié)構(gòu),分別對(duì)日線數(shù)據(jù)、分時(shí)線數(shù)據(jù)以及籌碼結(jié)構(gòu)進(jìn)行編碼并融合信息。實(shí)驗(yàn)結(jié)果表明,所提方法能夠有效提升股票未來走勢(shì)的判斷準(zhǔn)確率并提高投資收益率。
循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)已經(jīng)被證實(shí)適合處理時(shí)間序列數(shù)據(jù),圖1所示為RNN的結(jié)構(gòu)。
圖1 RNN結(jié)構(gòu)示意圖
令s
s
(1)
其中,f一般是非線性的激活函數(shù),如sigmoid或tanh。RNN通過Backpropagation Through Time (BPTT)算法更新參數(shù),然而缺陷是無法處理序列長(zhǎng)度過大的數(shù)據(jù),因?yàn)闀?huì)帶來梯度消失或梯度爆炸的問題。當(dāng)然,目前已經(jīng)提出多種方法解決這個(gè)問題,如LSTM、GRU。
LSTM與GRU在結(jié)構(gòu)上很相像,在Transformer出現(xiàn)之前是處理時(shí)間序列問題的主流算法,如圖2所示為一個(gè)LSTM cell的網(wǎng)絡(luò)結(jié)構(gòu)。
圖2 LSTM結(jié)構(gòu)示意圖
具體來說,在LSTM循環(huán)單元中包含三個(gè)門(gate),F(xiàn)orget gate決定要扔掉哪些信息,計(jì)算公式見式(2):
f
(2)
Updating gate決定要增加哪些新的信息,計(jì)算公式見式(3):
i
(3)
Forget gate和Updating gate一起決定了“長(zhǎng)記憶”c
(4)
(5)
Output gate決定了“短記憶”a
o
(6)
a
(7)
可以看出,在實(shí)際使用時(shí),幾個(gè)門值不僅僅取決于a
Transformer[32]是谷歌在2017年發(fā)布的一個(gè)全新的網(wǎng)絡(luò)結(jié)構(gòu),Transformer本質(zhì)上就是一個(gè)Attention結(jié)構(gòu),它能夠直接獲取全局的信息,而不像RNN需要逐步遞歸才能獲得全局信息,也不像CNN只能獲取局部信息,并且其能夠進(jìn)行并行運(yùn)算,要比RNN快很多倍。Transformer中一個(gè)重要的結(jié)構(gòu)是Multi-Head Attention,計(jì)算公式見式(8),其中headi的計(jì)算公式見式(9):
MultiHead(Q,K,V)=Concat(head1,head2,…,
headh)Wo
(8)
(9)
這里的Multi-Head的含義是,每個(gè)Transformer結(jié)構(gòu)會(huì)由多層結(jié)構(gòu)完全一樣,但權(quán)重矩陣不同的Attention組成,也就是Self-Attention結(jié)構(gòu)。這么做的目的是為了防止模型只關(guān)注到一部分特征,卻忽略了其他特征,所以增加模型的厚度,讓模型擁有多層結(jié)構(gòu)相同但是權(quán)重不同的Attention,每一個(gè)head都關(guān)注到不同的特征,那么模型整體就會(huì)關(guān)注到更多的特征。
實(shí)驗(yàn)采用的數(shù)據(jù)將是從2018年1月1日到2019年10月31號(hào)、上證50成份股中的股票數(shù)據(jù)。數(shù)據(jù)獲取途徑均是從網(wǎng)絡(luò)上爬取下載獲得,從滬股通官網(wǎng)獲取到每日上證股票的港資持股量以及所占個(gè)股比例,從上海證券交易所官網(wǎng)獲取到每日個(gè)股的融資余額、融資買入額以及融資償還額,其他的分別是從“同花順”、“東方財(cái)富”等網(wǎng)站獲取。Input0包括K線數(shù)據(jù),例如:開盤價(jià)、收盤價(jià)、最高價(jià)、最低價(jià)、日成交量、日成交額、換手率、MA5、MA10、MA20、MA30、市盈率、市凈率等,以及個(gè)股的滬股通數(shù)據(jù)、融資融券數(shù)據(jù)、資金流向數(shù)據(jù)(小、中、大、特大單的買入賣出量以及買入賣出額,以及凈流入量和凈流入額)等;Inpu1包括分時(shí)線數(shù)據(jù),包含分時(shí)價(jià)格和分時(shí)成交量;Input2包括籌碼結(jié)構(gòu)信息。
因?yàn)楂@取到的K線數(shù)據(jù)是未復(fù)權(quán)的,所以從2019年10月31號(hào)開始向前復(fù)權(quán)。將所有跟成交量有關(guān)的數(shù)據(jù)的單位統(tǒng)一轉(zhuǎn)換成“手”(1手等于100股),將所有跟金額有關(guān)的數(shù)據(jù)的單位統(tǒng)一轉(zhuǎn)換成“萬(wàn)元”。下載的滬股通數(shù)據(jù)包括總持股數(shù)量和總持股占比,由前后兩日的總持股數(shù)量計(jì)算出單日滬股通成交量,再計(jì)算出滬股通當(dāng)日凈成交量的占比。下載的融資融券數(shù)據(jù)包括融資余額和融券余額,分別計(jì)算出當(dāng)日融資余額和融券余額占當(dāng)日成交額的占比。小、中、大、特大單的買入賣出量以及買入賣出額,以及凈流入量和凈流入額也相應(yīng)轉(zhuǎn)換成當(dāng)日成交量或成交額的占比。
對(duì)部分特征進(jìn)行歸一化處理,如成交量、成交額、流通股本等。對(duì)所有股票數(shù)據(jù)進(jìn)行處理,生成時(shí)間序列數(shù)據(jù)(模型的Input0、Input1),維度為(L,M,N),其中M表示樣本數(shù),N表示總特征數(shù),L表示序列長(zhǎng)度,也就是已知的前L天的數(shù)據(jù),即L天的數(shù)據(jù)為一組特征,用前L天的數(shù)據(jù)來預(yù)測(cè)后一天漲幅。將時(shí)間序列數(shù)據(jù)的特征數(shù)分為兩個(gè)輸入分別對(duì)應(yīng)于模型的兩個(gè)輸入Input0和Input1。
“漲幅”為用來訓(xùn)練的標(biāo)簽,定義為:(當(dāng)日收盤價(jià)-昨日收盤價(jià))/昨日收盤價(jià);“漲幅正負(fù)”為用來驗(yàn)證準(zhǔn)確率和精度的標(biāo)簽。這邊設(shè)定當(dāng)漲幅為正時(shí),則判定該股票的趨勢(shì)為漲(label:1);當(dāng)漲幅不為正時(shí),則判定該股票的趨勢(shì)為跌(label:0)。
對(duì)數(shù)據(jù)集進(jìn)行劃分,其中訓(xùn)練集數(shù)據(jù)的時(shí)間段為2018.01.01~2019.08.31,測(cè)試集數(shù)據(jù)的時(shí)間段為 2019.09.01~2019.10.31。分別對(duì)訓(xùn)練集和測(cè)試集的漲跌分布進(jìn)行了統(tǒng)計(jì)分析,發(fā)現(xiàn)訓(xùn)練集和測(cè)試集的漲跌分布有一定的差異性,證明了改進(jìn)的模型在后續(xù)的實(shí)驗(yàn)中具有一定的泛化性。
在股票交易操作上,一般短線操作都會(huì)實(shí)時(shí)關(guān)注個(gè)股的分時(shí)線走勢(shì)。在之前的一些研究中,利用機(jī)器學(xué)習(xí)預(yù)測(cè)股票一般都只關(guān)注了個(gè)股的日K線走勢(shì)及數(shù)據(jù),而忽略了每日的分時(shí)線數(shù)據(jù)及其他一些數(shù)據(jù)。每日的分時(shí)線數(shù)據(jù)隱藏了大量的交易信息,例如可以看出大資金的流入流出,對(duì)于個(gè)股未來趨勢(shì)的預(yù)測(cè)提供了大量有用的信息。
改進(jìn)的模型基于Self-Attention架構(gòu),解碼器采用全連接層,在編碼器端合并了日線數(shù)據(jù)(Input0)、分時(shí)線數(shù)據(jù)(Input1)以及籌碼結(jié)構(gòu)數(shù)據(jù)(Input2),如圖3所示。分時(shí)線數(shù)據(jù)編碼器采用Multi-Head Attention和Feed Forward堆疊而成,有N層;日線數(shù)據(jù)編碼器也由N層堆疊而成,前N-1層結(jié)構(gòu)一樣,但不共享參數(shù),最后一層通過對(duì)分時(shí)線數(shù)據(jù)編碼器輸出做Multi-head Attention輸出o1,對(duì)自身做Multi-head Attention輸出o0;籌碼結(jié)構(gòu)編碼器采用全連接層,輸出o2。融合三個(gè)輸出o并進(jìn)行解碼,計(jì)算公式見式(10)、(11)、(12):
m=σ(Wm·[o0,o1]+bm)
(10)
n=m⊙o0+(1-m)o1
(11)
o=Concat(n,o2)
(12)
圖3 改進(jìn)的Self-Attention模型
在訓(xùn)練階段,做的是回歸任務(wù),即預(yù)測(cè)股票漲跌的幅度,損失函數(shù)用的是均方根誤差(root mean squared error,RMSE),計(jì)算公式見式(13):
(13)
根據(jù)樣本的真實(shí)結(jié)果和模型預(yù)測(cè)結(jié)果,將樣本分為四類:
TP(true positive),樣本是正樣本并且模型預(yù)測(cè)結(jié)果也是正樣本的個(gè)數(shù);
FN(false negative),樣本是正樣本但模型預(yù)測(cè)結(jié)果是負(fù)樣本的個(gè)數(shù);
FP(false positive),樣本是負(fù)樣本但模型預(yù)測(cè)結(jié)果是正樣本的個(gè)數(shù);
TN(true negative),樣本是負(fù)樣本并且模型預(yù)測(cè)結(jié)果也是負(fù)樣本的個(gè)數(shù)。
評(píng)價(jià)模型性能使用以下2個(gè)指標(biāo):準(zhǔn)確率 (Accuracy)和精確率(Precision)。
(14)
(15)
實(shí)驗(yàn)硬件配置為CPU:AMD-3700X,內(nèi)存:32 G,GPU:RTX-2070。操作系統(tǒng)為UBUNTU 18.04,Python版本為3.7.3,深度學(xué)習(xí)框架采用Pytorch。優(yōu)化器選擇Adam,學(xué)習(xí)率為1e-4,使用256的小批量大小。
為了測(cè)試不同長(zhǎng)度L的歷史數(shù)據(jù)對(duì)實(shí)驗(yàn)結(jié)果的影響,使用改進(jìn)的Self-Attention模型測(cè)試了不同L對(duì)預(yù)測(cè)準(zhǔn)確率的影響,實(shí)驗(yàn)結(jié)果見圖4。
圖4 不同長(zhǎng)度L對(duì)結(jié)果的影響
在測(cè)試集數(shù)據(jù)上,使用相同步驟的預(yù)處理步驟(這邊使用的歷史數(shù)據(jù)長(zhǎng)度L為30),在不同的模型上進(jìn)行測(cè)試得出的數(shù)據(jù),如表1所示。可以發(fā)現(xiàn),RMSE降低了不少。圖5展示了改進(jìn)的Self-Attention模型在部分個(gè)股上的預(yù)測(cè)結(jié)果。
圖5 改進(jìn)的Self-Attention預(yù)測(cè)值
表1 算法性能對(duì)比
通過模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)買賣點(diǎn)以及收益率,選取股票“浦發(fā)銀行”作為操作說明。因?yàn)樵撃P褪峭ㄟ^前L天(這里L(fēng)取30)的數(shù)據(jù)預(yù)測(cè)后一天的漲幅,所以當(dāng)預(yù)測(cè)的漲幅大于等于1%的時(shí)候,模型提示買入;預(yù)測(cè)的漲幅小于等于-1%的時(shí)候,模型提示賣出;當(dāng)預(yù)測(cè)的漲幅在-1%到1%之間的時(shí)候,模型提示不操作。圖6展示了預(yù)測(cè)模型對(duì)買點(diǎn)和賣點(diǎn)的判斷,圖中提示的買賣時(shí)間點(diǎn)是每日的剛開盤時(shí)間(即9:30)。假設(shè)采取的策略是:當(dāng)未持有該股票時(shí),提示買入的時(shí)候,買入100股的股票;當(dāng)持有該股時(shí),提示買入的時(shí)候,不進(jìn)行買賣操作;當(dāng)提示賣出的時(shí)候,賣出持有該個(gè)股的所有股票,如果不持有該個(gè)股的股票則不進(jìn)行買賣操作;既沒有提示買入也沒有提示賣出的時(shí)候,則不進(jìn)行買賣操作。根據(jù)圖6,在“20190904”日剛開盤的時(shí)候以11.4的價(jià)格買入100股,在“20190905”日的時(shí)候雖然提示買入,當(dāng)已經(jīng)持有該股票,所以不進(jìn)行操作,直到在“20190916”日剛開盤的時(shí)候以11.99的價(jià)格賣出100股,收益率是(11.99-11.4)/11.4=0.051 7,所以在“20190613”賣出的操作中收益率為0.051 7,其他的賣點(diǎn)收益計(jì)算類似。只有當(dāng)進(jìn)行賣出操作的時(shí)候收益率才會(huì)變化,圖7展示了三只股票在測(cè)試數(shù)據(jù)上的收益率變化。圖8展示了同期上證50指數(shù)的投資收益率以及采用模型預(yù)測(cè)的上證50個(gè)股平均收益率??梢园l(fā)現(xiàn),改進(jìn)Self-Attention模型可以提高投資收益率。
圖6 浦發(fā)銀行K線及買賣提示圖
圖7 部分個(gè)股投資收益變化曲線
圖8 同期投資收益變化
該文提出一種基于Self-Attention模型的金融時(shí)間序列預(yù)測(cè)模型,使用該模型預(yù)測(cè)中國(guó)證券市場(chǎng)上證50成分股,通過實(shí)驗(yàn)驗(yàn)證了模型的準(zhǔn)確率和精確率:模型的預(yù)測(cè)準(zhǔn)確率為61.32%,對(duì)正樣本的預(yù)測(cè)精確率為63.04%,這說明了改進(jìn)的模型可以有效預(yù)測(cè)股票趨勢(shì)。在與其他模型的對(duì)比中效果更優(yōu)。由圖8可知,通過模型的預(yù)測(cè)買賣點(diǎn)進(jìn)行股票買賣操作,在測(cè)試數(shù)據(jù)上的投資收益率為6.562%,而同期上證50指數(shù)的收益率3.260%,收益率提高了101.28%。所以改進(jìn)的模型可以有效輔助投資并取得一定的收益,這表明該模型在股價(jià)趨勢(shì)預(yù)測(cè)上具有一定的有效性和實(shí)用性。
由于中國(guó)股市的散戶占比大,市場(chǎng)容易受到情緒波動(dòng)的影響,因此下一步將結(jié)合對(duì)股民情緒的分析以增加模型的準(zhǔn)確率。