如何预测股价图解

在获得硕士学位之前,我对基于LSTM递归神经网络的股票价格预测方法进行了小型研究。利用最近的工作并不忙,我写下了部分内容以备记录。

股票价格预测模型仅基于历史股票数据,而不考虑新闻对单个股票的影响。日本学者使用深度学习方法来分析当天的新闻内容,以确定其对股票价格的正面/负面影响,并将其与历史股票数据相结合,每种数据都对近期新闻具有一定的权重。预测股价[1]。该预测方法取得了一定的成果。

我在这里没有介绍新闻方面的影响,主要是出于以下考虑:

1.新闻的及时性难以保证:在许多情况下,在出现正面/负面新闻之前,股票价格已大幅上涨/下跌。信息不对称导致公众缺乏第一手信息来源。

2.新闻的准确性很难保证:信息在Internet上的传播非常快,并且媒体之间经常存在相互窃的情况,而这种复制新闻(非原创新闻)通常不是严格审查后,存在虚假内容和夸大宣传的可能性。一旦分析模型误导了某些谣言或新闻,但其真实性很低,则很可能会得到错误的预测结果。

3.语言含糊不清:一条新闻通常对其正面/负面性质有多种解释。例如,“习主席宣布中国将解除30万人的武装”-新华日报2015.09.04。从一般意义上讲,这一消息可以解释为:中央政府进行了先进的改革,精简了军队,简化了行政管理,大力发展了国防和军事工业。这是一个积极的解释。使用传统的奇异值分解算法(SVD)等机器学习模型时,很可能会确定它与“五家主要银行去年裁员近30,000名员工”的消息具有高度相似性,因此它们被分为坏消息。

4.技术实施更为复杂:这实际上是一个非常重要的原因?,获取正确的信息并执行NLP操作通常需要以下过程:手动浏览Web以确定稳定可靠的信息源→设计抓取工具的实现获取有效信息→设计新闻剪辑(填充)方案以应对不同长度的新闻→手动标记新闻的正/反性质(也可以标记当天价格的涨跌)→设计网络模型→训练和验证模型。这些步骤中的每一个步骤都非常麻烦且耗时,对于个别股票而言,新闻并非每天都会出现。

上面已经说了很多,而我还没有开始介绍我的预测模型,让我们进入下面的主题。在决定排除对新闻的考虑之后,我开始考虑股价上涨和下跌的性质。我相信股票价格是资本博弈结果的体现。这次建立的预测模型的简单思想是使用深度学习模型来深入了解经销商的操作规则并预测提起和粉碎的情况。为了实现以下目标,我决定选择以下七个功能来构建网络模型,即:

涨跌最高涨幅最低跌幅大订单净流入中等订单净流入小订单净流入周转率

使用这七个特征为库存的上升和下降以及资金流建立适当的模型。此外,还通过计算一些基本数据获得了MACD股价预测,移动平均线等其他指标,而在构建模型时并未考虑这些指标。

一.源数据及其预处理

通过股票交易软件,我获得的源数据具有大约20个特征,包括:涨幅,当前价格,变化,买入,卖出,成交量等。为了获得上述七个特征,请选择五个特征价格涨跌幅,大订单净流入,中订单净流入,小订单净流入和周转率,计算出最大涨幅和最大跌幅的两个特征。通过以下公式计算。

 

已处理的库存特征数据存储在库存name.csv文件中,类似于下图:

 

图中特征的顺序为:日期,大订单净流入,中订单净流入,小订单净流入,增减,最高增幅,最高跌幅,周转率,股价。此处的股票价格是用来计算将训练样本的输出进行拼接后,在多天内的总涨跌幅。

注意:在处理源数据时,经常会遇到空值的问题:也就是说,当某些特征值为0时,系统给出的源数据是“-”或“”。需要特殊处理。 (经常会遇到新股票的第一天为空,或者一个交易日的大订单净流入为空的情况。)

 

