成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

「數(shù)據(jù)游戲」:使用 LSTM 模型預(yù)測三天后單股收盤價(jià)

dreamans / 2809人閱讀

摘要:本次比賽將使用模型來預(yù)測招商銀行三天后的收盤價(jià),也就是利用月日前的數(shù)據(jù),來預(yù)測月日的收盤價(jià)。按照個交易日的模式,將數(shù)據(jù)變成一個,,的張量表。在實(shí)際使用時進(jìn)行模型載入,分別查看預(yù)測結(jié)果。

作者:瘋貓子,「數(shù)據(jù)游戲」優(yōu)勝隊(duì)伍成員

摘要

LSTM模型是RNN的一種,其特點(diǎn)是在單一循環(huán)神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,構(gòu)建出了長短記憶門,也就是可以長時間發(fā)現(xiàn)和記憶長依賴關(guān)系。本次比賽將使用LSTM模型來預(yù)測招商銀行三天后的收盤價(jià),也就是利用5月10日前的數(shù)據(jù),來預(yù)測5月15日的收盤價(jià)。

一、模型選擇

股價(jià)價(jià)格的預(yù)測其實(shí)是一件極其不靠譜的事情。很多專業(yè)機(jī)構(gòu)和量化交易的個人都是極力在規(guī)避價(jià)格預(yù)測這種做法的。

原因有二:一是股市(無論哪個國家,哪種性質(zhì))隨機(jī)突發(fā)事件太多,且突發(fā)事件對股市的影響力也是高度隨機(jī)和不可預(yù)測的,也就是所謂的噪音多到讓你懷疑人生。二是,連續(xù)變量作為預(yù)測目標(biāo)是個糟糕的設(shè)計(jì),因?yàn)檫@會使得預(yù)測空間太大,而導(dǎo)致所搜空間無限大。這個見解來自于強(qiáng)化學(xué)習(xí),強(qiáng)化學(xué)習(xí)的一個技術(shù)要點(diǎn)就是把預(yù)測空間有限化,即便客觀世界是連續(xù)而無限的,也需要采用類似于Tile coding的技術(shù)使其離散化,有限化。本著迎難而上,不成功也可以提高自己的初衷,嘗試開始著手解決這一難題。

選擇LSTM模型作為主算法來采用,是參考了kaggle上一個長期項(xiàng)目,預(yù)測美股收盤價(jià)的一個項(xiàng)目,其中第三名就是采用LSTM的。拿來測試之后,具有一定預(yù)測作用,但是預(yù)測精度不高,且性能不穩(wěn)定。然后小組討論后,是否就采用這個基本模型為核心,開展算法升級,得到一致同意后,于是確定了LSTM算法為核心算法,并做再次開發(fā)。

二、模型升級

LSTM模型之所有能夠具有預(yù)測股價(jià)的能力,主要的還是模型本身捕捉了價(jià)格序列中的時序要素中所透射出來的信息。對于模型進(jìn)行預(yù)測本身是完全沒有問題的,而這次模型升級的根本目標(biāo)是提升預(yù)測精度。

關(guān)于模型升級主要來自于兩方面的,一是通過對模型的優(yōu)化,二是優(yōu)化數(shù)據(jù)。

(一)升級LSTM

LSTM模型大概有6種變形形式,主要的特點(diǎn)就是針對不同數(shù)據(jù)輸入的類型。這里我選用了Multiple Input模型,也就是多序列輸入,單序列輸出。選擇這個模型,對數(shù)據(jù)的構(gòu)建也有非常好的促進(jìn)作用,可以構(gòu)建一個張量(多維數(shù)組),這個張量是一個5維張量,每個維度是一個特征數(shù)據(jù),同時還可以按照N天的方式形成數(shù)據(jù)切片,這種設(shè)計(jì)基于兩個原因:

一是數(shù)據(jù)中包含了大量信息,而越多的特征數(shù)據(jù),提供的信息越多,多因子的雛形。

二是在保持多特征數(shù)據(jù)的基礎(chǔ)上,保留的時間序列的特點(diǎn)。也就是在不增加特征的情況,將特征信息成倍增加。

這種數(shù)據(jù)處理模式極大的優(yōu)于ML的諸多算法。ML的諸多算法還是以單一樣本為切片輸入所有維度的數(shù)據(jù),在時序構(gòu)建方面是有所欠缺的。

(二)升級數(shù)據(jù)集

數(shù)據(jù)是從大智慧中取出的數(shù)據(jù),數(shù)據(jù)時間段是2010年1月1日—2019年5月10日,數(shù)據(jù)包含open(開盤價(jià))、close(收盤價(jià))、volume(成交量)、turnover(成交額度)、return(日收益率)。特征選擇了5個,原因是增加特征必然增加數(shù)據(jù)的獲取難度,多因子模型的構(gòu)建是基于豐富的數(shù)據(jù)供應(yīng)基礎(chǔ)上,在目前的這個比賽中,是不具備這個條件,所以只用4個基本特征數(shù)據(jù)加一個收益率的衍生變量。

