利用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指数进行回测则效果不理想。

 

posted on 2020-10-07 13:58  yukizzc  阅读(661)  评论(0)    收藏  举报