首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >做股票数据挖掘的一些日志

做股票数据挖掘的一些日志

作者头像
机器学习AI算法工程
发布2018-03-13 15:11:43
1.9K0
发布2018-03-13 15:11:43
举报

首先说说数据挖掘吧,接触这东西也是机缘巧合,上学期听说ZYN学姐在做科创,于是问了问具体情况,她说跟数据挖掘有关,这词我还是第一次听说,听起来很高级啊,我看了些资料,觉得非常感兴趣,于是就阴差阳错地加入了,还拉了BM和BAQ同学入伙。于是悲剧就开始上演了,我们小组组成以后才发现,原来大家都不懂,什么叫数据挖掘?于是项目没法成立,因为连挖啥都不知道。

于是我们先找了老师问,各种找,找了各种老师,得到了各种资料,什么挖文本的,挖银行的,挖教育的,就差没挖坟了。后面经过大家讨论,决定做股票的,一个是因为股票信息量大,挖的价值高,另外一个是因为股票最难挖,甚至在国际上没有很成功的案例,年轻人聚集在一起,想挑战下自己,挑难的玩。其实最重要的原因是大家都觉得这样没基础的团队是申请不到钱的,特别是团队成员绩点又很低的情况下(其实就是指在下的2.0,其他人都是3.3以上)。于是我们很快定了下来,写申请,要写自己的创新点还有项目具体规划什么的,要求比较详细,老衲在不明真相的情况下瞎扯了一通(其实表面看起来还是相当专业的),没想到过了几天我都快把这事忘了的时候,ZYN学姐电话告诉我说直接通过了,我一头黑线,原来这样也行。。。

做的那个过程一波三折啊,冲在最前线摸索的自然是老夫(结果犯方向性错误最多的也是我)。我们在开始做之前花了一个月补基础,买了几本书看,都是在业内很经典的书。我最初的构想很宏伟,写了一个看上去非常美妙的全局规划,前期数据采集,预处理,建模,存数据库,然后使用数据挖掘工具来做,最后做一个统计。而当时那份规划的重心,我放在了建模和数据挖掘工具的运用上,而且我们准备最后做出一个软件来在线预测股票的涨跌。(看到这里,估计懂炒股的人就要笑了,这玩意要是管用,那别人庄家靠什么吃饭啊?嘿嘿,散户想赚钱,有这么容易?)

规划出来了,我们拿去给指导老师皮德常老师修改(还好那天我没去)。然后很悲剧地,我的想法被全局否定了。皮德常老师指出:

1.在线的股票预测就别想了,你们做不出来。

2.股票建模确实很难。(具体怎么难当时我们也都没想法,皮老师也没有给出,因为他自己也不是做股票这一块的)

3.数据挖掘工具不能用,用了就会使科创变得低级,因为要显得很前沿,就不能用数据挖掘工具,要自己写算法,或者自己修改从网上DOWN下来的算法。

这次交流对我就像晴天霹雳,郁闷啊,想了半天想出来的架构被全盘否定,老衲颜面无光啊,不过我当时想了想,也对,我们之前都没有做过数据挖掘,基本的算法怎么写出来的都不知道,我们是应该自己去学习下,自己写。我们的分工是我负责整体,还有决策树算法,BM和BAQ负责神经网络,两个学姐负责前期的数据工作。

于是我上网去找决策树算法,发现网上的人很多程序都不好,写的很不完整。后来找到了新西兰的开源项目WEKA,里面的算法封装得非常好,我很欣赏工程师们的代码风格,于是准备从WEKA中把决策树代码挖出来,并且全部加上中文注释。于是我熬了几天夜,一周后把代码挖了出来,注释了大部分,大概有两万行吧(只有ID3算法,不包括C4.5),其实说出来还是蛮装B的,两万行的算法啊!然后我很得意的拉BM来看,BM看了撇撇嘴,什么狗屁,这功能,实现出来,跟那几百行的程序效果还不是一样。我当时想争辩几句,毕竟是我辛苦一周的心血啊,可是越争越没底气,是啊,从功能上看,这几万行程序,实现的功能并不多啊,尽管我对程序的了解有了进一步的加深,可是这似乎并没有促成项目的实质性进 展。于是我又开始想了,我对皮德常老师的某些观点提出了质疑,我们自己写十几万行甚至几十万行的程序,本来用数据挖掘工具点几下就出来了,做了不同的事,但是结果都一样,有什么高级,低级之分?诚然我们需要对数据挖掘算法进行了解,但是我们要清楚地认识到,我们是在做应用,不是在做算法,做算法的可能性也不大,拿WEKA来说,内置的C4.5算法已经优化成了其商业版C5.0算法的最后一个公开版本J48,再说从一开始,我们关注的就不是算法,而是最后的效果,最后挖掘出来的信息,到底有几分可信?

