用Python結(jié)合人工智能?chē)L試預(yù)測(cè)股票,會(huì)成就下一個(gè)股神? 預(yù)備條件:假設(shè)您熟悉python,并且已經(jīng)在系統(tǒng)中安裝了python 3。本教程中使用了jupyter筆記本。您可以使用自己喜歡的IDE。 使用的數(shù)據(jù)集:本教程中使用的數(shù)據(jù)集是基于Tushare獲取的股票信息。更多股票代碼可以用下面的搜索工具獲取。至于Tushare的使用,可以參考以前的python神級(jí)技巧,不要爬蟲(chóng)一分鐘獲取股票基金持股情況文章學(xué)習(xí)。 安裝所需的庫(kù)對(duì)于此項(xiàng)目,您需要在python中安裝以下軟件包。如果未安裝,則只需使用即可pip install PackageName。
開(kāi)始編碼首先,需要導(dǎo)入將在項(xiàng)目中使用的庫(kù)。在這里,numpy用于創(chuàng)建NumPy數(shù)組以訓(xùn)練和測(cè)試數(shù)據(jù)。pandas用于制作數(shù)據(jù)集的數(shù)據(jù)框并輕松檢索值。matplotlib.pyplot繪制總體股價(jià)和預(yù)測(cè)價(jià)格之類(lèi)的數(shù)據(jù)。MinMaxScaler從sklearn的(scikit-learn)預(yù)處理程序包中進(jìn)行歸一化處理。Sequential dense LSTM Dropout從Keras導(dǎo)入了數(shù)據(jù),將有助于創(chuàng)建深度學(xué)習(xí)模型。稍后將討論這些模塊。 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.preprocessing import MinMaxScaler#for deep learning modelfrom keras import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers import Dropout 現(xiàn)在,將數(shù)據(jù)集作為數(shù)據(jù)框加載到名為df的變量中。然后,檢查了數(shù)據(jù)集的形狀,結(jié)果為(2035,8)表示數(shù)據(jù)集中有2035行和8列。之后,將數(shù)據(jù)集上下顛倒過(guò)來(lái),以便日期從最早的日期開(kāi)始到最近的日期,這樣做還必須重置索引。然后,打印數(shù)據(jù)集的一些開(kāi)始行head()。
數(shù)據(jù)集的前5個(gè)條目 僅選擇了一個(gè)“ 開(kāi)放”功能來(lái)訓(xùn)練的模型,但是您可以自由選擇多個(gè)功能,但是隨后將相應(yīng)地更改代碼。在訓(xùn)練集中,有2000個(gè)值,而在測(cè)試中,只選擇35個(gè)值。然后簡(jiǎn)單地打印了兩個(gè)類(lèi)別的數(shù)據(jù),分別train_set test_set是(2000,1)和(35,1)。 open_price = df.iloc[:,1:2]train_set = open_price[:2000].valuestest_set = open_price[2000:].valuesprint('Train size: ',train_set.shape)print('Test size:',test_set.shape) 在這里,將Date列轉(zhuǎn)換為DateTime格式以方便地進(jìn)行繪制。然后簡(jiǎn)單地用于plot_date繪制整個(gè)時(shí)間軸上的股票開(kāi)盤(pán)價(jià)的圖,并使用保存該圖savefig。
現(xiàn)在,已經(jīng)初始化了MinMaxScalar用于縮放0到1范圍內(nèi)的每個(gè)值的。這是非常重要的一步,因?yàn)楫?dāng)特征處于相對(duì)相似的縮放比例時(shí),神經(jīng)網(wǎng)絡(luò)和其他算法的收斂速度更快。 sc = MinMaxScaler()train_set_scaled = sc.fit_transform(train_set) 棘手的部分到了?,F(xiàn)在,必須使數(shù)據(jù)適合我們的RNN模型,即使用目標(biāo)最終值制作數(shù)據(jù)序列。讓我用這個(gè)例子來(lái)解釋。假設(shè)數(shù)據(jù)集的值介于1到10之間,并且序列長(zhǎng)度為3。在這種情況下,訓(xùn)練數(shù)據(jù)如下所示: 序列訓(xùn)練數(shù)據(jù)示例在代碼中,序列的長(zhǎng)度為60,這意味著只有前60個(gè)值將決定下一個(gè)值,而不是整個(gè)數(shù)據(jù)集。之后,創(chuàng)建了NumPy x_train和NumPy數(shù)組以y_train進(jìn)行快速計(jì)算,并根據(jù)模型的要求重塑了訓(xùn)練集。的最終形狀為x_train(1940,60,1)。
現(xiàn)在,將創(chuàng)建模型的架構(gòu)。使用Keras是因?yàn)榕c其他可用庫(kù)相比,使用Keras進(jìn)行深度學(xué)習(xí)模型非常容易。在這里,初始化了Sequential對(duì)象,該對(duì)象充當(dāng)模型內(nèi)所有圖層的捆綁程序。模型總共有4個(gè)LSTM層和1個(gè)致密層。 LSTM(長(zhǎng)期短期記憶)是一種遞歸神經(jīng)網(wǎng)絡(luò),具有一些上下文狀態(tài)單元,它們充當(dāng)長(zhǎng)期或短期記憶單元,并且這些單元調(diào)節(jié)輸出。當(dāng)需要根據(jù)歷史背景而不是僅根據(jù)最后的輸入來(lái)預(yù)測(cè)輸出時(shí),這一點(diǎn)很重要。例如,必須預(yù)測(cè)序列3,4,5 ,?中的下一個(gè)數(shù)字。那么輸出就是6(x + 1),但是順序?yàn)?strong>0,2,4 ,?輸出也是6,但是它也取決于上下文信息。 Dropout用于通過(guò)一次簡(jiǎn)單地停用某些單元(神經(jīng)元)來(lái)防止數(shù)據(jù)過(guò)擬合。在案例中,一次會(huì)停用20%的單元。最后,有一個(gè)包含1個(gè)單位的密集層,可提供預(yù)測(cè)值。 然后,只需使用優(yōu)化程序編譯模型,然后將模型擬合到數(shù)據(jù)上,然后運(yùn)行20次迭代即可。 reg = Sequential()reg.add(LSTM(units = 50,return_sequences=True,input_shape=(x_train.shape[1],1)))reg.add(Dropout(0.2))reg.add(LSTM(units = 50,return_sequences=True))reg.add(Dropout(0.2))reg.add(LSTM(units = 50,return_sequences=True))reg.add(Dropout(0.2))reg.add(LSTM(units=50))reg.add(Dropout(0.2))reg.add(Dense(units=1))reg.compile(optimizer = 'adam',loss='mean_squared_error')reg.fit(x_train,y_train, epochs=20, batch_size =1,verbose=2) 每次迭代的損失 如您所見(jiàn),模型收斂于15 個(gè)epoch,總共花了90分鐘才能運(yùn)行20次。是的,RNN模型需要時(shí)間訓(xùn)練。 RNN模型需要時(shí)間現(xiàn)在,是時(shí)候?yàn)闇y(cè)試創(chuàng)建輸入了。的形狀input為(95,1),下面也縮放了此數(shù)據(jù)。
這是最后一部分,其中簡(jiǎn)單地制作數(shù)據(jù)序列以預(yù)測(cè)最近35天的庫(kù)存值。第一個(gè)序列包含從1至60的數(shù)據(jù)來(lái)預(yù)測(cè)第61個(gè)值,第二個(gè)序列包含從2到61的數(shù)據(jù)來(lái)預(yù)測(cè)第62個(gè)值,依此類(lèi)推。的形狀x_test是(35,60,1),這說(shuō)明了這一點(diǎn)。 x_test = []for i in range(60,95): x_test.append(input[i-60:i,0])x_test = np.array(x_test)x_test = np.reshape(x_test,(x_test.shape[0],x_test.shape[1],1))x_test.shape 最終,只是預(yù)測(cè)使用值predict定義的模型的功能,并繪制最后35個(gè)某種給定股票的實(shí)際和預(yù)測(cè)值。
最后具體運(yùn)行結(jié)果就作為作業(yè)留給大家自行完成。但可以很樂(lè)觀的告訴大家,模型在某些特定時(shí)間段上預(yù)測(cè)給定股票的未來(lái)趨勢(shì)方面非常準(zhǔn)確。 但是,距離成為股票市場(chǎng)上的出色顧問(wèn)還會(huì)有比較大的挑戰(zhàn)。 下一步目標(biāo)通過(guò)合并更多功能,增加數(shù)據(jù)集以及調(diào)整模型本身,可以進(jìn)一步改善模型。 |
|