运用LSTM-君越NN建设构造证券预测模型

 图片 1

4.evaluate,模型评估

evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)

 

本函数按batch计算在某些输入数据上模型的误差,其参数有:

  • x:输入数据,与fit一样,是numpy array或numpy array的list
  • y:标签,numpy array
  • batch_size:整数,含义同fit的同名参数
  • verbose:含义同fit的同名参数,但只能取0或1
  • sample_weight:numpy array,含义同fit的同名参数

本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的list(如果模型还有其他的评价指标)。model.metrics_names将给出list中各个值的含义。

如果没有特殊说明,以下函数的参数均保持与fit的同名参数相同的含义 
如果没有特殊说明,以下函数的verbose参数(如果有)均只能取0或1

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

机器学习算法分类

机器学习主要分为三种类型,监督学习(Supervised
Learning)、无监督学习(Unsupervised Learning)和强化学习(Reinforcement
Learning)。我们对主流分类方法来介绍机器学习在量化投资中的应用,实际上,各种方法的应用模式可以互相交叉。

监督学习的主要目的是使用有类标的训练数据构建模型,我们可以使用经训练得到的模型对未来数据进行预测。术语监督是指训练数据集中的每个样本均有一个已知的输出项。如利用分类对类标进行预测、使用回归预测连续输出值。

在无监督学习中,将处理无类标数据或者总体分布趋势不明朗的数据,通过无监督学习,我们可以在没有已知输出变量和反馈函数指导的情况下提取有效信息来探索数据的整体结构。如通过聚类发现数据的子群,数据压缩中的降维。

强化学习的目标是构建一个系统,在与环境交互的过程中提高系统的性能。环境的当前状态信息中通常包含一个反馈信号,我们可以将强化学习视为与监督学习相关的一个领域,然而,在强化学习中,这个反馈值不是一个确定的类标或者连续类型的值,而是一个通过反馈函数产生的对当前系统行为的评价。通过与环境的交互,系统可以通过强化学习来得到一系列行为,通过探索性的试错或者借助精心设计的激励系统使得正向反馈最大化。一个常用的强化学习例子就是象棋对弈的游戏,在此,系统根据棋盘上的当前局态(环境)
决定落子的位置,而游戏结束时胜负的判定可以作为激励信号。AlphaGo
就是强化学习的成功应用。

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

案例五:抽取层节点内容

# 1、单节点
a = Input(shape=(140, 256))
lstm = LSTM(32)
encoded_a = lstm(a)
assert lstm.output == encoded_a
# 抽取获得encoded_a的输出张量

# 2、多节点
a = Input(shape=(140, 256))
b = Input(shape=(140, 256))

lstm = LSTM(32)
encoded_a = lstm(a)
encoded_b = lstm(b)

assert lstm.get_output_at(0) == encoded_a
assert lstm.get_output_at(1) == encoded_b

# 3、图像层节点
# 对于input_shape和output_shape也是一样,如果一个层只有一个节点,
#或所有的节点都有相同的输入或输出shape,
#那么input_shape和output_shape都是没有歧义的,并也只返回一个值。
#但是,例如你把一个相同的Conv2D应用于一个大小为(3,32,32)的数据,
#然后又将其应用于一个(3,64,64)的数据,那么此时该层就具有了多个输入和输出的shape,
#你就需要显式的指定节点的下标,来表明你想取的是哪个了
a = Input(shape=(3, 32, 32))
b = Input(shape=(3, 64, 64))

conv = Conv2D(16, (3, 3), padding='same')
conved_a = conv(a)

# Only one input so far, the following will work:
assert conv.input_shape == (None, 3, 32, 32)

conved_b = conv(b)
# now the `.input_shape` property wouldn't work, but this does:
assert conv.get_input_shape_at(0) == (None, 3, 32, 32)
assert conv.get_input_shape_at(1) == (None, 3, 64, 64)

 

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

AI+量化的应用和展望