想到这里,我发现,自己似乎找到了一个新的方向,应该先对股票有一个详细一点的了解,看看什么地方需要用数据挖掘?一切应该从实际的眼光看,不然就失去了意义,不是吗?

关联规则相关的股票预测,具体怎么做,我先在网上找了一些论文看,觉得做得都不够好,我有一些自己的思想,就写出来吧,因为是对自己学习的总结,也供大家参考。

首先我们可以从算法上分析,关联规则的APRIORI算法是很基础的,也是很好用的,它能挖掘出频繁K项集,也就是满足支持度阀值(当然,也必须有较高的置信度)的所有集合,但是它有一个较大的局限,就是它所适用的数据类型仅仅是二元的0或1(或者说成是YES或NO也可以)。当然,我们显然可以对数据进行处理,把连续的离散化,再把离散的二元化,这样,我们股票连续的数据也难够用APRIORI算法来进行关联规则方面的挖掘了。这里涉及到了一个问题,我们选取股票的哪些数据来做?我们知道,我们的数据最终都会被离散化,所以我们所选取的数据,一定不能是难以离散的。换句话说,就是如果将某个连续的属性离散掉却破坏了它本身的特性,那么这个属性一定是不可取的,因为它可能会对算法的结果造成负面的影响。

我们知道,一支股票最基本的信息大概包括开盘价,收盘价,最高价,最低价,成交量,成交金额等。而这些连续的数据并没有很明显的分段特征,所以我觉得并不能在这些属性上做手脚。但是这并不意味着这是一条死路,因为我们可以先通过统计学手段计算出某些具有特殊意义且易于离散的值。提到这里,想必大家已经明白了,我说的就是炒股公式。举例来说,KDJ值,想必炒股的人没有不认识的吧。百度一下,了解KDJ的内在涵义以后,我们可以很快把K值可以划分成0-10,10-90,90-100,三类,D值划分成0-20,10-80,80-100,三类,J值可以划分成小于10,10-100,100以上,三类,然后二元化,就是9个二元属性,这样预处理就完了。我们选出20-30个指标进行建模,然后用APRIORI算法挖掘频繁项集。

由于挖掘出的频繁项集很多是与类(也就是我们要预测的项,也就是股票的涨跌幅)不相关的,我们将这些信息排除掉,保留对我们有用的信息,这样,我们能够得到最终的关联规则预测。我们得到的答案是:这样的预测能帮助我们知道,当前这支股票对哪些指标最敏感?可以想象这会成为股民的一大助力。

具体的操作方法,首先说明,我的挖掘工具是用的WEKA,说下原因,第一,在所有的开源挖掘工具中,WEKA是综合性能最好的工具之一。第二,在这些综合性能最好的工具中,WEKA的统计能力相对偏弱,图形化一般,而挖掘能力是顶尖的,在股票的挖掘中,我们应用的数据本身就是统计学指标,是别人已经算好的,所以对统计能力的要求并不高,而WEKA保证了最好的挖掘效果。(这里说明一下,只针对我自己,不排除有想先自己设计出统计学指标,再做挖掘的朋友,只是我这里做的随意了)第三,我对JAVA比较偏爱。(其实程序可能会比C跑的慢点,但WEKA的程序架构得非常棒,学JAVA的都可以去看看,收获颇丰)。而我们在WEKA调用APRIORI算法,只用将数据离散化就可以了,二元化它会自动做。具体的相关代码就不发了,自己去找找,在WEKA中是怎么做的数据类型转换,不难找到。

接下来讲述一下我自己的实际操作。由于数据库的几百万行数据还在处理,指标的建模也还未完成,所以这里只拿一个小规模数据来做,不过足以得到部分信息。

