皮尔逊相关系数实现相似K线及其性能优化

本文介绍了如何使用皮尔逊相关系数计算相似K线,探讨了遍历计算、遍历计算优化、分治算法和动态规划算法,并通过JavaScript实现。针对金融投资,分析了相似K线的实战应用及其局限性,强调性能优化在全市场数据处理中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

皮尔逊相关系数实现相似K线及其性能优化

概念介绍

相似K线是验证“历史总会重演”的一个经典产品,目前许多炒股软件都开始陆陆续续提供相似K线功能。如下图是某产品的相似K线效果图:
这里写图片描述
投资者可以根据相似K线展示的结果来观察个股可能的未来走势,从而对投资起到一定的指导作用。
本文就将简要介绍如何实现相似K线的计算,并讨论实现过程中的一些难点细节。

计算及实现

相似K线的实现主要分为两大部分,第一部分是相似度匹配计算;第二部分是排名筛选。

相似度匹配

进行相似度匹配时我们使用“皮尔逊相关系数”(Pearson product-moment correlation coefficient)来进行相关度验证。详细的“皮尔逊相关系数”的推导及演算可从网上找到相关资料。本文我们直接使用结论公式:
P X , Y = ∑ X Y − ∑ X ∑ Y N ( ∑ X 2 − ( ∑ X ) 2 N ) ( ∑ Y 2 − ( ∑ Y ) 2 N ) P_{X,Y}=\frac{\sum{XY}-\frac{\sum{X}\sum{Y}}{N}}{\sqrt{(\sum{X^2}-\frac{(\sum{X})^2}{N})(\sum{Y^2}-\frac{(\sum{Y})^2}{N})}} PX,Y=(X2N(X)2)(Y

### 如何比较两条曲线相似性 #### 动态时间规整 (Dynamic Time Warping, DTW) 为了衡量两条不同长度的时间序列之间的相似度,可以采用动态时间规整(DTW)算法。该算法允许非线性的映射来匹配两个序列,并通过累积距离矩阵找到最优路径以最小化总成本。 对于给定的数据集 \(X\) 和 \(Y\), 其中每一个都是由一系列数值构成的一维数组: \[ X = \{x_1,x_2,...,x_N\} \\ Y=\{y_1,y_2,...,y_M\}\] 定义一个累加代价函数\(D(i,j)\),表示从起点到位置\((i,j)\)的最佳路径的成本,则有: \[ D(i,j)=d(x_i,y_j)+min[D(i−1,j),D(i,j−1),D(i−1,j−1)] \] 这里 \( d() \) 表示局部距离测量,通常取欧几里得距离或其他形式的距离测度[^1]。 最终得到的整体相似程度可以用最后一个元素 \(D(N,M)\) 来代表整个序列间的差异大小;越小意味着更接近。 ```python import numpy as np from fastdtw import fastdtw from scipy.spatial.distance import euclidean def dtw_distance(ts_a, ts_b): distance, path = fastdtw(ts_a, ts_b, dist=euclidean) return distance # Example usage with two time series arrays time_series_A = np.array([0, 1, 1, 2, 4, 2, 2, 4, 5]) time_series_B = np.array([0, 1, 2, 3, 4]) similarity_score = dtw_distance(time_series_A, time_series_B) print(f"The similarity score between the curves is {similarity_score}") ``` #### Fréchet Distance 方法 另一种用于评估两曲面间近似度的方法是Fréchet距离。这种方法考虑到了形状上的变化而不仅仅是点对点的距离。它描述了一个行走者沿着第一条轨迹移动的同时另一个沿第二条走动时两者之间可能达到的最大分离情况下的最小值。这使得其非常适合用来处理具有复杂形态结构的对象对比问题[^4]。 MATLAB 中提供了 `frechetdist` 函数可以直接调用来进行此类分析。Python 用户也可以利用第三方库如 `scipy.spatial.minkowski_distance` 或其他专门工具包实现相同功能。 #### 曲线相关系数计算 当涉及到金融领域内的资产价格变动趋势研究时,还可以借助统计学手段——皮尔逊(Pearson)积矩相关系数去量化关联强度。假设我们有两个波动数据序列 \( x_n \) 和 \( y_n \),那么它们之间的关系可通过以下公式得出: \[ r_{xy}= \frac{\sum^n_{k=1}(x_k-\bar{x})(y_k-\bar{y})}{\sqrt{\sum^n_{k=1}(x_k-\bar{x})^2}\cdot\sqrt{\sum^n_{k=1}(y_k-\bar{y})^2}} \] 其中 \(r_{xy}\in[-1,+1]\); 当绝对值趋近于1时表示高度正/负相关; 接近零则说明几乎没有联系[^3]。 ```python import pandas as pd dataframe = pd.DataFrame({'Curve A': [values_of_curve_A], 'Curve B': [values_of_curve_B]}) correlation_coefficient = dataframe['Curve A'].corr(dataframe['Curve B']) print(f"Pearson correlation coefficient: {correlation_coefficient:.4f}") ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

响尾大菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值