1     if fin_temp.ix[day,12]=='-' or  fin_temp.ix[day,12]=='':  # 新股的涨跌幅一栏会出现'','-',需要特殊处理
2         raise_value = 0.0
3     else:
4         raise_value = float(fin_temp.ix[day,12])

 

二.训练样本拼接

首先,设置一个滑动窗口。在此实验中,将滑动窗口设置为50个交易日。每个培训样本由50个连续交易日组成。每个交易日的数据包含上述七个特征,即50 * 7矩阵。样本的输出是三个交易日后收盘价的比较。今天(即样本输入中的最后一个交易日),将今天(即最后一个交易日)的收盘价的上限设置为0.3,将下限设置为-0.3 (在样本输入中)(当然,连续三个交易日涨幅的涨幅将超过0.3,在这里被视为0.3)。选择了三个交易日后涨跌幅的原因)因为训练样本的输出是因为中国的股票市场基于T + 1操作规则,并且您不能在同一天卖出,所以预测稍晚些时候会留下操作空间;这还需要一天的时间up / smashing意外太多,不容易预测,预示着长期的情况具有更高的稳定性。

归一化相关工作:由于神经网络激活功能的局限性,有必要在训练之前将数据映射到0?1间隔。在此实验中,从过去两年的数据中获得了各种特性的最大值和最小值。设置标准化和功能以在拼接样本时标准化数据。

样本输入的标准化:

 

 1 def normalize_oneday(stockN,fdata,day):
 2     max_min = list(max_min_list[stockN])
 3     in_1 = (fdata.ix[day,1]-max_min[1])/(max_min[0]-max_min[1])
 4     in_2 = (fdata.ix[day,2]-max_min[3])/(max_min[2]-max_min[3])
 5     in_3 = (fdata.ix[day,3]-max_min[5])/(max_min[4]-max_min[5])
 6     in_4 = (fdata.ix[day,4]-max_min[7])/(max_min[6]-max_min[7])
 7     in_5 = (fdata.ix[day,5]-max_min[9])/(max_min[8]-max_min[9])
 8     in_6 = (fdata.ix[day,6]-max_min[11])/(max_min[10]-max_min[11])
 9     in_7 = (fdata.ix[day,7]-max_min[13])/(max_min[12]-max_min[13])
10     return [in_1,in_2,in_3,in_4,in_5,in_6,in_7]

 

样本输出的归一化和去归一化:

 

def normalize_raise(volume):
    norm_value = (volume+0.3)/0.6
    if norm_value>1:
        norm_value = 1   #涨跌幅超过30%的都定义为 1或0
    elif norm_value<0:
        norm_value = 0
    return norm_value
def denormalize_raise(value):
    volume = value*0.6-0.3
    return volume

 

设置滑动窗口sample_window = [],每次遍历一行特征数据,并在归一化后将其插入窗口的末尾。当窗口大小达到50时,请在3天后计算波动,缝制一个训练样本,然后将其放入sample_window中。弹出第一个交易日的值。

 

1 normalized_daily_sample = normalize_oneday(stockN_list_str[i],fin_temp,day)
2 # TODO 给样本插入该日数据
3 sample_window.append(normalized_daily_sample)   #存入一个样本list,特征数为7,全部归一化完毕
4 if len(sample_window)==window_len:  # 窗口大小满50
5     #TODO 需要对涨幅进行归一化 暂定 30% TODO
6     raise_3days = normalize_raise(float(fin_temp.ix[day+3,8])/float(fin_temp.ix[day,8])-1.0)
7     samples.append([sample_window,raise_3days])
8     sample_window = sample_window[1:]

 

遍历所有数据行后,可获得数百个训练样本。并将训练样本导出为numpy.array格式,以方便训练。

注意:跳点问题分为除权(增加或减少超过10%)和暂停(相邻交易日之间的间隔超过10天)的问题。对于跳点问题股价预测,我们判断是否发生。一旦发生跳点,将清除sample_window,并从下一个交易日开始再次计算样本输入,以防止样本输入中出现任何跳点数据。

 