我们以601899紫金矿业为例,首先从大智慧新一代里面,把KDJ,RSI,PSY数据弄到EXCEL表格中,离散掉,方法在上一篇文章有讲到,另外,再从K线图中取出数据,算出涨跌幅,作为最后一列加入表格中。当然,对涨跌幅也不要忘记离散化。为了能让WEKA识别文件格式,我吧它另存为CSV文件,然后就可以用WEKA来做分析了。(大智慧里最多可以弄到两年半的每日数据,如果要更多的数据,可以通过别的途径弄到,自己想办法吧)WEKA在关联规则方面有3个算法,分别是Apriori,PredictiveApriori(2001年)和Tertius(1999年)。这里我们用到的是第一种算法,不过PredictiveApriori也是非常值得我们关注的算法,它将置信度和支持度合并成预测精度而成为预测精度,最后我们会找到经过预测精度排序的关联规则,这样我们得到的结果会更加一目了然。可惜的是,国内的相关资料并不多,如果实在找不到资料,我就直接读源码了,不得不提的是WEKA的源码具有非常到位的注释和文档,这点还是很赞的。Tertius其实也是一个功能极其强大的算法,它在关联规则中融入了决策树中“类”的观念,其实它更适合用来做股票规则的预测,因为它是明确了要关联的对象,我们不再需要在我们的预测结果中再做筛选。之前对关联规则了解不多,对这个算法的原理也不是很清楚。以后如果有机会,会写文章对上面的算法做具体的介绍。

回到操作上来,WEKA中Apriori算法会需要传一些参数进去,每个参数具体的意义其中都有注释,我们将numrules改成1000,将outputitemsets改成TRUE,将metrictype设置成confidence,minmetric设置成0.8,方面对结果做分析。于是得到结果。这样我们利用这些信息可以做成一个根据输入信息查询历史出现次数的软件。例如:KDJ中的K值在10-90,D值在20-80,J值在10-100的情况下,频繁项集包含了基本持平(223次),还有小幅下跌(76次)。这个信息告诉我们,在这支股的历史中,当KDJ指标指示为徘徊观望的值的时候,其实这支股票一般会跌或者持平,涨的可能性其实已经很小了。

我们的队长在挖掘的过程中提出对于股票之间的涨跌关联的挖掘。首先讨论用什么样的算法可以做这样的挖掘,我们提取出从1990年开市以来每支股票每日的涨跌幅作为数据集进行挖掘,这样一来规模就稍显有些大了。用关联规则的APRIORI算法吃不消,其他的关联规则算法我不熟悉,所以没办法用。我尝试了用BP神经网络来做,不过我把JVM的运行空间调到了1.5G,依然无法承受这个规模的数据,不过我觉得即使能用好一点的机器做了,意义并不大,因为BP神经网络本身是基于黑盒测试的技术,我们无法得知它是怎么预测到的最后的结果,虽然很多科学家在这方面做过努力,但是一直没有什么好的结果。所以我觉得这个技术并不适合用于做这样的预测。

分类算法中,决策树的C4.5算法是个很实用的算法,速度较神经网络来说要快很多,而且很容易从中提取规则,所以图形化比神经网络要容易得多。针对C4.5算法,我们制定的挖掘方法如下:

1、将数据处理成以日期为行,以股票编号为列的数据矩阵,矩阵中保存的是某日某支股票的涨跌幅,未上市的为?,上市了但是未开盘的为0。可以通过MYSQL C API来编程对MYSQL中的数据进行操纵。

2、因为用一个属性A作为CLASS,只能挖掘出与A相关的规则,所以我们需要轮流将每一个属性作为CLASS进行挖掘,然后再做汇总,汇总的方式等挖掘结果出来以后再做进一步的决定。由于C4.5算法的CLASS必须是分类型的数据,而且我们的每个属性都可能成为CLASS,所以我们需要把所有的数据都离散化,这个操作可以通过WEKA的过滤器来实现,之前处理数据都是自己编程或手动操作的,做麻烦了。

3、做了上述处理,C4.5依然是不能用的,因为存在大量的缺省值,必须编程把这些缺省值拿掉,抽象一下,可以得到这样的一个问题:把一个有数字和问号的矩阵,一次性可以消去一行或者一列数据,要求消去最小的单元格,使矩阵成为满矩阵。满矩阵是我自己起的名字,即不存在问号的矩阵,换句话说,就是满足C4.5输入的矩阵。

