9159金沙游艺场

图片 1
[PE结构分析] 5.IMAGE_OPTIONAL_HEADER

str字符串 center( ) 方法

使用LSTM-RNN建立股票预测模型

  硕士毕业之前曾经对基于LSTM循环神经网络的股价预测方法进行过小小的研究,趁着最近工作不忙,把其中的一部分内容写下来做以记录。

引自:

农田有效灌溉面积指有固定水源、灌溉工程设施配套、土地平整、在一般年景下能够进行正常灌溉的耕地面积,包括机灌面积、电灌面积、自流灌溉面积和喷灌面积[1]。它是反映农田水利建设和水利化的重要指标,也是我国各地区制定水利发展规划的重要指标之一。对农田有效灌溉面积进行预测可以为了解未来农村水利基础设施的建设状况提供有价值的参考信息,同时也可为相关部门合理制定行业发展规划提供理论支持。

 

 

1 预测方案的确定与预测方法的选择

  此次股票价格预测模型仅根据股票的历史数据来建立,不考虑消息面对个股的影响。曾有日本学者使用深度学习的方法来对当天的新闻内容进行分析,以判断其对股价正面性/负面性影响,并将其与股票的历史数据相结合,各自赋予一定的权重来对近日的股价进行预测[1]。该预测方法取得了一定的效果。

中文文档: 
官方文档: 
文档主要是以keras2.0。

1.1 预测方案的确定

  而这里我没有引入消息面的影响,主要出于以下几点考虑:


农田有效灌溉面积的变化受多方面因素的影响,比如政策、中央财政资金投入、地方财政资金投入、农民收入状况等。这些因素并不是孤立地对农田有效灌溉面积产生影响,而是耦合在一起以非线性的方式影响农田有效灌溉面积的变化。

  1.消息的及时性难以保证:很多时候,在一只股票的利好/利空消息出来之前,其股价已经有了较大幅度的增长/下跌。信息的不对称性导致普通群众缺乏第一手消息源。

.

农田有效灌溉面积的预测有两大类方案:一种为结构式的预测方法,就是通过一定的方式建立起各主要影响因素与农田有效灌溉面积之间的关系,然后根据未来各影响因素的变化去预测相对应的农田有效灌溉面积;另一种为数据序列预测法,就是将各年度的农田有效灌溉面积数值作为连续的时间序列看待,可以认为农田有效灌溉面积的变化规律已经蕴含在数据序列之中,再采用合适的方法对该序列在未来的取值进行预测。

  2.消息的准确性难以保证:互联网上信息传播速度极快,媒体之间经常会出现相互抄袭新闻的情况,而这种抄来的新闻(非原创新闻)往往没有经过严格的审核,存在着内容虚假,夸大宣传的可能性。一旦分析模型错用了某条谣言或真实性不高的新闻,很有可能得出错误的预测结果。

Keras系列:

1、keras系列︱Sequential与Model模型、keras基本结构功能(一) 
2、keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二) 
3、keras系列︱图像多分类训练与利用bottleneck
features进行微调(三) 
4、keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四) 
5、keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完整案例(五)


在第一种方案中,首先需要确定具体影响农田有效灌溉面积变化的因素种类及其影响规律,另外还需要对各因素的未来变化进行预测。准确地确定影响农田有效灌溉面积变化的各种因素本身就很有难度,各因素对有效灌溉面积影响规律的辨识也同样是一个比较复杂的问题,而预测各因素未来的变化更是一个几乎和预测农田有效灌溉面积难度相当的问题。在第二种方案中,首先需要建立起能够充分反映农田有效灌溉面积变化规律的预测模型,然后通过求取该预测模型在未来的输出值即可实现预测。两种方案相比,显然第二种方案更容易实现。因此,在以下研究中采用数据序列预测方案。

  3.语言的歧义性:一条新闻,其正面性/负面性往往存在着多种解读。例如“习主席宣布中国将裁军30万”——新华每日电讯2015.09.04。这条新闻一般意义上可以解读为:中央政府深入推进改革,精兵简政,大力发展国防军工事业。这是一种正面性的解读。而在使用机器学习模型时,如传统的奇异值分解算法(SVD),很有可能会判定其与“去年五大行裁员近3万”这种新闻具有较高的相似度,因而将其划分为负面新闻。

零、keras介绍与基本的模型保存

写成了思维导图,便于观察与理解。

1.2 预测方法的选择

  4.技术实现较为繁杂:这其实是一个非常重要的原因啦~,获取正确的信息并进行NLP操作,往往需要经过以下流程:人工浏览网页确定稳定可靠的信息源→设计爬虫实现有效信息的获取→设计新闻裁剪(填充)方案以应对不同长度的新闻→人工标注新闻的正/负性(也可以用当日股价涨跌来标注)→设计网络模型→训练及验证模型。其中的每一步都非常麻烦耗时,而且对于个股来说,并不是每天都会有新闻出现。

1.keras网络结构

图片 1