按照N個交易日的模式,將數(shù)據(jù)變成一個(M,N,5)的張量表。

三、代碼解析
# 引入各種工具包
import pandas as pd
import numpy as np
np.set_printoptions(threshold=np.inf) #設(shè)置np數(shù)據(jù)在打印時能夠完整輸出,方便觀察
from keras.models import Sequential
from keras.layers import LSTM,Dense
import keras
import matplotlib.pyplot as plt

# 全局參數(shù),所有要調(diào)整的參數(shù)都在這里
dim=300 #輸出維度數(shù),也是LSTM的網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)
epochs=400 #訓(xùn)練代數(shù)(可以理解為訓(xùn)練次數(shù))
days=20 #讀取多少天的數(shù)據(jù)作為一次預(yù)測。例如讀取20天的歷史數(shù)據(jù)來預(yù)測未來1天的情況
batch_size = 535 #訓(xùn)練批次大小,就是一次性讀取多少個樣本進(jìn)行一次運(yùn)算,越大運(yùn)算速度越快,但是占用內(nèi)存和顯存越大,根據(jù)自己的機(jī)器性能設(shè)置。同時該參數(shù)還決定梯度下降算法的下降步長數(shù)。

開始構(gòu)建網(wǎng)絡(luò),
n_steps = days #輸入張量的維度數(shù) 
n_features = 5 #輸入張量的維度
model_2 = Sequential()
# 激活函數(shù)用relu
model_2.add(LSTM(dim, activation="relu",input_shape=(n_steps, n_features)))
# 輸出層使用全連接層,只要一個輸出節(jié)點(diǎn)
model_2.add(Dense(1))
#選擇優(yōu)化器和損失函數(shù),優(yōu)化器為線性規(guī)劃算法,損失函數(shù)用的是高維空間測定距離的函數(shù)
model_2.compile(optimizer="rmsprop", loss="mse")

接下來開始構(gòu)建數(shù)據(jù),主要分為三個步驟完成
第一步導(dǎo)入數(shù)據(jù)
第二步生成數(shù)據(jù)切片,以及監(jiān)督學(xué)習(xí)的標(biāo)簽,也就是三天后的收盤價(jià)。拆分訓(xùn)練序列訓(xùn)練集、測試集、標(biāo)簽
第三步載入模型進(jìn)行訓(xùn)練

數(shù)據(jù)導(dǎo)入的基本操作,順便觀察下數(shù)據(jù)集的情況。

data = pd.read_csv("600036.csv")
data.head()
 
data.info()

RangeIndex: 2250 entries, 0 to 2249
Data columns (total 5 columns):
open        2250 non-null float64
close       2250 non-null float64
volume      2250 non-null int64
turnover    2250 non-null int64
return      2250 non-null float64
dtypes: float64(3), int64(2)
memory usage: 88.0 KB

構(gòu)建兩個處理數(shù)據(jù)生成張量表的函數(shù),一個用帶標(biāo)簽輸出,另外一個只處理輸入數(shù)據(jù)集,生成20x5的切片數(shù)據(jù)。

def processData(data,lb):
    X,Y = [],[]
    for i in range(len(data)-lb-1):
        X.append(data[i:(i+lb),0])
        try:
            Y.append(data[(i+2+lb),0])
        except:
            Y.append(data[(i+lb),0])
    return np.array(X),np.array(Y)

def pData(data,lb):
    X,Y = [],[]
    for i in range(len(data)-lb-1):
        X.append(data[i:(i+lb)])
return np.array(X)

開始處理數(shù)據(jù),同時對數(shù)據(jù)進(jìn)行特征縮放處理,因?yàn)楹竺嫘枰獙μ卣骺s放的數(shù)據(jù)進(jìn)行逆運(yùn)算,所以,要定義兩個不同的特征縮放函數(shù),否則后面針對輸出標(biāo)簽?zāi)孢\(yùn)算會無法進(jìn)行。
對數(shù)據(jù)進(jìn)行特征縮放處理,將數(shù)據(jù)縮放到0-1區(qū)間內(nèi),這樣可以加快訓(xùn)練結(jié)果的快速收斂。

from sklearn.preprocessing import MinMaxScaler
close = data["close"]
cl = np.array(close)
cl = cl.reshape(cl.shape[0],1)
scl = MinMaxScaler()
sc2 = MinMaxScaler()
cl = scl.fit_transform(cl)