4、调用WEKA中的J48算法来做挖掘,这是一个C4.5的优化版本,足够用于这个数据集的挖掘。

具体的挖掘结果还没有出来,不过我相信能取得一些成果,决策树方面的应用就讲到这里,等挖掘的成果出了,我再写文章进行新的分析。

接下来是关于BP神经网络的,但是我已经受够了被欺骗的感觉,得先发几句牢骚。

那些发股票数据挖掘说什么BP神经网络,或者SVM在用XX方法挖掘效果非常明显,非常有效的本科生,硕士生,博士生,甚至教授们,你们这是在做学术么?我只是一个小小的做应用的人,都看不下去了,全TMD扯淡!!好吧,我现在来分析下相关论文介绍,论文的风格都大同小异,无非是先把算法拿出来分析一遍,再讲讲神经元的训练过程,相关参数的调整,弄得大张旗鼓,很高科技似地。好了,最后,取XX年XX月到XX年XX月的几十天为训练集,接下来几十天甚至是几天为测试集,得到一个很小的(30%或者更小)绝对误差,然后就说明BP神经网络在股票数据挖掘都是非常有效的。稍微有点良心的,最后补充一句,这个预测是在股市相对稳定的时候有效的。相对稳定的时候还用得着你去预测吗?最关键的是,为什么要以点代面?明明BP神经网络在那种建模上是无法做出准确预测的,为了发个论文,就玩这种文字游戏,你有意思?学术是需要严谨的!不是找个碰巧误差小的(甚至是专门找个误差最小的)就能得到这样荒谬的结论!我说了这么多,就是想表达一句话,建立在每日数据上的BP神经网络(不管你算法多么优)是无法预测A股股票涨跌的。

读者会问,你说别人不严谨,那么我凭什么来相信你说的话呢?我把我的挖掘过程展现出来作为分享,大家自己做参考。我用的数据集是从1990年开市到2010年10月15日的每日数据,包括开盘价,收盘价,最高价,最低价,成交量,成交金额,涨跌幅。先把每只股票拆分到一个数据集,然后处理成依靠前3天的信息(21个属性),预测第四天,这样增加了关联的可能性(有些论文就那么一两个属性值,也能做预测?实在是荒谬)。接下来做了归一化处理,把属性值和预测值都控制在了0-1之间,然后做分散数据处理,把涨跌幅划分成40个区域,时间上从前往后取,每个区域取5个点,作为训练集,从后往前取,每个区域5个点,作为测试集,这样从数据方面保证神经网络达到最好的效果。然后调整学习率到0.03,动量为0.1(这个值在WEKA中用于加速神经网络收敛,原理是在每次迭代的时候加上上次更新权值的一部分),不做提前结束和权衰减(这两个方法用来处理过度拟合,不过学习率够低,过度拟合并不严重,所以不用做处理),训练10万次,就能把训练集上的平均绝对误差降低到10%以下。我很兴奋地把训练好的神经网络拿去跑,随意一支股票,平均绝对误差200%多,换一支,150%,再换一支,300%!这样的实验结果足以说明问题,光从盘口信息上来看,是绝对无法较为准确的预测A股股票涨跌的。不过这也至少证明了一点,从数据挖掘角度上来讲,盘口信息在A股是没有任何参考价值的。

那么是不是说这个事情到此为止了呢?我觉得还有希望,首先我们选取的A股,受公司内部人为操作太多,所以我认为可以加入公司本身的经营状况信息,用神经网络做出来的东西会更准确,但是公司内部的一些数据是弄不到的,所以这个方案只能搁浅。另外只能考虑换数据集,做中国香港或者国外的股票,这样受人力的影响会小一些,但是现在科创的时间只剩半年了,从头再来,知道会怎么样?很希望能想到好的方法来解决这个问题。总之,我会努力!

