余弦相似度在股票数据的应用
创作时间:
作者:
@小白创作中心
余弦相似度在股票数据的应用
引用
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()
热门推荐
泡澡時深呼吸更放鬆:7 招正確泡澡、選對入浴劑,對身體有 6 大好處
镜子摆放的十大忌讳
以案释法:非法生产烟花爆竹!黄某庚、何某分别被判三年六个月、二年
最容易写的一个词牌是哪个?结合两首词,介绍这个词牌的写作技巧
激光胡子脱毛对身体会伤害
揭秘股市“洗盘”:庄家常用的三种操作手法
建筑公司外包分包合同的法律风险与防范
《我即军团替身幸存者》游戏特色与玩法全解析
郭艾伦训练时被队友戳伤眼部,责任应当如何判定?
16天前眼睛缝了40多针,郭艾伦今发声:不影响正常生活 还能打球
不破不立!韶关出大招
过敏性紫癜治疗需不需要用激素?专家详解关键用药时机
药学科普 | 形形色色的药物剂型你会吃吗?——缓控释制剂
它是羊膻味的“克星”,2斤肉放1克,肉嫩汤鲜没膻味,越嚼越香
银行的个人信用评分模型的优化与应用?
304/304L/304N/304LN不锈钢的区别
养肝护肝必备:五种对肝脏最有益的食物和水果
北票美食排行榜前十名
玻尿酸的功效与种类:揭秘肌肤保养中的热门成分
美国税收政策与中国税收政策解读:你需要知道的那些事
带你来看懂热固性树脂与热塑性树脂
基底细胞癌的五大警告标志及预防措施
小家电大市场!中企如何抢占非洲发展商机?
任务拆解的艺术:从复杂到简单的项目管理之道
大模型|“上下文长度”和“上下文窗口”不再傻傻分不清楚!
怎么判断眼睛是细菌还是病毒
低通滤波器、高通滤波器、带通滤波器的简单介绍
从“同根相争”到“资本归一”,百年同仁堂整合启幕?
八字命理空亡详解大全:揭秘命运之谜
小孩大便带血是什么原因