介绍一下股票相似性分析的处理
我们对股票进行分类的主要依据是股票收盘价曲线的相似性。
首先要注意一点就是计算距离时股票数据都要进行标准化处理,因为我们要比较的是趋势,而不是价格本身,否则有些股票股价很高,而有些又很低,它们可能有相似的形状,却不被分为同一类。
我主要采用了K-Means聚类算法作为基本的框架。
为了贴合预测股票曲线的需求,更改了距离函数。不再简单的用欧几里得距离去求两条曲线的距离。
首先考虑曲线实际就是点的集合,考虑计算两个集合之间的距离,了解到了Hausdorff Distance。
Hausdorff Distance是一种衡量两个集合之间距离的算法,公式如下:
公式还是挺好理解的,最短距离中的最大值。
比如,A集合到B集合的最短距离就是先求出A中每个点到B中每个点的距离的最小值,然后在所有最小值中求最大值,作为A集合到B集合的最短距离。
显然,该距离是有方向的,A到B的豪斯多夫距离不等于B到A的豪斯多夫距离,解决办法是取较大值。蓝色的半径就是两个三角形的豪斯多夫距离。
下图为K-Means用豪斯多夫距离实现的某一类的结果:
并不是很理想,可能也和训练时间并不长有关。
我们后来又了解到了专门计算两条曲线之间距离的Fréchet distance ,公式如下:
挺难懂的看公式,而且后面还有一大堆数学计算,不人性化。但是我从网上找到了一句话,和一个非常形象的比喻,靠这个就可以实现这个距离算法了。
直观的理解,Fréchet distance就是狗绳距离:主人走路径A,狗走路径B,各自走完这两条路径过程中所需要的最短狗绳长度。
路径相似性描述:Fréchet distance - 知乎 (zhihu.com)
数学公式看起来很繁琐,上图中一句话就非常好,最短狗绳长度,突然就典型了,典型的序列型动态规划。定义F[i,j] 为序列A到i,B到j的最短狗绳距离,转移方程为:
F[i,j] = max(min(F[i-1, j-1], F[i-1, j], F[i, j-1]), dis[A[i], B[j]])
初始状态F[0,0] = dis[A[0], B[0]]
处理好i=0和j=0的时候的边界就行。
python运行是真慢啊
运行结果:
显然比上面豪斯多夫距离表现的好。