余弦向量相似性和SIFT算法在股票相似性中的使用(1)

最近,我在做关于股票相似性的东西。就是对于不同股票或者同一股票在不同时间段内的走势的相似判断。取个例子:

下图为原股票的K线图(使用JFREEChart生成)

余弦向量相似性和SIFT算法在股票相似性中的使用(1)_第1张图片

然后在我们的K线图集中选出最相似的几个K线图。

        这个问题可以化为图片的相似性问题。然后我就去搜索图片相似算法的算法,找到了几个,比如PHASh,直方图,SIFT等。PHASH和直方图过于简单,提取不到

有用的信息,最后就选用了出名的SIFT算法。

       必须说,SIFT算法的确是可靠的,效果比之前的好很多。但是也出现许多不理想的情况。由于图片相似性的算法是提取图片的特征来判定相似,这和我们人判定的相似

有所不同,我们判定股票的相似更多倾向于走势,走势才是我们关心的重点。可惜SIFT不关心,这就造成了,一些我们认为更加相似的股票图片反而排名靠后。一开始想着换算法的,可是SIFT的算法效果并不差,是能够找出前十几的相似的股票,只是在排名上出现问题。再说了,比SIFT更有效的算法也没几个。所以,我就打算找另一个不同类型的算法,从股票数据入手,专门从趋势入手,然后给这两种算法配上不同的权重来达到好的效果。

本来是打算用DTW的,可是对于现阶段我的探索,每个图片其实只是只有10个点,用DTW感觉大材小用了。后来,我找到了余弦向量相似算法,这个算法的思想是

对于两个向量的相似性使用这两个向量之间的夹角的cos值来判定。这个向量可以很好的描述我的股票数据,因为我的股票数据有开盘价,收盘价,最高和最低价格。对应于向量而言就是一支股票向量一个点有四个分量,四种属性。接着就是如何组织向量的问题了,有很多中组合方式。

        我使用的第一种是将每个点作为一个向量,这样一张图片就是由每一个点向量组成,每张图片的数据就由10个向量来描述,然后将另一张图片的十个向量,第一个对第一个,第二对第二,由此推下去。算出每组的相似度,最后再除以10。就得到了最后的相似性。可惜这样的组合方式得到的效果并不好,而且最后的相似度,每组目标股票和备选股票的相似度相差极小,最低的相似度都有0.96(共294支股票)。原因我猜测是这是求的是每一天目标股票和备选股票的每一天的相似度,然后再除以10。本来目标股票和备选股票的每一天的差异其实并算是特别大,最后除以10,极大的缩小了它们之间的差异。

第二种选择的是将每天的开盘价和收盘价的差值,最高最低的差值给组合成向量。就是每个股票图片分成两个向量描述,一个是每个股票图片的十个点的收盘价和开盘价之差,另一个是每个股票图片的十个点的最高和最低价之差。这样子得到的结果就有比较好的区分,每一名之间基本都会有0.05以上的差异。我又调整了权值,将开盘收盘之差的权值给调高了,这样使数值更加趋向于趋势。

       第二种的余弦向量的效果不错了,可以找到的确相似的图片了。接着,尴尬的事情发生了。在余弦向量相似结果的前十里面,SIFT的结果并没有占多少份额。我暂时也观测了将近十组数据,可以说,向量余弦稍微占优。但是全部数据有294组,才观测十组是没有什么代表性的。那就说明,对于不同的股票数据,两种算法有各自的优势,接下来我的工作就是去找出各自的优缺点,从而提高判定能力。

       对于使用CNN,我这里的想法是,我没有正确的结果,只能使用无监督学习,这个也需要我去探索如何使用。

你可能感兴趣的:(股票,算法,sift,余弦向量)