策略分享

利用CNN对股票“图片”进行涨跌分类——一次尝试

由ypyu创建,最终由small_q 被浏览 334 用户

首先解释一下标题: CNN:卷积神经网络(Convolutional Neural Network), 在图像处理方面有出色表现,不是被川普怒怼的那个新闻网站; 股票涨跌:大家都懂的,呵呵; 股票图片:既然使用CNN,那么如果输入数据是股票某个周期的K线图片就太好了。当然,本文中使用的图片并不是在看盘软件上一张一张截下来的,而是利用OHLC数据“画”出来的; 尝试:这个词委婉一点说就是“一个很好的想法^_^",比较直白的说法是“没啥效果T_T”。


进入正题: 首先是画出图片。本文目前是仿照柱线图画的。 {w:100}

大致的想法是:

  1. 对每个样本,将32time_steps×4features(OHLC)数据归一化处理,即所有取值均在[0,1]之间;
  2. 构建一个128×128像素的全0数组,将[0,1]区间等分为128份,分到每列的128个像素点上;
  3. 然后使用每四列构建一根K线(前三列画柱状线,第四列作为间隔行):第一列描绘开盘价,开盘价与该列的哪个像素点最近,那么这个像素点取值就由0变为1;第二列描绘高低价区间,将 最高价至 最低价 范围内的像素点取值由0变为1;第三列描绘收盘价,收盘价与该列的哪个像素点最近,那么这个像素点取值就由0变为1。

这样每个样本就构建了一张由32根K线组成,类似柱线图的“图片”,下面是一个样本画的一张图(为了便于观看,将0替换成空格,将1替换成圆点): {w:100} 其实还蛮像柱线图的。

测试阶段: 原始数据:最终选择的数据是100只2005年以前上市的股票。1只股票数据太少,全部股票数据又太多,所以 股票三千,我只取一百;“上市时间前于2005年”这个条件 主要考虑在每只股票上取样数量不会太少。

生成样本:每只股票每32根K线生成一个样本,每隔8根K线取一次样。然后按照上述作图方法将其变成图片。标签:若未来五日收益为正,标签为[1,0],否则,标签为[0,1]。15年1月1日之前数据用作train和evaluate,之后数据用作test。

构建模型:本文所用模型共5层,先后顺序为 卷积层-池化层-卷积层-池化层-全连接层,中间还夹杂了两个Dropout和一个Flatten,用来防止过拟合和一维化数据,不过由于他们是无权重的,所以没将他们算作一层。 {w:100}

预测效果: 在train和evaluate阶段,看起来还是不错的:

{w:100} 但是在test阶段: {w:100} 第一个值是loss,第二个值是准确率,不要看反。。。呵呵

听说有一种很厉害的操作——去除label不明显的样本——可能会提高模型效果。所以本文又对训练样本进行了一次筛选,只保留了未来五日收益在最前30%和最后30%的样本。然后input到模型做训练。最终test集上效果: {w:100}有(mei)所(sha)改(xiao)善(guo)!

{w:100}问题分析: 目前发现的一个问题:一幅图中被标记的像素点太少了。下面两张图为train-evaluate样本和test样本中值为1的像素点占总像素点(128×128=16384)比重的分布。 {w:100} {w:100}

值为1的像素点占总像素点比重平均不到5%,最大的比重也未超过10%。这说明在模型训练阶段有些像素点对应的weights仅仅被训练了很少的次数甚至未经训练,这影响了模型在test数据上的表现。之后可能会针对这一问题做一些改进,以增加每张图值为1的像素点占总像素点比例

代码部分可参考

https://bigquant.com/wiki/doc/cnna-HiDL4tK0gz

\

标签

CNN卷积神经网络模型训练特征提取深度学习
评论
  • 我做了一个和你这个逻辑差不多的策略,也是K线图,CNN,但是我加了板块和资金流因子,效果还可以
  • undefined
  • undefined
  • undefined
  • undefined