導語 本文介紹了LSTM的相關內容和在股票價格預測上的應用。 LSTM的股票價格預測 LSTM(Long Short Term Memory)是一種 特殊的RNN類型,同其他的RNNs相比可以更加方便地學習長期依賴關係,因此有很多人試圖將其應用於 時間序列的預測問題 上。 匯豐銀行全球資產管理開發副 ...
導語
本文介紹了LSTM的相關內容和在股票價格預測上的應用。
LSTM的股票價格預測
LSTM(Long Short Term Memory)是一種 特殊的RNN類型,同其他的RNNs相比可以更加方便地學習長期依賴關係,因此有很多人試圖將其應用於 時間序列的預測問題 上。
匯豐銀行全球資產管理開發副總裁Jakob Aungiers在他的個人網站上比較詳細地介紹了LSTM在Time Series Prediction上的運用(https://www.jakob-aungiers.com/articles/a/LSTM-Neural-Network-for-Time-Series-Prediction) ,本文以這篇文章的代碼為基礎,以Bigquant為平臺,介紹一下”LSTM-for-Time-Series-Prediction“的流程。
Keras是實現LSTM最方便的python庫(Bigquant量化平臺已經裝好了,不用自己安裝了)
from keras.layers.core import Dense, Activation, Dropout from keras.layers.recurrent import LSTM from keras.models import Sequential from keras import optimizers
載入轉換數據
例如希望根據前seq_len天的收盤價預測第二天的收盤價,那麼可以將data轉換為(len(data)-seq_len)(seq_len+1)的數組,由於LSTM神經網路接受的input為3維數組,
因此最後可將input+output轉化為(len(data)-seq_len)(seq_len+1)*1的數組
def load_data(instrument,start_date,end_date,field,seq_len,prediction_len,train_proportion,normalise=True): data=D.history_data(instrument,start_date,end_date,fields) …… seq_len=seq_len+1 result=[] for index in range(len(data)-seq_len): result.append(data[index:index+seq_len]) …… # 規範化之後 x_train = train[:, :-1] y_train = train[:, -1] x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) # 測試數據同樣處理
構建LSTM神經網路
model = Sequential() model.add(LSTM(input_dim=layers[0],output_dim=layers[1],return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM(layers[1],return_sequences=False)) model.add(Dropout(0.2)) model.add(Dense(input_dim=layers[1],output_dim=layers[2])) model.add(Activation("linear")) rms=optimizers.RMSprop(lr=conf.lr, rho=0.9, epsilon=1e-06) model.compile(loss="mse", optimizer=rms)
此神經網路共三層,第一層為LSTM層,輸入數據維度是1,輸出數據維度為seq_len;第二層也為LSTM層,輸入和輸出維度均為seq_len層;第三層為Dense層,輸入數據維度是seq_len,輸出數據維度為1,最終將input與output對應起來。
compile:編譯用來配置模型的學習過程,可選參數有loss,optimizer等。模型在使用前必須編譯,否則在調用fit或evaluate時會拋出異常。
loss為損失函數,可用mse,mae,binary_crossentropy
optimizers為優化器,即優化參數的演算法,可供選擇為SGD(隨機梯度下降法),RMSprop(處理遞歸神經網路時的一個良好選擇),Adagrad等(具體參見http://keras-cn.readthedocs.io/en/latest/ ,網頁提供Keras相關函數的詳細介紹)。
model.fit(X_train,y_train,batch_size=conf.batch,nb_epoch=conf.epochs,validation_split=conf.validation_split
fit為訓練函數,batch_size:整數,訓練時一個batch的樣本會被計算一次梯度下降,使目標函數優化一步;nb_epoch:迭代次數;validation_split:0~1之間的浮點數,用來指定訓練集的一定比例數據作為驗證集
predicted = model.predict(data) predicted = np.reshape(predicted, (predicted.size,))
模型在test_data集上的預測,根據前seq_len長度預測下一時間的close。
另外,在此基礎上,若希望預測prediction_len長度的close,則可在第一個predict_close的基礎上,以此predict_close和前seq_len-1個true_close為input,預測下一個close,以此類推,可預測一定長度甚至全部長度的時間序列(predict_sequences_multiple,predict_sequence_full)
回測
(以predict_sequences_multiple為例)
思路是這樣:看prediction_len長度內的漲跌,若prediction_len最後一天收盤價大於第一天的收盤價,則下買單;反之,不做單或者平倉
效果不是特別好,可能和我沒有優化參數有很大關係,希望能拋磚引玉,完整策略代碼如下,歡迎指正和討論:
補充:如果運行出錯,請檢查M.trade模塊是否是最新版本。
附件:基於LSTM的股票價格預測模型實例(文末策略源碼)
參考資料:
- LSTM策略主體參考http://www.jakob-aungiers.com/articles/a/LSTM-Neural-Network-for-Time-Series-Prediction,
- 在一些地方做了一些更改,使之能在bigquant平臺上使用以及能夠自己調整更多參數
- 對keras有興趣者可參考http://keras-cn.readthedocs.io/en/latest/,這裡有對keras每個函數的詳細介紹
原碼鏈接含源碼:《基於LSTM的股票價格預測模型》
From:BigQuant量化知識庫