最近做了一些小项目,事情比较多,数据挖掘的进度慢了下来,一是因为技术上遇到了一些瓶颈,需要我们解决;二是因为我在想办法提高我们数据挖掘的质量,神经网络上遇到的麻烦一直困扰着我。最近我们的工作需要写一些总结去参加学校的一个论坛,虽然我不觉得有什么意义,但是可以作为一个整理思绪的理由,加上一些朋友也在关注着我们,于是我决定继续写下去。这一篇不会涉及太多的技术问题,更多的是工程问题,也就是我们在实际操作过程中的麻烦事,我会从头开始讲起,写出来给大家分享。从下一篇开始,我会开始写写算法,我会尽量还是以股票为实例,不做太多抽象。 1.数据预处理的选择。 在拿到数据的时候,我们得到的是TXT,花了些钱网上买的,我先把数据导入到了数据库里,这时有一个选择问题,是把数据留在数据库里做预处理,还是提取出来在外面做。我们可以预想对数据的一些操作,离散化,归一化,计算指标等等,前者应该更为专业一些,但是我们查看指标的各种公式发现如果我们涉及的指标计算量十分的大,有些极其复杂,如果在数据库里操作也许会遇到很多SQL不好写。但是如果在数据库外面操作,编程量会提高几倍,另外有一个数据量的问题,200多万行数据,低版本的EXCEL是装不下的,还好EXCEL2007最多可以支持104万行左右,把原表分成3份可以解决。最后我们选择了在外面处理,看上去像是绕了弯子,但是实际上风险是相对小一些的,因为对于计算一个指标的数据,在数据库外面编程的灵活性显然是要比用SQL语句操作要大的。至于为什么要计算指标,因为指标的完整数据是买不到的,至少我没找到买的地方,于是我们自己动手算,这也是被逼的。 2.预处理程序。 BM同学为我们写了决策树以及神经网络的预处理程序,它的整个过程在之前的文章已经写过,这里就不再重复了,写得很不错,贴上代码分享一下。需要注意的是,BM同学要求读入数据要为TXT格式的,他好用C语言读,于是我在这之前使用JAVA的POI扩展包把数据给整理成了TXT格式,后来我们一切对EXCEL的操作都是用POI做的。对于输出的格式,是WEKA的ARFF格式,其实就是TXT的前面加了一些声明。

3.指标计算。 指标计算的工作量非常大,由于在EXCEL中编程操作,需要编写各种不同的程序来处理不同的指标。有一个比较郁闷的地方,在于数据处理完导出的时候,需要把XLS格式转化为CSV格式,如果我们手动,自然是很简单,不过文件太多,要编程做,POI也没有这个功能。后来我们聪明的ZYN和CXF两位女同志在网上找到了一个开源的小项目,叫OPENCSV(看清楚哦,不是大名鼎鼎的OPENCV,也不是做版本管理的OPENCVS),这个项目开发的包可以实现我们想要的功能,但是悲剧就悲剧在这里,生成的CSV文件从表面看上去没问题,但是WEKA无法识别,后面我们查错觉得可能是OPENCSV这个项目本身的BUG,我们也没有多余的时间去查看项目的源码,所以最后还是换了一种方式:直接把XLS转换为ARFF格式。 4.关于决策树生成的规则。 决策时生成的规则是很难看的,我们做技术的也许会看得比较明白,但是用户肯定是不懂的,所以完善规则的可读性我们做了一些工作。每支股票我们选出了几十到几百个可供索引的规则,加在一起应该有近万条,在WEKA中跑出来的规则形式如下: 600036 = '(8.5355-inf)': '(8.0135-inf)' (6.0/1.0) (这是600000号股票的规则之一) 这个规则的意思是当600036这支股票涨幅是在8.5355到涨停(或者更高,因为最早是没有涨停限制的)时,600000号股票是8.0135到涨停这个涨幅,这样的情况历史上发生了6次,但是有一次是被错误分类的。(如果不明白什么叫错误分类,可以去看看决策树的C4.5算法)换个容易理解的说法,即这条信息的可信度为6分之5。对于怎样处理规则会让用户觉得友好,我们觉得这是对我们的一大挑战。 5.关于神经网络。 我实在不想说太多,因为我们的神经网络做得真的够糟,用户至少需要输入20几个浮点数才能进行一次预测,这实在很考验人的耐心,但是我们也很无奈,手里的信息实在有限,输入的麻烦没办法解决,而且神经网络出的结果平均误差也是较大的。(涨跌幅相差2%-3%,但是请注意,这是一个平均值,所以我对此并不乐观)对于预测的结果到底如何,那真的只有看人品了,我们的方法最多只能给个大概的变化方向参考。还好我对于我们的其他两部分较乐观,否则我会考虑放弃这个项目。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档