在数据序列的预测中,目前广泛采用的方法有移动平均法、指数平滑法、线性回归法、灰色预测法、神经网络法和支持向量机方法等。这些方法中神经网络法和支持向量机方法从本质上来说更为适合应用于非线性预测问题。而农田有效灌溉面积所构成的数据序列是一个典型的非线性序列。显然在该研究中采用神经网络法和支持向量机方法较为合适。为了充分研究这两种方法的适用性,以下对这两种方法进行对比分析。

 

2.keras网络配置

图片 2
其中回调函数callbacks应该是keras的精髓~

2 两种预测方法的理论基础及特性分析

  上面说了这么多,还没有开始对我这个预测模型进行介绍,下面开始进入正题。在决定排除消息面的考量之后,我开始思考股价涨跌的本质,我认为股价就是资金博弈结果的体现。这次建立的预测模型,朴素的想法是通过深度学习模型来洞悉庄家的操作规律,对拉升、砸盘的情况进行预测。为了达到以下目的,我决定选取以下七个特征来构建网络模型,即:

3.keras预处理功能

图片 3

2.1 BP神经网络预测的理论基础及特性分析

涨跌幅  最高涨幅  最低跌幅  大单净流入 
中单净流入  小单净流入  换手率

4、模型的节点信息提取

# 节点信息提取
config = model.get_config()  # 把model中的信息,solver.prototxt和train.prototxt信息提取出来
model = Model.from_config(config)  # 还回去
# or, for Sequential:
model = Sequential.from_config(config) # 重构一个新的Model模型,用去其他训练,fine-tuning比较好用

在各类神经网络中,BP神经网络堪称最经典、使用最为广泛的一种神经网络[2,3]。

使用这七个特征来对股票的涨跌情况以及资金的流动情况建立适当的模型。此外,其他的指标类似MACD、均线等也是通过一些基础数据的运算得出,在构建模型时并没有将其纳入考量范围。

5、 模型概况查询(包括权重查询)

# 1、模型概括打印
model.summary()

# 2、返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型:
from models import model_from_json

json_string = model.to_json()
model = model_from_json(json_string)

# 3、model.to_yaml:与model.to_json类似,同样可以从产生的YAML字符串中重构模型
from models import model_from_yaml

yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)

# 4、权重获取
model.get_layer()      #依据层名或下标获得层对象
model.get_weights()    #返回模型权重张量的列表,类型为numpy array
model.set_weights()    #从numpy array里将权重载入给模型,要求数组具有与model.get_weights()相同的形状。

# 查看model中Layer的信息
model.layers 查看layer信息

BP神经网络是误差反向传播(Back error
propagation,简称BP)神经网络的简称。BP神经网络通常由1个输入层、若干隐含层和1个输出层组成,在每层中可以包括若干个神经元。各相邻层神经元之间多为全连接方式,而同层神经元之间则无连接[4]。各神经元间的连接传递相应的权值,隐含层及输出层各神经元都有自己的阈值。BP神经网络作为一种前馈网络,具有前馈网络的共性。研究表明,三层前馈网络就能够以任意精度逼近任意连续函数及其各阶导数[5]。对序列进行建模,从本质上来说就是获得序列的变化泛函,BP神经网络的函数逼近功能正好可以实现此过程。

 

6、模型保存与加载

model.save_weights(filepath)
# 将模型权重保存到指定路径,文件类型是HDF5(后缀是.h5)

model.load_weights(filepath, by_name=False)
# 从HDF5文件中加载权重到当前模型中, 默认情况下模型的结构将保持不变。
# 如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True,只有名字匹配的层才会载入权重.

但BP神经网络也存在若干缺陷,其中比较突出的是网络结构的不易确定、易限于局部收敛和收敛速度慢。其中网络结构的不易确定是指在确定网络结构参数的过程中没有准确的依据可以遵循。而局部收敛则对BP神经网络的函数逼近功能影响较大。

一.源数据及其预处理

7、如何在keras中设定GPU使用的大小

本节来源于:深度学习theano/tensorflow多显卡多人使用问题集(参见:Limit
the resource usage for tensorflow backend · Issue #1538 ·
fchollet/keras ·
GitHub) 
在使用keras时候会出现总是占满GPU显存的情况,可以通过重设backend的GPU占用情况来进行调节。

import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3
set_session(tf.Session(config=config))

 

需要注意的是,虽然代码或配置层面设置了对显存占用百分比阈值,但在实际运行中如果达到了这个阈值,程序有需要的话还是会突破这个阈值。换而言之如果跑在一个大数据集上还是会用到更多的显存。以上的显存限制仅仅为了在跑小数据集时避免对显存的浪费而已。(2017年2月20日补充)

2.2 支持向量机预测的理论基础及特性分析

  通过某股票交易软件,我获得的源数据约有20来个特征,包括:涨幅、现价、涨跌、买入、卖价、成交量等等。为了得到上面所述的七种特征,挑选出涨跌幅、大单净流入、中单净流入、小单净流入、换手率这5个特征,并计算最高涨幅、最高跌幅两个特征。通过下列公式计算获得。

