量化研究分享:使用LSTM模型预测股价

hello,我是毛豆。

上次毛豆以涨停双响炮为例,介绍了如何通过python对股票进行分钟级别的监控:

量化研究分享:如何用python抓涨停双响炮

后面收到小伙伴的私信,说最近人工智能很火,问毛豆有没有可能用人工智能来炒股呢?

其实,用AI模型炒股这件事情早已广泛存在,大量的量化机构都在研究和使用,这里面主要涉及到机器学习、深度学习技术,想要深入研究并不是一件容易的事情。为了满足大家的好奇心,今天毛豆就以时序分析中常用的LSTM模型为例,来和大家分享一下机器学习技术是如何应用于股价预测的。

一、LSTM模型

首先说一下为什么要使用LSTM模型来预测股价。一方面,股价预测是高度非线性的,这就要求模型能够处理非线性问题;另一方面,股价具有时间序列的特性,适合使用循环神经网络。因此相比于众多ML和DL模型,LSTM在这个问题上有着天然的优势。

然后介绍一下今天的主角,LSTM模型。LSTM的全称是Long Short Term Memory,是循环神经网络(RNN)的一种,顾名思义,它具有记忆长短期信息的能力。长期困扰传统神经网络结构的一个基本问题是解释“信息”和“上下文”相互依赖的输入序列,在这个问题上RNN能起到一定的作用,但是当输入序列过长时RNN的权重矩阵要循环相乘,所以会产生梯度消失和梯度爆炸的问题,因此RNN不能解决长期依赖问题,这时候LSTM就可以派上用场了。

LSTM模型的1个神经元包含了1个细胞状态(cell)和3个门(gate)机制,三个门分别是输入门、遗忘门和输出门。其中输入门决定将哪些新信息添加到细胞状态,遗忘门负责单元状态的权重和激活函数,输出门决定输出什么,它决定了后面隐藏状态的值。LSTM的核心是细胞状态,它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNN。下面是 LSTM 神经元的典型内部工作图:

其中C(t-1)为上一时刻的细胞状态值,C(t)为这一时刻的细胞状态值;h(t-1)为上一时刻的输出,h(t)为这一时刻的输出。参数更新方法主要是反向传播和链式求导,具体公式在这里不做阐述。由于存储单元中编码的值不会重复更新,因此在使用反向传播训练时梯度不会消失,从而使LSTM能够克服梯度消失问题。

总的来说,信息按照一套规则进入LSTM网络,只有经过LSTM验证的信息才会被保留,否则它将被遗忘门删除。这种单元状态是保持网络和输入的长期记忆和上下文的原因。

LSTM模型就介绍到这里,接下来介绍如何通过LSTM模型实现股价预测。

二、通过LSTM模型实现股价预测

0. 环境准备

导入数据分析常用的包:

#基础数据分析包
import os
import pandas as pd 
import numpy as np
import pickle
import jqdatasdk
from jqdatasdk import *
import mpl_finance as mpf
from matplotlib.dates import date2num
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
 

导入深度学习keras框架。多年前毛豆做深度学习模型的时候,keras还是独立的包,其后端(底层框架)是可以选择tensorflow或Theano的,但现在keras已经集成到tensorflow中了,因此直接用tf.keras就好了:


                
  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
首先,我们需要导入必要的库,如Keras、numpy和pandas。 ``` import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import LSTM, Dense ``` 然后,我们加载股价数据: ``` df = pd.read_csv("stock_data.csv") ``` 接下来,我们将数据处理为用于训练LSTM模型的格式: ``` data = df.close.values data = data.reshape(-1, 1) # normalize the data mean = np.mean(data) std = np.std(data) data = (data - mean) / std ``` 接下来,我们需要准备训练数据和目标: ``` # split into training and test sets train_size = int(len(data) * 0.67) test_size = len(data) - train_size train, test = data[0:train_size, :], data[train_size:len(data), :] # convert an array of values into a dataset matrix def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset) - look_back): a = dataset[i:(i + look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) # reshape into X=t and Y=t+1 look_back = 1 trainX, trainY = create_dataset(train, look_back) testX, testY = create_dataset(test, look_back) ``` 然后,我们可以构建LSTM模型: ``` # create and fit the LSTM network model = Sequential() model.add(LSTM(4, input_shape=(None, 1))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2) ``` 最后,我们可以使用测试数据评估模型的性能: ``` # make predictions trainPredict = model.predict(trainX) testPredict = model.p

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值