AI 在国内的应用仍有一定的局限性,目前 AI
在国内投研投顾领域主要用于辅助决策与用户画像上。将来有望落地的将会是“AI+”的量化投资模式,即在传统量化思想的基础上,恰当地运用一些
AI 算法,帮助贡献有益的投资决策。长期来看,全面 AI
还很遥远。这一方面是由于,AI 学习的效果跟数据的质量有很大关系,我国 A
股市场发展的时间还不长,数据量不够充足,噪声也比较多,使 AI
学习效果的稳定性不能得到充分的保证。另一方面,脱离人类经验的完全强化学习目前仅在有特定约束条件的环境下成功运用,
离普适还有相当距离,深度学习、强化学习等技术仍需要 GPU、TPU 发展的支持。

人工智能,在金融领域已经开始逐步从探索走向应用,从金融大数据,到智能投顾、智能投研,在不断取得新的应用进展。依托于计算机和数据信息的发展,“AI+”的模式将给我们的投资研究带来更多的助益。未来将在“AI+”量化投资中探索更多的想法和应用。

 

三、Model式模型

来自keras中文文档: 
比序贯模型要复杂,但是效果很好,可以同时/分阶段输入变量,分阶段输出想要的模型; 
一句话,只要你的模型不是类似VGG一样一条路走到黑的模型,或者你的模型需要多于一个的输出,那么你总应该选择函数式模型。

不同之处: 
书写结构完全不一致

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

机器学习在量化投资中的应用

监督学习:对未来事件进行预测

1、 回归——预测连续型目标变量

(1) OLS 回归

OLS
回归的目标是:求误差的最小平方和。对于线性回归模型,最小二乘有解析解,即:

图片 2

非线性最小二乘没有解析解,通常用迭代法求解。

最小化代价函数的迭代法有:梯度下降法,可以用于线性和非线性模型;高斯-牛顿法,用于非线性模型;
Levenberg-Marquardt
法,结合了梯度下降和高斯-牛顿法,用于求解非线性模型。

(2)正则化方法——岭回归、LASSO回归、弹性网络

正则化是通过在模型中加入额外信息来解决过拟合的一种方法。加入的信息称为惩罚项,惩罚项增加了模型的复杂度,但降低了模型参数的影响。

常用的正则化线性回归方法有:基于 L2 罚项的岭回归、基于 L1 罚项的 LASSO
回归, 以及结合了 L1 与 L2 的弹性网络。

岭回归:在最小二乘的代价函数中加入权重的平方和。其中增加超参λ的值可以增加正则化的强度,同时降低了权重对模型的影响。

图片 3

LASSO 回归:在最小二乘的代价函数中加入权重绝对值的和。

图片 4

弹性网络:包含 L1 罚项和 L2 罚项。

图片 5

(3)评价回归模型性能的方法

残差图:对于一个好的回归模型,期望误差随机分布,残差也随机分布于中心线附近。

均方误差(MSE):最小化误差平方和(SSE)的均值,可用于不同回归模型的比较,
参数调优和交叉验证。

图片 6

决定系数( R2 ):MSE 的标准化版本,预测值的方差。

图片 7

(4)实例:OLS、LASSO、岭回归拟合月收益率

以沪深 300 成分股为基础,选择 PE、PB、ROE、LFLO、20
日资金流量、应付账款周转率、净利润增长率、当前价格处于过去 1
年股价中的位置这 8 个因子构造模型,使用20110801-20130531
的月数据用来训练,20130601-20171001 进行回测,按月调仓;

首先对数据进行去极值、中性化、标准化、归一化处理,再分别采用三种不同的模型在训练集上获取回归系数,根据调仓日前一天的因子与回归系数的乘积作为分数,取排名前
20 的股票,按分数在合计分数中的比例计算买入权重;

分别应用 OLS、LASSO回归、岭回归的回测结果净值如下:

图片 8

OLS回归

图片 9

LASSO回归

图片 10

岭回归

2、 分类——预测分组或标签

(1) logistic回归

Logit回归(logistic regression)是一个分类模型。它通过一个Logistic
函数将输入映射到[0,1]区间,logistic 函数又称sigmoid函数,形式如下:

图片 11

其中,输入 Z:

图片 12

Logit回归模型可以看做由两部分组成,一部分和线性回归一样,另一部分是sigmoid
函数。直观形式如下图:

图片 13

Logistic回归

逻辑斯蒂模型的求解:归结为以似然函数为目标函数的优化问题,用迭代法求解。

逻辑斯蒂回归并不是硬性地将分类结果定为 0 或 1,而是给出了 0 和 1
之间的概率。这相当于对分类结果给出了一个打分。例如我们想选出沪深 300
成分股中上涨概率最大的前 30
只股票,我们可以用逻辑斯蒂回归的结果对每只股票算出一个打分,分数越接近于1
上涨概率越大,只要选出打分排名前 30
的就可以了。另外也可以规定一个阈值,大于阈值的归为一类,小于阈值的归为另一类。

(2) SVM

SVM(support vector
machine)俗称支持向量机,是一种监督学习算法,可用于分类和回归。它在解决小样本、非线性及高维模式识别中表现出许多特有的优势。

支持向量机分类的原理如下:

假设有两个类别:实心圆和空心圆,我们的数据有两个特征:x 和
y,需要得到一个分类器,给定一对(x,
y),输出实心圆和空心圆。我们将已标记的训练数据展示在下图:

图片 14

SVM分类

假设我们要把实心圈和空心圈分成两类。支持向量机会接受这些数据点,并输出一个超平面(在二维图中是一条直线)将两类分割开来。两类中,分别有距离分界线最近的点,
被称为支持向量(图中加粗的圆点)。而我们要寻找的最优的分界线要满足:支持向量到最优分界线的距离最大。

用数学表达式表述:

定义直线

图片 15

任意点 x 到该直线的距离为

图片 16

N 个训练点的信息记为

图片 17

分类器满足

图片 18

以上分类原理可拓展至高维平面。

我们已经了解到了 SVM 处理线性可分的情况,对于非线性的情况,SVM
的处理方法是选择一个核函数,通过将数据映射到高维空间,最终在高维特征空间中构造出最优分离超平面,来解决在原始空间中线性不可分的问题。

(3)决策树、随机森林

决策树

决策树最吸引人的地方在于其模型的可解释性。正如其名称“决策树”所意味的那样,我们可以从树根开始,根据节点的不同变量值划分建立树的分枝,自顶向下重复建下层和分枝,直到完成建立整棵决策树。

在每一个节点,选择可获得最大信息增益(information
gain,IG)的特征来对数据进行划分。通过迭代重复此划分过程,直到叶子节点。在实际应用中,这可能会导致生成一棵深度很大、拥有众多节点的树,即发生过拟合,为此,一般通过“剪枝”限定树的最大深度。

最大信息增益即每次划分时优化的目标函数,为了实现每次划分对信息增益的最大化。

信息增益:

图片 19

其中,f 为将要进行划分的特征, Dp 和 Dj 分别是父节点和第 j 个子节点,I
为信息含量, Np 和 Nj
分别为父节点和子节点中的样本数量。所以信息增益即父节点信息与子节点信息之差。

信息 I 一般有三个度量标准:基尼系数( IG )、熵( IH )、误分类率( IE
)。

最常用的是熵,其定义为:

图片 20

其中, p( i | t) 为节点 t 中,属于类别 c 的样本占节点 t
中总样本数的比例。

随机森林

随机森林可以看作多棵决策树的集成,通过多数投票的方式对每棵决策树的结果汇总。随机森林具有更好的鲁棒性,因此一般不需要剪枝。

(4)K-近邻算法

K-近邻算法(K-nearest
neighbor,KNN)是惰性学习算法的典型例子,惰性学习在学习阶段的计算成本为
0。

KNN算法非常简单,首先,选择近邻的数量 k
和距离度量方法;然后找到待分类样本的 k
个最近邻居;最后,根据最近邻的类标进行多数投票。

图片 21

KNN算法

