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