相信每一个进入到深度学习领域的同学都不可避免的使用过CNN,并且每个人也许都试过深度学习的101--手写数字识别。这是第一个让我们见识到深度学习的神奇的一个模型,一个简单的卷积池化全连接就让模型拥有了不错的识别准确率,这即便是用传统算法,也不是一日之功。
废话少絮,我们先来看一下一个简单的CNN模型是怎么样的!其实也很简单,图像一般有3个通道,对每个通道进行卷积,然后进行最大池化,当然前面两个过程可以重复,然后是全连接,而后用softmax进行分类。
那么我们怎么用CNN来构建一个股票预测模型呢?也非常简单,我们用选取一定天数的技术指标作为输入,关于技术指标,大家可以用TA-lib来获取,至于选多少个技术指标,大家可以用随机森林或者SVM来进行筛选。假如我们选定了10个技术指标,我们用30天的数据来预测1天的涨跌!那么我们的输入就是一个30x10的矩阵,类似的我们可以对它做二维卷积。我们用两层的卷积层,用2x2的Max polling,全连接后用softmax输出两个分类,也就是说,我们的分类是一个长度为2的one-hot向量。
我们的模型建立好了之后,我们用keras来实现这段代码!实现起来非常简单!我们选用3x3的卷积核,用两层的卷积,每层我们都做一个2x2的池化。
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), strides=(1, 1), activation='relu', input_shape=(,30,10))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(2, activation='softmax'))
那么这个模型的表现如何呢?很遗憾的告诉大家,准确率高的会有57%左右。但基本上准确率都分布在50%左右! 在我用相对层数较多的CNN做的实验中,有一次我对训练数据进行了倒序排列,这个混账模型居然出了90%以上的准确率。让几年前刚接触机器学习的我高兴的夜不能寐,当时还没有tensorflow和keras,还是用的python的机器学习库。这显然是不可能的,因为回测的年化收益率超过了10000倍!没有无缘无故的欺骗,原因是因为透露这种方式透露了未来的数据。那么有同学要问了,57%的准确率有没有可操作性呢?或者说回测的收益率如何呢?事实上可以告诉大家,57%的准确率收益已经非常的可观。但是泛化能力不行,仅仅停留在测试结果还不错,也就是说其实是过拟合的!
有同学要问了,看了这篇文章感觉还是一头雾水呢?卷积是一个什么样的过程?池化又是一个什么样的过程?什么又是全连接?softmax是什么原理?我们先来看几张图,简要的来解释一下。卷积其实是一个很简单的矩阵运算过程,大家可以看下图,这是卷积核做卷积的过程。
池化就更简单了,2x2最大池化也就是保留4个值里最大的,这是一种特征值提取方法。
全连接则是和上一层的所有神经元都相连,怎么来理解呢,就是将所有的特征都取出来。
Softmax是干什么呢?其实很简单,将全连接的输出转化为相对概率。我们这个例子里会出现两个相对概率,最后就看谁大了。
当然我们这里只是简单通俗的解释了一下这些基本概念,后续会有一片文章系统的来讲解这些概念。了解更多深度学习和量化知识,请移步我的星球:AI量化(https://t.zsxq.com/RvfY37y) 星球限时免费,如需加入,请私信我获得免费邀请码!微信公众号:QTechAI
网友评论