8.更科学地模型训练与模型保存

filepath = 'model-ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5'
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
# fit model
model.fit(x, y, epochs=20, verbose=2, callbacks=[checkpoint], validation_data=(x, y))

 

save_best_only打开之后,会如下:

 ETA: 3s - loss: 0.5820Epoch 00017: val_loss did not improve

 

如果val_loss 提高了就会保存,没有提高就不会保存。

3 预测模型的建立

图片 4

9.如何在keras中使用tensorboard

    RUN = RUN + 1 if 'RUN' in locals() else 1   # locals() 函数会以字典类型返回当前位置的全部局部变量。

    LOG_DIR = model_save_path + '/training_logs/run{}'.format(RUN)
    LOG_FILE_PATH = LOG_DIR + '/checkpoint-{epoch:02d}-{val_loss:.4f}.hdf5'   # 模型Log文件以及.h5模型文件存放地址

    tensorboard = TensorBoard(log_dir=LOG_DIR, write_images=True)
    checkpoint = ModelCheckpoint(filepath=LOG_FILE_PATH, monitor='val_loss', verbose=1, save_best_only=True)
    early_stopping = EarlyStopping(monitor='val_loss', patience=5, verbose=1)

    history = model.fit_generator(generator=gen.generate(True), steps_per_epoch=int(gen.train_batches / 4),
                                  validation_data=gen.generate(False), validation_steps=int(gen.val_batches / 4),
                                  epochs=EPOCHS, verbose=1, callbacks=[tensorboard, checkpoint, early_stopping])

 

都是在回调函数中起作用:

  • EarlyStopping patience:当early 
    (1)stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。 
    (2)mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。

  • 模型检查点ModelCheckpoint  
    (1)save_best_only:当设置为True时,将只保存在验证集上性能最好的模型 
    (2)
    mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。 
    (3)save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等) 
    (4)period:CheckPoint之间的间隔的epoch数

  • 可视化tensorboard write_images: 是否将模型权重以图片的形式可视化

其他内容可参考keras中文文档

.


3.1 样本数据的准备

经过处理的股票特征数据存储在 股票名.csv文件中,类似下图:

一、Sequential 序贯模型

序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉。

从河南统计年鉴中收集了1986-2010年河南省农田有效灌溉面积的统计数据[10]。为了降低预测模型的复杂程度,采用峰值法对这些数据进行了归一化处理。将归一化后的1986-2009年数据作为训练样本,2010年数据作为检验样本。

 图片 5

Sequential模型的基本组件

一般需要:

  • 1、model.add,添加层;
  • 2、model.compile,模型训练的BP模式设置;
  • 3、model.fit,模型训练参数设置 + 训练;
  • 4、模型评估
  • 5、模型预测

确定预测模型每次的输入样本中包含6个数据,即用连续6年的数据预测第七年的数据。据此可建立训练时的输入样本矩阵(6×18)和输出样本向量(1×18)。

图中的特征顺序为:日期,大单净流入,中单净流入,小单净流入,涨跌幅,最高涨幅,最高跌幅,换手率,股价。股价在这里的用处是拼接训练样本输出时,计算多日的总涨跌幅。

1. add:添加层——train_val.prototxt

add(self, layer)

# 譬如:
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dropout(0.25))

 

add里面只有层layer的内容,当然在序贯式里面,也可以model.add(other_model)加载另外模型,在函数式里面就不太一样,详见函数式。

3.2 预测模型基本参数的确定与训练

注:在对源数据进行处理的时候,经常会遇到空值问题:即,有些特征值为0的时候,系统给出的源数据为”-”或”“。需要进行特殊处理。(经常遇见新股第一天的涨跌幅为空,或某交易日大单净流入为空。)

2、compile 训练模式——solver.prototxt文件

compile(self, optimizer, loss, metrics=None, sample_weight_mode=None)

 

其中: 
optimizer: 字符串(预定义优化器名)或优化器对象,参考优化器 
loss: 字符串(预定义损失函数名)或目标函数,参考损失函数 
metrics:
列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是metrics=[‘accuracy’] 
sample_weight_mode:如果你需要按时间步为样本赋权(2D权矩阵),将该值设为“temporal”。 
默认为“None”,代表按样本赋权(1D权)。在下面fit函数的解释中有相关的参考内容。 
kwargs:
使用TensorFlow作为后端请忽略该参数,若使用Theano作为后端,kwargs的值将会传递给
K.function

注意: 
模型在使用前必须编译,否则在调用fit或evaluate时会抛出异常。

1)BP神经网络基本参数的确定与训练。确定BP神经网络的隐含层数为1,输入层神经元数为6,输出层神经元数为1,隐含层神经元数为11。隐含层和输出层的激励函数分别采用正切型Sigmoid函数和对数型Sigmoid函数。为了提高收敛速度,训练时采用了Levenberg-Marquardt数值优化算法。

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图