(5)神经网络、深度学习

神经网络

人工神经网络是模仿大脑神经元之间信息传递的模型,可以以任意精度逼近任意函数,
能够处理各种复杂的非线性关系,多用于处理分类问题。

下图描述了一个简单的神经元:

图片 22

单个神经元

这个神经元是一个以 x1, x2, x3及截距+1为输入值的运算单元,其输出为:

图片 23

函数 f 被称为激活函数。常用的激活函数有 sigmoid 函数

图片 24

和双曲正切函数

图片 25

神经网络是将多个单一神经元联结在一起,一个神经元的输出可以成为另一个神经元的输入。

图片 26

神经网络模型

神经网络由最左边输入层、最右的输出层(本例中,输出层只有一个节点)和中间隐藏层构成。上图的神经网络例子中有
3 个输入单元(偏置单元不计在内),3 个隐藏单元及一个输出单元。

深度学习

当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,具有强大的从少数样本集中学习数据集本质特征的能力。

深度学习的实质是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。

深度神经网络的训练机制与传统神经网络不同。传统神经网络采用反向传播的训练机制,即通过残差的反向传播调整权重。深度神经网络层数较多,残差传播到最前面的层已经变得太小,会出现梯度扩散的问题。

深度神经网络采用的训练机制为逐层初始化。

简单的说,分为两步,一是每次训练一层网络,二是调优。深度学习训练过程具体如下:

1)使用自下上升非监督学习(从底层逐层向顶层训练):

采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个特征学习过程,是和传统神经网络区别最大的部分。逐层学习每一层的参数,每一步可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层。使得得到的模型能够学习到数据本身的结构,得到比输入更具有表示能力的特征;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

基于第一步得到的各层参数进一步微调整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于深度学习的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以深度学习效果好很大程度上归功于第一步的特征学习过程。

(6)实例:决策树对沪深 300 走势分类

模型构建:

模型的输入因子,我们选取了三个大类,分别是市场前期走势、宏观经济指标和利率因素。

市场走势中选取沪深 300
指数上一个月收益率、上一个月区间波动率作为因子,以期反映市场在波动、动量等维度的信息;在宏观经济指标中,我们选取了
GDP(国民经济生产总值,当季同比)、CPI(消费者物价指数)、PMI(采购经理人指数)、Capital
Investment
(固定资产投资完成额,当月同比)等与 A
股市场关系密切的变量作为因子;类似地,在利率因素中则选取了 YTM1Y(1
年期国债到期收益率,当月同比)、M2(广义货币,当月同比)。宏观经济指标和利率因素数据中由于
CPI、M2 等数据一般都在月中公布,因此我们在预测中使用的是滞后一期的数据。

时间区间为 2005 年 1 月至 2017 年 7 月,训练时间为 36
个月,采用滚动训练预测的方式。用 t-36 到 t-1
月的因子数据为训练样本,进行样本内的参数测算,再用其来预测第 t 个月沪深
300 指数的涨跌。

所有的数据我们都进行了异常值、缺失值等各种预处理。在每个月的月末判断下个月沪深
300
指数的涨跌,并将该结果与下个月的真实涨跌情况进行比较,计算决策树方法预测的准确率(预测正确个数/预测期总月份数)。

采用改进后的 CART 方法,加入了自动剪枝过程,从而减少过拟合。

下图为一个样本生成树的示例:

图片 27

决策树分类示例

下图显示了决策树(CART)模型的涨跌预测准确率的变化过程。在总共 114
个预测期内我们预测大盘涨跌正确的月份达到 68 个,也就是说准确率达到了
60%的水平。从准确率随时间变化趋势来看,除去刚开始时的波动,后期基本稳定在
60%上下,整体准确率还算是较为理想。

图片 28

决策树分类准确率变化