1 # 间隔日期大于10天,即day+3大于12天,判断为有停盘,不连续,或者涨跌幅异常(超过10.5%),不能作为训练样本序列, 
2 if int(diff/(24*3600))>12 or abs(raise_value)>10.5:  
3     sample_window = []

 

三.建立模型

这里使用keras深度学习框架来快速构建模型。建立一个顺序模型,在其上添加一个LSTM层,将Dropout设置为0.2,添加一个Dense层以将其尺寸聚合为1,激活函数使用relu,损失函数设置为交叉熵函数。传统的乙状结肠之前曾被用作激活功能,但实验后效果不如露露。

 

1 model = Sequential()
2 model.add(LSTM(128, input_shape=(window_len,7), return_sequences=False))  # TODO: input_shape=(timesteps ,data_dim)
3 model.add(Dropout(0.2))
4 model.add(Dense(1))
5 model.add(Activation('relu'))
6 model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

 

建立模型后,使用之前获得的数百个训练样本开始训练买股票怎么开户,并保存模型。

 

1 hist = model.fit(trainX,trainY,batch_size=1,epochs=50)
2 score = model.evaluate(trainX, trainY, batch_size=10)
3 if os.path.exists('./model/'+file_name[:-5]):
4     model.save('./model/'+file_name[:-5]+'/model_%s_%s.h5'%(window_len,date))  # HDF5 保存模型
5 else:
6     os.mkdir('./model/'+file_name[:-5])
7     model.save('./model/'+file_name[:-5]+'/model_%s_%s.h5'%(window_len,date)) 

 

四.效果显示

一开始,我将所有股票的训练样本堆叠在一起,并训练了一个大型模型(看起来当时有90,000多个训练样本,并且我整日训练=,=)。做出预测,并尝试在第二天找到收益最高的前五只股票。后来,我发现这是不可能的……每只股票都有不同的操作规则,并且一个模型无法有效地掌握单个股票的涨跌趋势。

此后,我单独选择了中国软件库存(此票证看起来像是由经销商领导的),并分别进行了分析。使用一年半的交易数据作为训练集,总共有293个训练样本和140个时期进行训练。最后,训练模型以验证测试集中的60个测试样本。预测误差如下图所示。

 

前40个是训练集中的样本。我们使用输入部分进行预测,并发现预测结果非常接近;最后60个是我们测试集中的样本。我对预测效果非常满意。除了没有很好预测的第67点到第75点之外,基本上预测了下降和上升的幅度。然后,我使用该模型进行了模拟交易,设置了人民币20,000元的初始资金,在预计三天内上升时买入,在预计三天内下降时卖出。收盘价为交易价格,在购买2. 5笔佣金时将扣除十分之一。收益率曲线如下股价预测,蓝线表示根据模型的交易收入,绿线表示持有股票的收入。

 

可以看出,该模型的预测效果仍然很好。特别是,第一个超过20点可以更准确地避免出现回调。

但是我也知道,用于验证模型的样本数量仍然太少。又过了一个月,又收集了20个交易日的数据后,我再次测试了样本。

预测错误:

 

从上图可以看出,该模型无法预测最近20个交易日中的这一波涨势。

屈服曲线:

 

从上图可以看出,在紫色框圈出的位置,该模型反复预测了一波涨势,但随后立即预测股价将下跌,该股票被抛售并错过了这些两次。大幅增长的机会;在黄色框圈出的位置,该模型在顶点处进行了两次准确的预测,准确地出售了商品,并躲过了两滴大雨。

在验证了库存数据之后,使用LSTM-RNN预测库存是可行的,但是效果不好(如果效果很好,我认为我不会在Internet上共享它。我会用低沉的声音发大财。哈哈~~~)

[1] R。秋田,A。吉原,T。松原和K.上原股价预测,“使用数字和文本信息进行股票预测的深度学习”,2016年IEEE / ACIS第十五届计算机和信息科学国际会议股价预测,冈山,2016年,第1页。 -6.()

以上是关于如何预测股价图解的内容介绍,更多相关内容请股票开户流程网

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.gupiaokaihu.org/gupiao/2529.html