# 生成標(biāo)簽
_,y = processData(cl,days)
X = data.values
X = sc2.fit_transform(X)
X = pData(X,days)

對數(shù)據(jù)集進(jìn)行訓(xùn)練集和測試集的拆分,我在這里偷了個懶,只生成了兩組數(shù)據(jù)集。

y_train,y_test = y[:int(y.shape[0]*0.80)],y[int(y.shape[0]*0.80):]
X_train,X_test = X[:int(X.shape[0]*0.80)],X[int(X.shape[0]*0.80):]

拆分出來的數(shù)據(jù)是這個樣子的

y_train的數(shù)據(jù)結(jié)構(gòu)為: (1783,)

y_test的數(shù)據(jù)結(jié)構(gòu)為: (446,)

X_train的數(shù)據(jù)結(jié)構(gòu)為: (1783, 20, 5) # 1783個20x5的數(shù)據(jù)切片

X_test的數(shù)據(jù)結(jié)構(gòu)為: (446, 20, 5) # 446個20x5的數(shù)據(jù)切片

張量表的結(jié)構(gòu)為:(一個切片)

#執(zhí)行模型訓(xùn)練
History = model_2.fit(
X_train,y_train,batch_size=batch_size, epochs=epochs,validation_data=(X_test,y_test),shuffle=False)


# 顯示訓(xùn)練過程
plt.plot(history.history["loss"])
plt.plot(history.history["val_loss"])

模型訓(xùn)練過程中的loss值,一個真實(shí)值的loss,一個是預(yù)測值的loss,可以明顯的看到,兩個loss已經(jīng)快速收斂,但是預(yù)測值的loss并不穩(wěn)定。在這種情況下,如果模型使用精確度來進(jìn)行評估,明顯已經(jīng)不符合實(shí)際要求。故需要重新找到模型性能評估的方法。

模型訓(xùn)練完畢之后,需要對訓(xùn)練模型進(jìn)行效果評估,大概的評估思路分為三步:

第一步單值預(yù)測檢驗(yàn)
第二步序列預(yù)測檢驗(yàn)
第三步用統(tǒng)計(jì)檢驗(yàn)方法中的T檢驗(yàn)對預(yù)測性能進(jìn)行評估

#隨機(jī)從測試集中抽取一個單一數(shù)據(jù)切片進(jìn)行預(yù)測
act = []
pred = []
import random
i=random.randint(0,250)
Xt = model_2.predict(X_test[i].reshape(1,days,5))
print("預(yù)測值:{0}, 實(shí)際值:{1}".format(Xt,y_test[i].reshape(-1,1)))
pred.append(Xt)
act.append(y_test[i])

預(yù)測值:[[0.7393236]], 實(shí)際值:[[0.74340618]]

# 將測試集中的所有切片以序列的方式進(jìn)行預(yù)測,查看預(yù)測結(jié)果與真實(shí)值的擬合情況。
Xt = model_2.predict(X_test)
fig = plt.gcf()
plt.plot(y_test.reshape(-1,1),label="y_test")
plt.plot(Xt,label="Forecast")
plt.legend()

 
# T檢驗(yàn)中的差值統(tǒng)計(jì),查看差值序列在統(tǒng)計(jì)挺行上的綜合表現(xiàn)
a = y_test.reshape(-1,1)
b = Xt
c = a - b #實(shí)際值減去預(yù)測值
c = pd.DataFrame(c)
c.describe()

統(tǒng)計(jì)指標(biāo)說明:

mean:代表測試集驗(yàn)證后的結(jié)果與真實(shí)情況的差值序列的平均值,也就是整體差異水平。正負(fù)無所謂,越趨近0越好。通過上述的結(jié)果來看,這次訓(xùn)練的模型預(yù)測結(jié)果于真實(shí)情況的整體誤差已經(jīng)小于1%,

std:標(biāo)準(zhǔn)差,代表均值在正負(fù)兩個方向的分散程度,越小越好,說明結(jié)果比較集中,誤差比較小,通過以上結(jié)果來看分散度僅有4.33%,在95%的置信度下。

模型保存

因?yàn)樵谟?xùn)練模型時,確保能夠產(chǎn)生最大的隨機(jī)數(shù),并未設(shè)置隨機(jī)數(shù)種子。如果遇到性能較好的結(jié)果就運(yùn)行下面的代碼,以便將模型保存在本地。方便評估模型訓(xùn)練的最優(yōu)參數(shù)。

path="my_model_2" # 請自行設(shè)置存儲路徑及文件名,例如:D:股票my_model
model_2.save(path+".h5",include_optimizer=True) # 保存模型本體
model_2.save_weights(path + "_weights.h5") # 保存模型權(quán)重
模型載入執(zhí)行預(yù)測