接下来我们考虑以上述决策树预测为基础的择时策略(对应下图中 CART
Strategy):如果模型看涨则在下一个交易日全仓买入,看跌则在下一个交易日清仓(假定初始购入资金为
10 万,单边买卖的成本定为 0.5%)。与之对应的为基准交易策略(对应下图中
HS300 Strategy),即在开始时全仓购入沪深 300
指数并持续持有。由此我们得到了下图中两种
策略的资产净值比较:尽管 2008-2017
年期间大盘整体表现不佳,但决策树策略仍然保持了为正的累计收益率,并且其收益率比持续持有沪深
300 指数要高出 21.3%。

从下图中可以看出,这部分高出的收益率主要来自于决策树策略能够有效地规避大部分下跌(大盘指数下跌时
CART Strategy 曲线大多走势平缓),并且把握住了主要的上涨
行情。但我们也发现决策树策略的上涨行情的把握略差于对下跌行情的规避,尤其是2015-16
年间的一波中级牛市,基本没有较大幅度的上涨(还好规避掉了后来大盘的下跌)。究其原因,我们认为像经济指标的滞后、因子覆盖面不足(例如忽略了市场情绪变化)等
都是可能干扰决策树模型的噪声。

图片 29

决策树择时与基准净值变化

无监督学习:发现数据的潜在规律

1、聚类——无类标数据潜在模式的挖掘

(1)K-means

K-means
计算高效,易于实现,是一种经典的聚类技术。它是根据样本之间的相似性对样本进行分组,划分为k个类簇,组内的对象之间具有更高的相似度。相似性的度量通常采用欧氏距离的倒数。

初始状态下,随机选取k个点作为初始类簇中心。随后将每个样本依据相似度划分到离它最近的中心点,并重新计算每个簇的中心。重复这一步骤,直到中心点不变或者达到预定的迭代次数时终止。

实际运用中,初始k个中心点的选取以及聚类簇数k对结果的划分有较大影响。因此,
除了随机选取初始中心,我们还有两种其他的方式选取初始中心。

初始中心的选取

1、 选择批次距离尽可能远的 k
个点:首先随机选择一个点作为第一个初始类簇的中心点,然后选择距离它最远的那个点作为第二个初始类簇的中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点……直到选出
k 个初始类簇的中心点。

2、 选用层次聚类或 canopy
算法进行初始聚类,然后利用这些类簇的中心点作为k-means
算法初始类簇中心点。

K 值的确定

通过选定一个类簇指标,比如平均半径或直径,当假设的簇数 k
大于等于真实的类簇数目时,该指标上升很慢,而少于真实数目时,该指标会急剧上升。类簇指标变化的拐点最接近真实类簇数目。

其中,类簇的半径指类簇内所有点到类簇中心距离的最大值。类簇的直径指类簇内任意两点之间的最大距离。

图片 30

类簇指标变化的拐点为最佳 K 取值

(2)层次聚类

层次聚类无需事先指定簇数量。层次聚类有两种:凝聚(agglomerative)层次聚类和分裂(divisive)层次聚类。

凝聚层次聚类是一个自下而上的聚集过程,初始时把每个样本看作一个单独的簇,重复地将最近的一对簇合并,直到所有样本都在同一个簇中为止。由此生成整个树形图。在这个过程中,度量两个簇之间距离的方式有三种:

单链(single-link):不同两个聚类簇中离得最近的两个点之间的距离(即
MIN);

全链(complete-link):不同两个聚类簇中离得最远的两个点之间的距离(即
MAX);

平均链(average-link):不同两个聚类簇中所有点对距离的平均值(即
AVERAGE)。

而分裂层次聚类是自上而下的,首先把所有样本看作在同一个簇中,然后迭代地将簇划分为更小的簇,直到每个簇都只包含一个样本。

层次聚类的缺点在于计算开销比较大。

(3)实例:趋势动量模式聚类选股模型

策略思路:使用聚类的方法,找到短期内表现较好股票的动量和趋势模式特征,选择最接近该特征的股票构建投资组合,使得组合能够在较短周期内取得较好收益。

策略的大致流程如下所示:

