余弦相似度在股票数据的应用
创作时间:
作者:
@小白创作中心
余弦相似度在股票数据的应用
引用
CSDN
1.
https://blog.csdn.net/weixin_74177409/article/details/140818582
余弦相似度的定义
余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
余弦相似度给出的相似性范围从-1到1: -1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。
余弦相似度的作用
余弦相似度的作用分析
1.相似性比较:
在大多数情况下,较高的余弦相似度通常表示两个向量(或数据集)之间的方向更为相似。例如,在股票市场中,两个时间段内收盘价格的高余弦相似度可能表明这两段时间内市场趋势较为一致,这在某些情况下可以被视为市场行为的一种一致性指标。
2.特定情况下的考虑:
但并不是所有情况下高余弦相似度都意味着良好的结果。例如,在某些技术分析或者模型评估中,如果期望模型具有一定的泛化能力和预测能力,过高的余弦相似度可能表明模型过度拟合了历史数据,而在未来的波动中可能不具备预测能力。
3.应用场景的多样性:
在实际应用中,余弦相似度的评估通常需要结合具体的背景和分析目的。例如,对于投资组合管理者来说,不同资产之间的余弦相似度可以帮助他们确定哪些资产具有相似的市场表现,但并不意味着他们总是希望投资于表现完全相似的资产。
我们以收盘价(rc)前二十行数据为例,求两只股票的的余弦相似度
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
path1,path2 = "000001.XSHE.csv","000063.XSHE.csv",
feature = "rclose"
length = 20
#指定收盘价那一列前20行的数据
rc1,rc2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length]
#余弦相似度:它们的余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
#np.dot()点乘
cosine = np.dot(rc1, rc2) / (np.linalg.norm(rc1) * (np.linalg.norm(rc2)))
print(cosine)
扩展应用
我们现在要求两只股票开盘价,收盘价,最高价,最低价,股票总成交量的余弦相似度。
我们同样还是取前二十行数据,首先进行数据的归一化(将数据变成从0到1)
#取出一个文件的数据
data1 = pd.read_csv(path1)
data2 = pd.read_csv(path2)
#从open列到volume列用loc
data1_selected = data1.loc[:,"open":"volume"][:length]
data2_selected = data2.loc[:,"open":"volume"][:length]
# 假设 data1_selected 是你之前选择的包含 "open" 到 "volume" 列的数据框
# 你可以先提取这些数值列
numeric_columns = data1_selected.columns
numeric_columns_2 = data2_selected.columns
# 初始化 MinMaxScaler
scaler = MinMaxScaler()
# 对数值列进行归一化
data1_normalized = data1_selected.copy()
data1_normalized[numeric_columns] = scaler.fit_transform(data1_selected[numeric_columns])
data2_normalized = data2_selected.copy()
data2_normalized[numeric_columns] = scaler.fit_transform(data2_selected[numeric_columns_2])
# 输出归一化后的数据框
print(data1_normalized)
print(data2_normalized)
然后计算二者的余弦相似度
# 假设 data1_selected 和 data2_selected 是有效的 DataFrame 数据
# name 列表包含了每个数据列的名称
name_1 = []
for i in data1["trade_date"][:length]:
name_1.append(i)
name_2 = []
for i in data2["trade_date"][:length]:
name_2.append(i)
# 计算余弦相似度
similarity_matrix = cosine_similarity(data1_normalized,data2_normalized)
print(similarity_matrix)
最后我们使用seaborn来绘制图片
# 使用 seaborn 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(similarity_matrix, annot=True, cmap='YlGnBu', fmt='.2f',
xticklabels=name_2, yticklabels=name_1)
plt.title('Cosine Similarity between data1 and data2')
plt.xlabel('data2')
plt.ylabel('data1')
plt.show()
最终得到结果
总代码
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
path1,path2 = "000001.XSHE.csv","000063.XSHE.csv",
feature = "rclose"
length = 20
#指定收盘价那一列前20行的数据
rc1,rc2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length]
#余弦相似度:它们的余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
#np.dot()点乘
cosine = np.dot(rc1, rc2) / (np.linalg.norm(rc1) * (np.linalg.norm(rc2)))

print(cosine)
#取出一个文件的数据
data1 = pd.read_csv(path1)
data2 = pd.read_csv(path2)
#从open列到volume列用loc
data1_selected = data1.loc[:,"open":"volume"][:length]
data2_selected = data2.loc[:,"open":"volume"][:length]
# 假设 data1_selected 是你之前选择的包含 "open" 到 "volume" 列的数据框
# 你可以先提取这些数值列
numeric_columns = data1_selected.columns
numeric_columns_2 = data2_selected.columns
# 初始化 MinMaxScaler
scaler = MinMaxScaler()
# 对数值列进行归一化
data1_normalized = data1_selected.copy()
data1_normalized[numeric_columns] = scaler.fit_transform(data1_selected[numeric_columns])
data2_normalized = data2_selected.copy()
data2_normalized[numeric_columns] = scaler.fit_transform(data2_selected[numeric_columns_2])
# 输出归一化后的数据框
print(data1_normalized)
print(data2_normalized)
# 假设 data1_selected 和 data2_selected 是有效的 DataFrame 数据
# name 列表包含了每个数据列的名称
name_1 = []
for i in data1["trade_date"][:length]:
name_1.append(i)
name_2 = []
for i in data2["trade_date"][:length]:
name_2.append(i)
# 计算余弦相似度
similarity_matrix = cosine_similarity(data1_normalized,data2_normalized)
print(similarity_matrix)
# 使用 seaborn 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(similarity_matrix, annot=True, cmap='YlGnBu', fmt='.2f',
xticklabels=name_2, yticklabels=name_1)
plt.title('Cosine Similarity between data1 and data2')
plt.xlabel('data2')
plt.ylabel('data1')
plt.show()
热门推荐
掌握这 9 个技巧,Excel 打印输出超完美
杜甫《登高》:七律之冠的写作背景与赏析
从钱某伪造公司印章案看企业刑事维权路径
企业如何制定有效的EHS管理体系标准?
运动时,我们该怎么补充碳水化合物?(上)
三聚磷酸钠是金属清洁剂的重要成分
电磁阀的用途(电控阀可以比喻成什么)
如何正确撰写和撤回再审申请书:法律实务指南
七色堇怎么种
如何准确判断大盘的高开低开情况?这种判断方法的可靠性如何?
减肥产品哪个效果最好最安全
前线 | 潜龙入海:中国海军各型潜艇大盘点
项目管理招标如何评分
塔吊事故审判:法律适用与责任认定
初识优先级队列:以Go语言为例
精确诊断助力实现肺癌精准治疗
《傲慢与偏见》经典语录
雷尼替丁副作用全解析
如何找到适合车辆的机滤并进行更换?这种更换操作对发动机保护有何意义?
干咳无痰伴胸闷气短怎么办?可能病因及应对方法全解析
手动挡汽车挂档的原理图
茅台发力合成生物学:传统酿造与未来科技的融合
厦门一医院纯中药治疗癌症,成功控制肿瘤,有机会被广泛应用吗?
卡拉胶:从海藻中提取的神奇胶体
如何有效收集索赔证据:法律实务指南
银屑病潜在新兴疗法:多肽药物能否开辟“第三战场”?
如何选择性价比高的住宅?性价比评估的标准是什么?
深圳住宿推荐 | 22家精选酒店及5大住宿区域指南
《围城》中的三闾式相亲:一场充满特色的校园婚姻游戏
预防癌症要趁早,不要忽视身体早期发出的信号!及时筛查与诊断!