1. 程式人生 > 實用技巧 >利用LSTM進行股價時間序列分析

利用LSTM進行股價時間序列分析

一、模型訓練使用的是IC00不復權下30分鐘的收盤價,測試集用的IC003的30分鐘資料。

二、採集資料,然後進行序列切分

2.1、下面指標在金字塔中直接複製得到資料

o_:open;
h_:high;
l_:low;
c_:close;
v_:VOL;
oi_:openint;

2.2、序列切分參考下面例子,xgboost劃分特徵和標籤的

https://github.com/yukizzc/ML_Code/blob/master/Project/xgboost%E5%81%9A%E6%9C%9F%E8%B4%A7%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97.ipynb

二、LSTM網路結構

class LSTM(nn.Module):
    def __init__(self):
        super().__init__()
        self.lstm = torch.nn.LSTM(
            input_size = 1,
            hidden_size = 64,
            num_layers = 1,
            batch_first = True
        )
        self.out = nn.Linear(in_features = 64,out_features = 1)
    
def forward(self, x): output,(h_n,c_n) = self.lstm(x) out = self.out(output[:,-1,:]) return out

輸入資料維度時間序列用的是30,特徵向量維度1,神經元數量用64,層數1,經過一個迴圈層後直接接一個線性迴歸返回一個數。

output維度是[batch,seq_len,hidden_size],這裡只需要最有一個序列的值所以seq_len用-1表示。

然後用上面劃分序列的函式把歷史資料進行整理然後喂入這個神經網路中,注意:整個歷史資料進行了maxmin的歸一化操作,因為不做歸一化子節去訓練時候發現loss降不下去感覺是數值太大導致梯度消失了。

具體訓練程式碼參考:https://github.com/yukizzc/ML_Code/blob/master/Project/LSTM%E9%A2%84%E6%B5%8B%E8%82%A1%E4%BB%B7/rnn_project.ipynb

四、交易回測

上面訓練完成後的模型儲存下來,然後帶到回測模組,因為找不到什麼平臺能用的所以自己給寫一了一個,整個回測模組如下

https://github.com/yukizzc/Code_Store/tree/master/Quant/py%E5%9B%9E%E6%B5%8B%E5%BC%95%E6%93%8E

其中_lstm.py就是用訓練好的模型進行回測的程式碼。

五、總結

用ic00訓練的引數,去對ic00做回測,5年盈利翻了3倍,效果還是不錯。但是如果採用ic13指數進行回測則效果不理想。