1、在 t 时刻,计算所有股票在
t-20时刻的动量和趋势指标值(计算方法见下),根据股票的指标值和市值(均已去极值标准化处理)对所有股票进行
K-means 聚类,得到M个股票组(类别);

2、每个股票组构成一个投资组合,假设对组合内每只股票等权重分配资金,计算每个投资组合从
t-20 持有至 t 天的组合收益值;

3、对 M
个组合的收益值进行排序,找到排序最高的股票组合,并得到这个类别的指标中心向量,记为
center;

4、在 t 时刻下计算所有股票的指标向量,计算每个向量与最优中心 center
的欧氏距离,按照距离由小到大排序,得到前 20
支股票,作为当前选出的股票组合进行投资, 持有 20 天后卖出;

5、策略逐日滚动。

策略所采用的动量和趋势指标计算方法如下:

ROC(rate of change) = (Pricetoday – Pricen days ago) / Pricen days ago
* 100 TrendIndicator = (Price – EMA) / EMA * 100

其中,EMA 为股价的指数移动均值。分别选取 125 天 ROC、20 天 ROC 和 200

TrendIndicator、50 天 TrendIndicator 为长、短周期动量和趋势指标。

对 2007 年 1 月 1 日至 2017 年 7 月 14 日全 A
股市场所有股票的日线数据进行分析,基准分别选取上证综合指数和沪深 300
指数。

交易手续费设置为双边千分之三,使用收盘价计算策略指标,使用发出交易信号第二天的开盘价进行交易。初始资金等分为
20 份,用于一个 20 天周期内不同交易日的策略交易,各份资金之间互不影响。

在构建投资组合时,剔除停牌以及上市未满一年的股票。策略表现如下:

图片 31

聚类数为 10 的长短期 ROC 指标聚类图

图片 32

聚类数为 10 的长短期 trend 指标聚类图

图片 33

聚类数为 10 的净值表现

2、降维——数据压缩

(1)主成分分析

对不适合正则化的模型,可以用主成分分析或者线性判别分析降维。

主成分分析是一种常用的降维方法,能够在尽可能多地保留相关信息的情况下,把多指标转化为少数几个综合指标。

其基本原理是把数据沿着方差最大的方向映射到维度更低的子空间上,新特征的坐标相互正交。如果原始数据是
d 维,新的子空间是 k 维( k ≤ d ),那么我们需要构建一个d×k维的转换矩阵
W。

构造转换矩阵的基本步骤是:首先对数据标准化,并构造样本的协方差矩阵,求协方差矩阵的特征值和特征向量,选择与前
k 个最大特征值对应的特征向量构建映射矩阵。

(2)线性判别分析

线性判别分析(linear discriminant
analysis,LDA)是一种监督的数据压缩方法。使用 PCA 降维时, PCA
可以把两个特征合并为一个,但 PCA
没有类别标签,如果这两个特征对于类别标签的分类没有任何影响,那么我们完全可以把这两个特征去除。LDA
就是要从高维特征中抽取出与类别标签关系最密切的低维特征。

假设我们有两个类别标签,当原始数据是二维,想将二维降到一维,我们可以把数据投影到最佳向量
w 上,使得类别间的距离最大,每个类别内部点的离散程度最小。

图片 34

线性判别分析

找最佳向量 w 的过程如下:

1、 对 d 维数据进行标准化处理,并计算 d 维的均值向量:

图片 35

2、 构造类间散布矩阵 SB 及类内散布矩阵 SW:

图片 36

其中,m 为全局均值,

图片 37

3、 计算矩阵

图片 38

的特征值及特征向量;

4、
提取前k个特征值所对应的特征向量,构造d×k维的转换矩阵W,其中特征向量以列的方式排列;

5、 使用转换矩阵把样本映射到新的子空间。

(3)实例:主成分因子降维

我们选取2017 年第一季度沪深300
成分股的每股收益和资产收益率,并进行标准化,
得到下图的二维数据点。我们希望找到一条直线,使得这一方向上的数据值对方差的影响最大,即,将数据点投影到这条直线后,得到的方差最大。

图片 39

