<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          臥槽,我學(xué)會(huì)了用Python預(yù)測(cè)股票價(jià)格

          共 12228字,需瀏覽 25分鐘

           ·

          2020-07-11 12:27

          (給機(jī)器學(xué)習(xí)算法與Python實(shí)戰(zhàn)加星標(biāo),提升AI技能)

          92baa20cad0e5db3ced3855dff315c0d.webp

          作為一種技術(shù)手段,預(yù)測(cè)在金融、證券領(lǐng)域的應(yīng)用非常廣泛,尤其是對(duì)股票價(jià)格的預(yù)測(cè)。我們介紹一下獲得股票數(shù)據(jù)的方法,并基于此對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,接著使用數(shù)據(jù)分析方法,建立基礎(chǔ)特征,進(jìn)一步構(gòu)建預(yù)測(cè)模型,且基于新數(shù)據(jù)驗(yàn)證模型效果。擬使用VAR及LSTM兩種算法建立預(yù)測(cè)模型。

          獲取股票數(shù)據(jù)


          股票數(shù)據(jù)通??蓮男吕斯善?、雅虎股票等網(wǎng)頁上獲取,此外還有一些炒股軟件,如同花順、通達(dá)信等都提供了非常清楚的股票數(shù)據(jù)展示和圖表呈現(xiàn)。如果要獲得實(shí)時(shí)的股票數(shù)據(jù),可以考慮使用新浪股票提供的接口獲取數(shù)據(jù)。以大秦鐵路(股票代碼:601006)為例,如果要獲取它的最新行情,只需訪問新浪的股票數(shù)據(jù)接口(具體可以百度),該接口會(huì)返回一串文本,例如:
          1 var hq_str_sh601006="大秦鐵路,6.980,6.960,7.010,7.070,6.950,7.010,7.020,121033256,847861533.000,18900, 7.010,214867,7.000,66500,6.990,386166,6.980,336728,6.970,273750,7.020,836066,7.030,630800,7.040,936306,7.050,579400,7.060,2016-03-18,15:00:00,00";

          這個(gè)字符串由許多數(shù)據(jù)拼接在一起,不同含義的數(shù)據(jù)用逗號(hào)隔開了,按照程序員的思路,順序號(hào)從0開始。
          0:<大秦鐵路>,股票名字1:<< span="">6.980>,今日開盤價(jià)2:<< span="">6.960>,昨日收盤價(jià)3:<< span="">7.010>,當(dāng)前價(jià)格4:<< span="">7.070>,今日最高價(jià)5:<< span="">6.950>,今日最低價(jià)6:<< span="">7.010>,競(jìng)買價(jià),即“買一”報(bào)價(jià)7:<< span="">7.020>,競(jìng)賣價(jià),即“賣一”報(bào)價(jià)8:<< span="">121033256>,成交的股票數(shù),由于股票交易以一百股為基本單位,所以在使用時(shí),通常把該值除以一百9:<< span="">847861533.000>,成交金額,單位為“元”,為了一目了然,通常以“萬元”為成交金額的單位,所以通常把該值除以一萬10:<< span="">18900>,“買一”申請(qǐng)4695股,即4711:<< span="">7.010>,“買一”報(bào)價(jià)12:<< span="">214867>,“買二”13:<< span="">7.000>,“買二”14:<< span="">66500>,“買三”15:<< span="">6.990>,“買三”16:<< span="">386166>,“買四”17:<< span="">6.980>,“買四”18:<< span="">336728>,“買五”19:<< span="">6.970>,“買五”20:<< span="">273750>,“賣一”申報(bào)3100股,即3121:<< span="">7.020>,“賣一”報(bào)價(jià)(22,23),(24,25),(26,27),(28,29)分別為“賣二”至“賣四的情況”30:<< span="">2016-03-18>,日期31:<< span="">15:00:00>,時(shí)間
          這個(gè)接口對(duì)于JavaScript程序非常方便,如果要查看該股票的日K線圖,可訪問新浪股票的K線圖接口(具體可百度),便可得到日K線圖。aa537168de3a780bf808bb3ce0f2a8cf.webp日K線圖如果要查看該股票的分時(shí)線,可訪問鏈接新浪股票的分時(shí)線圖接口(具體可百度),便可得到分時(shí)線圖。b1e28fbee086a291f9860b6fc4ccae6c.webp
          分時(shí)線圖對(duì)于周K線和月K線的查詢,可分別訪問新浪股票的周K線圖和月K線圖的接口(具體可百度)。Python中我們可以使用pandas_datareader庫來獲取股票數(shù)據(jù),默認(rèn)是訪問yahoofinance的數(shù)據(jù),其中包括上證和深證的股票數(shù)據(jù),還有港股數(shù)據(jù),該庫只能獲取股票的歷史交易記錄信息:如最高價(jià)、最低價(jià)、開盤價(jià)、收盤價(jià)以及成交量,無法獲取個(gè)股的分筆交易明細(xì)歷史記錄。上證代碼是ss,深證代碼是sz,港股代碼是hk,比如茅臺(tái):6000519.ss,萬科000002.sz,長(zhǎng)江實(shí)業(yè)0001.hk。這里以貴州茅臺(tái)股票為例,說明pandas_datareader庫中股票數(shù)據(jù)的獲取方法及簡(jiǎn)單的可視化,代碼如下:
           1import?pandas?as?pd
          2import?pandas_datareader.data?as?web
          3import?datetime?as?dt
          4data?=?web.DataReader('600519.ss','yahoo',?dt.datetime(2019,8,1),dt.datetime(2019,8,31))
          5data.head()
          6??????????????High?????????Low????????Open???????Close????Volume???Adj?Close
          7#?Date?????????????????????
          8#?2019-08-01????977.000000??953.020020??976.51001???959.299988??3508952?959.299988
          9#?2019-08-02????957.979980??943.000000??944.00000???954.450012??3971940?954.450012
          10#?2019-08-05????954.000000??940.000000??945.00000???942.429993??3677431?942.429993
          11#?2019-08-06????948.000000??923.799988??931.00000???946.299988??4399116?946.299988
          12#?2019-08-07????955.530029??945.000000??949.50000???945.000000??2686998?945.000000
          13
          14kldata=data.values[:,[2,3,1,0]]?#?分別對(duì)應(yīng)開盤價(jià)、收盤價(jià)、最低價(jià)和最高價(jià)
          15from?pyecharts?import?options?as?opts
          16from?pyecharts.charts?import?Kline
          17
          18kobj?=?Kline().add_xaxis(data.index.strftime("%Y-%m-%d").tolist()).add_yaxis("貴州茅臺(tái)-日K線圖",kldata.tolist()).set_global_opts(
          19????????????yaxis_opts=opts.AxisOpts(is_scale=True),
          20????????????xaxis_opts=opts.AxisOpts(is_scale=True),
          21????????????title_opts=opts.TitleOpts(title=""))
          22kobj.render()

          貴州茅臺(tái)股票日K線圖如圖。
          94397e0ee7fdb4920da93b0fb3263d44.webp為給定時(shí)間序列的財(cái)務(wù)圖表,代碼中對(duì)象data包含6個(gè)屬性,依次為Open(開盤價(jià))、High(最高價(jià))、Low(最低價(jià))、Close(收盤價(jià))、Volume(成交量)、Adjusted(復(fù)權(quán)收盤價(jià))。基于收盤價(jià)的重要性,可從收盤價(jià)的歷史數(shù)據(jù)中分割訓(xùn)練集、驗(yàn)證集、測(cè)試集,使用適當(dāng)?shù)奶卣鳎㈩A(yù)測(cè)模型,并實(shí)施預(yù)測(cè)。

          基于VAR算法的預(yù)測(cè)


          向量自回歸(VAR)模型就是非結(jié)構(gòu)化的多方程模型,它的核心思想不考慮經(jīng)濟(jì)理論,而直接考慮經(jīng)濟(jì)變量時(shí)間時(shí)序之間的關(guān)系,避開了結(jié)構(gòu)建模方法中需要對(duì)系統(tǒng)中每個(gè)內(nèi)生變量關(guān)于所有內(nèi)生變量滯后值函數(shù)建模的問題,通常用來預(yù)測(cè)相關(guān)時(shí)間序列系統(tǒng)和研究隨機(jī)擾動(dòng)項(xiàng)對(duì)變量系統(tǒng)的動(dòng)態(tài)影響。VAR模型類似聯(lián)立方程,將多個(gè)變量包含在一個(gè)統(tǒng)一的模型中,共同利用多個(gè)變量信息,比起僅使用單一時(shí)間序列的ARIMA等模型,其涵蓋的信息更加豐富,能更好地模擬現(xiàn)實(shí)經(jīng)濟(jì)體,因而用于預(yù)測(cè)時(shí)能夠提供更加貼近現(xiàn)實(shí)的預(yù)測(cè)值。此處擬基于貴州茅臺(tái)股票數(shù)據(jù),建立VAR的預(yù)測(cè)模型。使用后30天的數(shù)據(jù)作為驗(yàn)證集,剩余的數(shù)據(jù)用于建立預(yù)測(cè)模型。本節(jié)從VAR模型的平穩(wěn)性檢驗(yàn)出發(fā),依次完成VAR模型的定階及建模預(yù)測(cè),最終通過分析驗(yàn)證集上的準(zhǔn)確率來評(píng)估預(yù)測(cè)效果。平穩(wěn)性檢驗(yàn)只有平穩(wěn)的時(shí)間序列才能夠直接建立VAR模型,因此在建立VAR模型之前,首先要對(duì)變量進(jìn)行平穩(wěn)性檢驗(yàn)。通??衫眯蛄械淖韵嚓P(guān)分析圖來判斷時(shí)間序列的平穩(wěn)性,如果序列的自相關(guān)系數(shù)隨著滯后階數(shù)的增加很快趨于0,即落入隨機(jī)區(qū)間,則序列是平穩(wěn)的;反之,序列是不平穩(wěn)的。另外,也可以對(duì)序列進(jìn)行ADF檢驗(yàn)來判斷平穩(wěn)性。對(duì)于不平穩(wěn)的序列,需要進(jìn)行差分運(yùn)算,直到差分后的序列平穩(wěn)后,才能建立VAR模型。此處首先提取用于建立預(yù)測(cè)模型的基礎(chǔ)數(shù)據(jù),并對(duì)其進(jìn)行單位根檢驗(yàn),對(duì)應(yīng)的Python代碼如下:
           1import?statsmodels.tsa.stattools?as?stat
          2import?pandas_datareader.data?as?web
          3import?datetime?as?dt
          4import?pandas?as?pd
          5import?numpy?as?np
          6
          7data?=?web.DataReader('600519.ss','yahoo',?dt.datetime(2014,1,1),dt.datetime(2019,9,30))
          8subdata?=?data.iloc[:-30,:4]
          9for?i?in?range(4):
          10????pvalue?=?stat.adfuller(subdata.values[:,i],?1)[1]
          11????print("指標(biāo)?",data.columns[i],"?單位根檢驗(yàn)的p值為:",pvalue)
          12#?指標(biāo)? High ?單位根檢驗(yàn)的p值為:0.9955202280850401
          13#?指標(biāo)? Low ?單位根檢驗(yàn)的p值為:0.9942509439755689
          14#?指標(biāo)? Open ?單位根檢驗(yàn)的p值為:0.9938548193990323
          15#?指標(biāo)? Close ?單位根檢驗(yàn)的p值為:0.9950049124079876

          可以看到,p值都大于0.01,因此都是不平穩(wěn)序列?,F(xiàn)對(duì)subdata進(jìn)行1階差分運(yùn)算,并再次進(jìn)行單位根檢驗(yàn),對(duì)應(yīng)的Python代碼如下:
          1subdata_diff1?=?subdata.iloc[1:,:].values?-?subdata.iloc[:-1,:].values
          2for?i?in?range(4):
          3????pvalue?=?stat.adfuller(subdata_diff1[:,i],?1)[1]
          4????print("指標(biāo)?",data.columns[i],"?單位根檢驗(yàn)的p值為:",pvalue)
          5#?指標(biāo)? High ?單位根檢驗(yàn)的p值為:0.0
          6#?指標(biāo)? Low ?單位根檢驗(yàn)的p值為:0.0
          7#?指標(biāo)? Open ?單位根檢驗(yàn)的p值為:0.0
          8#?指標(biāo)? Close ?單位根檢驗(yàn)的p值為:0.0

          如結(jié)果所示,對(duì)這4個(gè)指標(biāo)的1階差分單獨(dú)進(jìn)行單位根檢驗(yàn),其p值都不超過0.01,因此可以認(rèn)為是平穩(wěn)的。VAR模型定階接下來就是為VAR模型定階,可以讓階數(shù)從1逐漸增加,當(dāng)AIC值盡量小時(shí),可以確定最大滯后期。我們使用最小二乘法,求解每個(gè)方程的系數(shù),并通過逐漸增加階數(shù),為模型定階,Python代碼如下:
           1#?模型階數(shù)從1開始逐一增加
          2rows,?cols?=?subdata_diff1.shape
          3aicList?=?[]
          4lmList?=?[]
          5
          6for?p?in?range(1,11):
          7???baseData?=?None
          8????for?i?in?range(p,rows):
          9????????tmp_list?=?list(subdata_diff1[i,:])?+?list(subdata_diff1[i-p:i].flatten())
          10????????if?baseData?is?None:
          11????????????baseData?=?[tmp_list]
          12????????else:
          13????????????baseData?=?np.r_[baseData,?[tmp_list]]
          14????X?=?np.c_[[1]*baseData.shape[0],baseData[:,cols:]]
          15????Y?=?baseData[:,0:cols]
          16????coefMatrix?=?np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T,X)),X.T),Y)
          17????aic?=?np.log(np.linalg.det(np.cov(Y?-?np.matmul(X,coefMatrix),rowvar=False)))?+?2*(coefMatrix.shape[0]-1)**2*p/baseData.shape[0]
          18????aicList.append(aic)
          19????lmList.append(coefMatrix)
          20
          21#對(duì)比查看階數(shù)和AIC
          22pd.DataFrame({"P":range(1,11),"AIC":aicList})
          23#???P???AIC
          24#?0?1???13.580156
          25#?1?2???13.312225
          26#?2?3???13.543633
          27#?3?4???14.266087
          28#?4?5???15.512437
          29#?5?6???17.539047
          30#?6?7???20.457337
          31#?7?8???24.385459
          32#?8?9???29.438091
          33#?9?10??35.785909

          如上述代碼所示,當(dāng)p=2時(shí),AIC值最小為13.312225。因此VAR模型定階為2,并可從對(duì)象lmList[1]中獲取各指標(biāo)對(duì)應(yīng)的線性模型。?預(yù)測(cè)及效果驗(yàn)證基于lmList[1]中獲取各指標(biāo)對(duì)應(yīng)的線性模型,對(duì)未來30期的數(shù)據(jù)進(jìn)行預(yù)測(cè),并與驗(yàn)證數(shù)據(jù)集進(jìn)行比較分析,Python代碼如下:
           1p?=?np.argmin(aicList)+1
          2n?=?rows
          3preddf?=?None
          4for?i?in?range(30):
          5????predData?=?list(subdata_diff1[n+i-p:n+i].flatten())
          6????predVals?=?np.matmul([1]+predData,lmList[p-1])
          7????#?使用逆差分運(yùn)算,還原預(yù)測(cè)值
          8????predVals=data.iloc[n+i,:].values[:4]+predVals
          9????if?preddf?is?None:
          10?????????preddf?=?[predVals]
          11????else:
          12????????preddf?=?np.r_[preddf,?[predVals]]
          13????#?為subdata_diff1增加一條新記錄
          14????subdata_diff1?=?np.r_[subdata_diff1,?[data.iloc[n+i+1,:].values[:4]?-?data.iloc[n+i,:].values[:4]]]
          15
          16#分析預(yù)測(cè)殘差情況
          17(np.abs(preddf?-?data.iloc[-30:data.shape[0],:4])/data.iloc[-30:data.shape[0],:4]).describe()
          18#???????High?????????Low?????????Open???????Close
          19#?count?30.000000???30.000000???30.000000???30.000000
          20#?mean??0.010060????0.009380????0.005661????0.013739
          21#?std???0.008562????0.009968????0.006515????0.013674
          22#?min???0.001458????0.000115????0.000114????0.000130
          23#?25%???0.004146????0.001950????0.001653????0.002785
          24#?50%???0.007166????0.007118????0.002913????0.010414
          25#?75%???0.014652????0.012999????0.006933????0.022305
          26#?max???0.039191????0.045802????0.024576????0.052800

          從上述代碼第17行可以看出這4個(gè)指標(biāo)的最大百分誤差率分別為3.9191%、4.5802%、2.4576%、5.28%,最小百分誤差率分別為0.1458%、0.0115%、0.0114%、0.013%,進(jìn)一步,繪制二維圖表觀察預(yù)測(cè)數(shù)據(jù)與真實(shí)數(shù)據(jù)的逼近情況,Python代碼如下:
           1import?matplotlib.pyplot?as?plt
          2plt.figure(figsize=(10,7))
          3for?i?in?range(4):
          4????plt.subplot(2,2,i+1)
          5????plt.plot(range(30),data.iloc[-30:data.shape[0],i].values,'o-',c='black')
          6????plt.plot(range(30),preddf[:,i],'o--',c='gray')
          7????plt.ylim(1000,1200)
          8????plt.ylabel("$"+data.columns[i]+"$")
          9plt.show()
          10v?=?100*(1?-?np.sum(np.abs(preddf?-?data.iloc[-30:data.shape[0],:4]).values)/np.sum(data.iloc[-30:data.shape[0],:4].values))
          11print("Evaluation?on?test?data:?accuracy?=?%0.2f%%?\n"?%?v)
          12#?Evaluation?on?test?data:?accuracy?=?99.03%

          該預(yù)測(cè)效果如下圖,其中黑色實(shí)線為真實(shí)數(shù)據(jù),灰色虛線為預(yù)測(cè)數(shù)據(jù),使用VAR模型進(jìn)行預(yù)測(cè)的效果總體還是不錯(cuò)的,平均準(zhǔn)確率為99.03%。針對(duì)多元時(shí)間序列的情況,VAR模型不僅考慮了其他指標(biāo)的滯后影響,計(jì)算效率還比較高,從以上代碼可以看到,對(duì)于模型的擬合,直接使用的最小二乘法,這增加了該模型的適應(yīng)性。35c1d52096195e1a494ccf85348dde58.webp預(yù)測(cè)效果

          基于LSTM算法的預(yù)測(cè)


          本節(jié)主要基于LSTM算法對(duì)貴州茅臺(tái)股票數(shù)據(jù)進(jìn)行預(yù)測(cè),該算法非常擅長(zhǎng)序列數(shù)據(jù)的建模,由于引入了遺忘門等更為復(fù)雜的內(nèi)部處理單元來處理上下文信息的存儲(chǔ)與更新,這樣既可以消除梯度問題的困擾,也可以對(duì)存在短期或長(zhǎng)期依賴的數(shù)據(jù)建模,該算法在文本、語音等序列數(shù)據(jù)模型中廣泛使用。本節(jié)從LSTM建模的數(shù)據(jù)要求及網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)講起,通過設(shè)置合理的參數(shù),通過訓(xùn)練得到模型,并基于該模型進(jìn)行預(yù)測(cè),最后將結(jié)果與真實(shí)數(shù)據(jù)進(jìn)行比較,評(píng)估預(yù)測(cè)效果。數(shù)據(jù)要求本節(jié)使用LSTM算法對(duì)貴州茅臺(tái)股票數(shù)據(jù)進(jìn)行預(yù)測(cè),可基于前N條樣本對(duì)當(dāng)前樣本進(jìn)行預(yù)測(cè),因此該模型不需要像DNN那樣,將歷史數(shù)據(jù)進(jìn)行復(fù)雜轉(zhuǎn)換,將基礎(chǔ)數(shù)據(jù)稍加處理就能用于訓(xùn)練模型。對(duì)基礎(chǔ)數(shù)據(jù)的處理即為對(duì)該數(shù)據(jù)進(jìn)行重新封裝,將樣本前N期的集合與當(dāng)前樣本對(duì)應(yīng)上,分別得到訓(xùn)練數(shù)據(jù)的輸入與輸出。8559f8341db30458be7e30e2581f6825.webp所示數(shù)據(jù)對(duì)應(yīng)關(guān)系(具體數(shù)據(jù)為示意)數(shù)據(jù)預(yù)處理首先,需要將基礎(chǔ)數(shù)據(jù)重構(gòu)為包含歷史3周特征數(shù)據(jù)的基礎(chǔ)數(shù)據(jù),以預(yù)測(cè)日的High(最高價(jià))、Low(最低價(jià))、Open(開盤價(jià))、Close(收盤價(jià))4個(gè)指標(biāo)作為輸出數(shù)據(jù)。這里我們使用2014年1月1日至2019年8月31日的貴州茅臺(tái)股票數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),使用2019年整個(gè)9月的數(shù)據(jù)作為測(cè)試數(shù)據(jù),來驗(yàn)證模型效果。用Python將對(duì)全體數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化,并將基礎(chǔ)數(shù)據(jù)的特征進(jìn)行重構(gòu),代碼如下:
           1SEQLEN?=?21
          2dim_in?=?4
          3dim_out?=?4
          4pred_len?=?30
          5vmean?=?data.iloc[:,:4].apply(lambda?x:np.mean(x))
          6vstd?=?data.iloc[:,:4].apply(lambda?x:np.std(x))
          7t0?=?data.iloc[:,:4].apply(lambda?x:(x-np.mean(x))/np.std(x)).values
          8X_train?=?np.zeros((t0.shape[0]-SEQLEN-pred_len,?SEQLEN,?dim_in))
          9Y_train?=?np.zeros((t0.shape[0]-SEQLEN-pred_len,?dim_out),)
          10X_test?=?np.zeros((pred_len,?SEQLEN,?dim_in))
          11Y_test?=?np.zeros((pred_len,?dim_out),)
          12for?i?in?range(SEQLEN,?t0.shape[0]-pred_len):
          13????Y_train[i-SEQLEN]?=?t0[i]
          14????X_train[i-SEQLEN]?=?t0[(i-SEQLEN):i]
          15for?i?in?range(t0.shape[0]-pred_len,t0.shape[0]):
          16????Y_test[i-t0.shape[0]+pred_len]?=?t0[i]
          17????X_test[i-t0.shape[0]+pred_len]?=?t0[(i-SEQLEN):i]

          如上述代碼所示,SEQLEN表示使用前期數(shù)據(jù)的長(zhǎng)度,dim_in表示輸入數(shù)據(jù)的維度,dim_out表示輸出數(shù)據(jù)的維度,pred_len表示預(yù)測(cè)數(shù)據(jù)的長(zhǎng)度。第5~7行代碼對(duì)數(shù)據(jù)進(jìn)行zscore標(biāo)準(zhǔn)化,將數(shù)據(jù)映射到標(biāo)準(zhǔn)正態(tài)分布。第12~17行代碼對(duì)基礎(chǔ)數(shù)據(jù)進(jìn)行重構(gòu),分別得到訓(xùn)練數(shù)據(jù)X_train、Y_train以及測(cè)試數(shù)據(jù)X_test、Y_test。 網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)經(jīng)嘗試,我們使用近3周的歷史數(shù)據(jù)來訓(xùn)練LSTM模型,同時(shí),設(shè)置隱含層神經(jīng)元的數(shù)量為64。因此,我們可以將LSTM神經(jīng)網(wǎng)絡(luò)按下面的結(jié)構(gòu)進(jìn)行設(shè)計(jì)(圖中N可取21,即3周對(duì)應(yīng)的天數(shù))。50a0860f730f5ce24b2fe9fc6f3b6dfe.webpLSTM神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)建立模型現(xiàn)基于Keras搭建LSTM神經(jīng)網(wǎng)絡(luò),并基于訓(xùn)練集對(duì)模型進(jìn)行訓(xùn)練,Python代碼如下:
           1from?keras.layers?import?LSTM,?Dense
          2from?keras.models?import?Sequential
          3model?=?Sequential()
          4model.add(LSTM(64,?input_shape=(SEQLEN,?dim_in),activation='relu',recurrent_dropout=0.01))
          5model.add(Dense(dim_out,activation='linear'))
          6model.compile(loss?=?'mean_squared_error',?optimizer?=?'rmsprop')
          7history?=?model.fit(X_train,?Y_train,?epochs=200,?batch_size=10,?validation_split=0)
          8#?Epoch?1/200
          9#?1350/1350?[==============================]?-?1s?1ms/step?-?loss:?0.0447
          10#?Epoch?2/200
          11#?1350/1350?[==============================]?-?1s?737us/step?-?loss:?0.0059
          12#?Epoch?3/200
          13#?1350/1350?[==============================]?-?1s?743us/step?-?loss:?0.0043
          14#?......
          15#?Epoch?200/200
          16#?1350/1350?[==============================]?-?1s?821us/step?-?loss:?9.2794e-04

          如上述代碼所示,我們使用rmsprop算法來優(yōu)化模型。由于當(dāng)前的建模場(chǎng)景是數(shù)值預(yù)測(cè),因此使用MSE(均方誤差)來定義損失函數(shù)。算法經(jīng)過200次迭代,loss從0.0447降到了9.2794e-04。我們可以基于得到的模型進(jìn)行進(jìn)一步預(yù)測(cè)。預(yù)測(cè)實(shí)現(xiàn)基于上文得到的模型,進(jìn)一步編寫Python代碼,對(duì)X_test對(duì)應(yīng)的輸出數(shù)據(jù)進(jìn)行預(yù)測(cè)。需要注意的是,直接得到的預(yù)測(cè)結(jié)果是處于標(biāo)準(zhǔn)化的數(shù)據(jù)空間中的,需要將其還原成原始數(shù)據(jù)空間的值,結(jié)果才有意義。對(duì)應(yīng)的Python代碼如下:
          1preddf=model.predict(X_test)*vstd.values+vmean.values

          如上述代碼所示,將模型的預(yù)測(cè)結(jié)果pred_y乘以vstd再加上vmean,即可對(duì)數(shù)據(jù)進(jìn)行還原。preddf即是最終得到的預(yù)測(cè)數(shù)據(jù),可打印其值,代碼如下:
           1preddf
          2#?array([[1069.35781887,?1038.57915742,?1056.77147186,?1053.83827734],
          3#???????[1070.65142282,?1039.58533719,?1057.34561875,?1054.85567074],
          4#???????[1083.58529328,?1052.70457308,?1070.78824637,?1067.49741882],
          5#????
          6#???????[1186.19297789,?1161.52758381,?1172.33666591,?1170.44623263],
          7#???????[1181.42680223,?1155.14778501,?1166.5726204?,?1165.00336968],
          8#???????[1186.75600881,?1160.84733425,?1172.37636963,?1170.09819923]])
          9
          10preddf.shape
          11#?(30,?4)

          如上述代碼所示,preddf是一個(gè)的二維數(shù)據(jù),包含了2019年9月整月的預(yù)測(cè)結(jié)果。效果評(píng)估對(duì)貴州茅臺(tái)股票數(shù)據(jù)預(yù)測(cè)的效果評(píng)估可以采用兩種方法。一種方法是對(duì)預(yù)測(cè)的結(jié)果與真實(shí)結(jié)果進(jìn)行繪圖比較,通過直觀觀察可以知道預(yù)測(cè)效果,如果預(yù)測(cè)曲線與真實(shí)曲線完全重合或相當(dāng)接近,則說明預(yù)測(cè)效果較好;反之,則說明預(yù)測(cè)模型還需要改進(jìn)。另一種方法是基于貴州茅臺(tái)股票數(shù)據(jù)預(yù)測(cè)的誤差累計(jì)值來計(jì)算一個(gè)誤差率,從而得到平均精度水平,該值越大說明整體預(yù)測(cè)效果也就越好,該值越小說明預(yù)測(cè)模型還存在優(yōu)化空間。編寫Python代碼,同時(shí)實(shí)現(xiàn)預(yù)測(cè)結(jié)果與真實(shí)數(shù)據(jù)的對(duì)比圖,以及計(jì)算累計(jì)誤差,從而全面地評(píng)估預(yù)測(cè)效果,代碼如下:
           1import?matplotlib.pyplot?as?plt
          2plt.figure(figsize=(10,7))
          3for?i?in?range(4):
          4????plt.subplot(2,2,i+1)
          5????plt.plot(range(30),data.iloc[-30:data.shape[0],i].values,'o-',c='black')
          6????plt.plot(range(30),preddf[:,i],'o--',c='gray')
          7????plt.ylim(1000,1200)
          8????plt.ylabel("$"+data.columns[i]+"$")
          9plt.show()
          10v?=?100*(1?-?np.sum(np.abs(preddf?-?data.iloc[-30:data.shape[0],:4]).values)/np.sum?(data.iloc[-30:data.shape[0],:?4].values))
          11print("Evaluation?on?test?data:?accuracy?=?%0.2f%%?\n"?%?v)
          12#?Evaluation?on?test?data:?accuracy?=?99.01%

          預(yù)測(cè)評(píng)估對(duì)比圖如下。5903968ee162ddcf69030e5b4b8b9f49.webp我們可以看到,黑色實(shí)線為真實(shí)數(shù)據(jù),灰色虛線為預(yù)測(cè)數(shù)據(jù),橫坐標(biāo)為日期下標(biāo),縱坐標(biāo)為對(duì)應(yīng)的股票價(jià)格。使用LSTM模型進(jìn)行預(yù)測(cè)的效果總體還是不錯(cuò)的,平均準(zhǔn)確率為99.01%。對(duì)于多元時(shí)間序列數(shù)據(jù),可嘗試使用LSTM模型,該模型能夠記憶歷史較長(zhǎng)的重要信息,可有效識(shí)別歷史數(shù)據(jù)中存在的規(guī)律和模式,如今廣泛應(yīng)用于包含大量序列數(shù)據(jù)的場(chǎng)景中。本文節(jié)選自《Python預(yù)測(cè)之美:數(shù)據(jù)分析與算法實(shí)戰(zhàn)》一書。

          791c1bbebc8a488fb2e70ad64f92fec9.webp


          《Python預(yù)測(cè)之美:數(shù)據(jù)分析與算法實(shí)戰(zhàn)(雙色)》

          游皓麟 著


          • 以Python語言為基礎(chǔ),體系化介紹預(yù)測(cè)技術(shù)工程實(shí)施的必備技能

          基于Python 來做預(yù)測(cè),不僅能夠在業(yè)務(wù)上快速落地,還讓代碼維護(hù)起來更加方便。對(duì)預(yù)測(cè)原理的深度剖析和算法的細(xì)致解讀,是本書的一大亮點(diǎn)。本書共分為預(yù)測(cè)基礎(chǔ)、預(yù)測(cè)算法、預(yù)測(cè)案例三部分。希望讀者在看完本書后,能夠?qū)⒈緯木跁?huì)貫通,進(jìn)一步在工作和學(xué)習(xí)實(shí)踐中提煉價(jià)值。


          (掃碼了解本書詳情)



          加入機(jī)器學(xué)習(xí)、Python微信群

          請(qǐng)后臺(tái)回復(fù)【入群】

          推薦閱讀

          (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

          機(jī)器學(xué)習(xí)入門:硬核拆解GBDT

          學(xué)深度學(xué)習(xí)是不是需要先學(xué)機(jī)器學(xué)習(xí)?為什么“晚上9點(diǎn)鐘洗澡的大學(xué)生成績(jī)更好”?


          如果喜歡本文03f751eba72045f3e5d74babe7d39e06.webp
          歡迎?在看留言分享至朋友圈?三連
          瀏覽 62
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  俺也去色网| 久久综合新金瓶梅一级黄大片 | 老女人操逼视频网站 | 亚洲精品综合在线 | 日韩黄色电影在线观看 |