說明:
由于神經(jīng)網(wǎng)絡(luò)依靠隨機(jī)數(shù),未設(shè)置隨機(jī)數(shù)種子,所以每次訓(xùn)練結(jié)果均不相同。所以將性能較好的模型進(jìn)行存儲。
在實(shí)際使用時進(jìn)行模型載入,分別查看預(yù)測結(jié)果。取最佳模型。
載入數(shù)據(jù)預(yù)測5月15日的close數(shù)值

filepath = "my_model_1"
my_model = keras.models.load_model(filepath+".h5")
p_1 = my_model.predict(X_test)
p_1 = scl.inverse_transform(p_1)
print("5月15日的close為:",p_1[-1])

5月15日的close為: [33.819942]

總結(jié)

該模型最優(yōu)參數(shù)組合,是通過幾十次的反復(fù)訓(xùn)練所的得到的。在這個過程中還做了大量的調(diào)整和比對試驗(yàn),就不做贅述,只將總結(jié)到的要點(diǎn)進(jìn)行歸納闡述:

因?yàn)闃?gòu)建的張量維度數(shù)并不是十分大,所以在網(wǎng)絡(luò)的設(shè)計(jì)上,一個LSTM層加一個全連接層就已經(jīng)足夠了。如果我們的維度數(shù)可以增加到上百個,這個情況就可以繼續(xù)增加隱藏層的數(shù)量,同時使用dropout層,丟棄部分冗余。

對于LSTM模型,在做預(yù)測的時候,不能只給一個切片(單值)數(shù)據(jù),這個預(yù)測的結(jié)果很大概率會產(chǎn)生偏差。正確的做法,應(yīng)該是給一個切片序列,而你要預(yù)測的內(nèi)容必須放置到最后一個。因?yàn)閷?shí)驗(yàn)發(fā)現(xiàn),LSTM模型的運(yùn)行原理中,會根據(jù)上下連接的數(shù)據(jù)切片修正自己的長短記憶內(nèi)容,也就是具備一定的推理能力,在使用這個模型時,需要給與足夠的數(shù)據(jù),讓模型能夠進(jìn)行推理。

Y值(標(biāo)簽)的構(gòu)建同樣需要和X值(輸入)的設(shè)計(jì)進(jìn)行關(guān)聯(lián),因?yàn)檫@關(guān)系到你的訓(xùn)練數(shù)據(jù)是離散化,還是序列化,也關(guān)系到你的訓(xùn)練方式是可以離散化,還是序列化(時序化)。非常重要。這也是針對預(yù)測目標(biāo)反推需要選擇哪些數(shù)據(jù)組成數(shù)組的宗旨。

Ad Time

了解更多「數(shù)據(jù)游戲」可以關(guān)注微信公眾號數(shù)據(jù)科學(xué)與技術(shù)(read_csv) 或加入 QQ 群 759677734

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43823.html

相關(guān)文章

  • 數(shù)據(jù)游戲」:使用 LSTM 模型預(yù)測天后單股盤價(jià)

    摘要:本次比賽將使用模型來預(yù)測招商銀行三天后的收盤價(jià),也就是利用月日前的數(shù)據(jù),來預(yù)測月日的收盤價(jià)。按照個交易日的模式,將數(shù)據(jù)變成一個,,的張量表。在實(shí)際使用時進(jìn)行模型載入,分別查看預(yù)測結(jié)果。 作者:瘋貓子,「數(shù)據(jù)游戲」優(yōu)勝隊(duì)伍成員 摘要 LSTM模型是RNN的一種,其特點(diǎn)是在單一循環(huán)神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,構(gòu)建出了長短記憶門,也就是可以長時間發(fā)現(xiàn)和記憶長依賴關(guān)系。本次比賽將使用LSTM模型來預(yù)測招...

    JeOam 評論0 收藏0
  • 數(shù)據(jù)游戲」:使用嶺回歸預(yù)測招商銀行的股價(jià)

    摘要:作者,數(shù)據(jù)游戲優(yōu)勝隊(duì)伍成員前陣子報(bào)名參加了數(shù)據(jù)游戲比賽,題目是預(yù)測月號星期三招商銀行的股價(jià),截止時間是在月號星期天。 作者:Max,「數(shù)據(jù)游戲」優(yōu)勝隊(duì)伍成員 前陣子報(bào)名參加了「數(shù)據(jù)游戲」比賽,題目是預(yù)測5月15號(星期三)招商銀行的股價(jià),截止時間是在5月12號(星期天)。在本次預(yù)測中,我用到的是嶺回歸。 嶺回歸 嶺回歸是回歸的一種,它解決回歸中重大疑難問題:排除多重共線性,進(jìn)行變量的選...

    沈建明 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<