每股收益和净资产收益率主成分分析

上图的直线是第一主成分所在的维度。新特征 Z 为第一主成分:

Z = 0.707×1-0.707×2

通过主成分分析的方法,我们将相关性较高的两个因子,每股收益和资产收益率降为一个一维特征。

强化学习:交互式最大化收益

1、强化学习

强化学习(Reinforcement
Learning)是让计算机实现在特定的情况下,通过不断地尝试, 从错误中学习,
最后找到规律,
找到可以获得最大回报的行为。强化学习有四个基本组件,包括输入:环境(States),动作(Actions),回报(Rewards)以及输出:方案(Policy)。和监督学习不同,强化学习没有确定的标签,需要机器自己摸索,每一个动作对应一个奖赏,最后得到一个奖赏最大的方式进行数据处理。AlphaGo
就是一个强化学习的实例。强化学习的主要算法有:Sarsa,Q Learning, Policy
Gradients, Actor-Critic, Deep-Q-Network 等。

图片 40

强化学习

强化学习的目标是发现最优策略π(x),使得达到最优价值Q
。主要有两种途径可以学习最优值函数:一种是基于模型的学习,
在学习的过程中对模型进行估计, 如实时动态规划(Real-Time Dynamic
Programming, RTDP);另一种是无模型学习,
在学习的过程中直接估计最优行动值。

Q学习算法是 Watkins 在 1987
年提出的一种无模型强化学习算法:它用状态s下采取行动的下一个状态s’,对假定的行动s’所对应的最大Q’值更新当前的Q值。

2、实例:Q 学习优化投资组合权重

由前文介绍可知,对于系统环境变动频繁的动态决策问题,
强化学习Q算法具有不断试错、优化调整的特点。而量化投资同样面临着具有高风险和高不确定性的环境,而且往往需要在不同阶段动态调整不同股票的投资比例,这些问题通过强化学习Q算法可以得到较好的解决。

假设此组合投资系统在第t-1阶段投资时对股票 i 的未来绩效评价值为Y(i,t –
1),期望值为Yˆ(i,t –
1)。在第t-1期投资结束时,对投资结果进行评价,并计算下一期绩效的期望值:

图片 41

第t期结束后,计算股票i 运作绩效变化率:

图片 42

接下来对该股票的投资权重K(i,t) 进行调整:

图片 43

其中a是一个决定学习速度的正恒量,一般取a = 0.1。

也就是说,如果Y(i,t) >
Yˆ(i,t),即股票i在第t期的表现超出预期,则对其进行“奖励”,增加股票i的投资比例;否则其将受到惩罚,
即调低该股票的投资比例,直到退出为止。最后对所有股票的权重再统一乘以一个系数,以保证所有权重的加总为
1。

 

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及预测、完整案例(五)


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

 图片 44

一、Sequential 序贯模型

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

以河南省1986-2010年的农田有效灌溉面积统计数据为基础,详细阐述了利用两种预测方法建立预测模型的过程,并进行了应用验证。验证结果表明,基于支持向量机的预测方法具有更好的泛化能力,预测精度更高。最后获得了河南省“十二五”期间农田有效灌溉面积的预测数据并指出了其发展趋势。

  之后,我单独选了中国软件这个股票(这个票看起来像庄家主导的那种),对它单独进行分析。使用了一年半的交易数据作为训练集,共有293个训练样本,训练140个epoch。最后训练出模型对测试集中的60个测试样本进行验证。预测误差如下图。


3 预测模型的建立

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

 

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

经过股票数据的验证,使用LSTM-RNN来对股票进行预测具有一定的可行性,但效果不佳(要是效果好的话我估计也不会分享到网上,自己闷声发大财啦,哈哈~~~)。

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

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

  归一化相关工作:因为神经网络激活函数的限制,需要在训练前将数据映射到0~1区间。本次试验中,对近两年的数据,获取其各项特征的最大值与最小值。设置归一化与函数,在样本拼接的同时将数据进行归一化。

案例三:使用LSTM的序列分类

具体的专门有链接来写:

.


1.1 预测方案的确定

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

案例二:多分类-VGG的卷积神经网络

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils

# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
# 100张图片,每张100*100*3
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
# 100*10
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
# 20*100

model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)

 

标准序贯网络,标签的训练模式 
注意: 
这里非常重要的一点,对于我这样的新手,这一步的作用?

keras.utils.to_categorical

 

特别是多分类时候,我之前以为输入的就是一列(100,),但是keras在多分类任务中是不认得这个的,所以需要再加上这一步,让其转化为Keras认得的数据格式。

 

最终代码基于Keras==2.0

# -*- coding:utf-8 -*-


import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils

# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
# 100张图片,每张100*100*3
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
# 100*10
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
# 20*100

model = Sequential()#最简单的线性、从头到尾的结构顺序,不分叉
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)

 

4.2 河南省“十二五”期间农田有效灌溉面积的预测与分析

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

5.predict 模型预测

predict(self, x, batch_size=32, verbose=0)

 

本函数按batch获得输入数据对应的输出,其参数有:

函数的返回值是预测值的numpy array

研究针对BP神经网络和支持向量机两种预测方法进行了对比分析。理论研究表明,基于支持向量机的预测方法可以克服BP神经网络的诸多缺陷,具有优越性。

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

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 提高了就会保存,没有提高就不会保存。

实际上,预测结果是在现有条件的基础上从数据序列的角度进行的预测,如果在“十二五”期间,政府大幅增加水利行业的资金投入,最终的发展情况将会比该预测结果更好。

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

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

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

4.1 两种模型预测能力对比

收益曲线:

模型一:只针对新闻语料的LSTM模型

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# Headline input: meant to receive sequences of 100 integers, between 1 and 10000.
# Note that we can name any layer by passing it a "name" argument.
main_input = Input(shape=(100,), dtype='int32', name='main_input')
# 一个100词的BOW序列

# This embedding layer will encode the input sequence
# into a sequence of dense 512-dimensional vectors.
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
# Embedding层,把100维度再encode成512的句向量,10000指的是词典单词总数


# A LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(32)(x)
# ? 32什么意思?????????????????????

#然后,我们插入一个额外的损失,使得即使在主损失很高的情况下,LSTM和Embedding层也可以平滑的训练。

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
#再然后,我们将LSTM与额外的输入数据串联起来组成输入,送入模型中:
# 模型一:只针对以上的序列做的预测模型

 

利用训练完毕的两种预测模型仿真预测1992-2009年的河南省农田有效灌溉面积并进行反归一化处理。反归一化后的各预测值、预测误差的绝对值和预测相对误差的绝对值见表1。从表1可以看出,支持向量机的各预测值与实际值更为接近,其预测误差的绝对平均值、预测相对误差的绝对平均值都远小于BP神经网络预测结果的对应参数。图1中的各预测数据也全部经过了归一化处理,从图1中1992-2009部分也可以看出,支持向量机的预测值基本和实际值重合在一起,而BP神经网络的预测值在一些地方则与实际值相差较大,说明基于支持向量机的预测模型泛化能力更强。
利用这两种预测模型分别预测作为检验样本的2010年河南省农田有效灌溉面积,反归一化后的预测结果如表2和图1所示。从表2和图1可以看出,基于支持向量机的预测模型在检验样本处的实际预测精度也远高于BP神经网络,其预测误差仅为BP神经网络预测误差的11.8%。

 图片 45

_generator

fit_generator(self, generator, steps_per_epoch, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_q_size=10, workers=1, pickle_safe=False, initial_epoch=0)
evaluate_generator(self, generator, steps, max_q_size=10, workers=1, pickle_safe=False)

 

在对农田有效灌溉面积进行预测时,数据序列预测法比结构式预测法更为简单易行。在各种数据序列预测方法中,神经网络预测方法和基于支持向量机的预测方法更为适合农田有效灌溉面积的非线性变化规律。

发表评论

电子邮件地址不会被公开。 必填项已用*标注