余弦相似度在股票数据的应用
创作时间:
作者:
@小白创作中心
余弦相似度在股票数据的应用
引用
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()
热门推荐
附停止条件的遗嘱
平准基金的运作机制是什么?平准基金对市场有哪些影响?
win11定时息屏设置方法是什么?如何开启自动息屏功能?
剃须膏软化胡须(剃须膏软化胡须有用吗)
车载冰箱有用吗?实用性全面解析
从骑马入江到全网送马——湖北日报“白龙”马系列报道全媒体传推侠义精神
法律关系本座说的核心内容与实践应用探析
红宝石的保养和清洁指南
白发危机!揭秘年轻人早生白发的真相:遗传、压力还是生活方式?
阴虚火旺怎么调理,全面解析与实用建议
如何在市场波动中制定有效的黄金ETF投资策略?这些策略如何影响投资回报?
基于火力发电厂锅炉检修与维护措施研究
5G五年发展回顾:从连接到赋能的跨越
2024年中国5G产业发展状况与用户调研数据
如何挑选一台适合自己的路由器?记住这几点就够了!
如何忠实呈现图像?后期制作中HDR调色的关键
垄断已不存在,马斯克心中“无可替代”的星链地位,被中国“千帆星座”打破
“交通一体化”正在重塑地理意义上的京津冀,跨省通勤成为新日常
手机卡成了隐私“泄密卡”?
科普书单|昆虫的艺术
八字算命入门:如何快速掌握基础理论
亲子阅读:提升宝宝的认知能力
模型验证实操:如何将实验数据与Ansys模拟结果对比
仰卧起坐, 你做对了吗?
如何写出精彩的读书心得:分享与思考的过程指南
日本湘南之旅:从文化与风景的双重结合,浅析镰仓与文学的关联
淘宝如何进行仲裁申诉:流程、法律依据与实务操作
孕妇需要做哪些必要的医学检查?
打造高效客服团队:积极性调动的实践方法
学会跟医生说话,你的孕期和分娩满意度会高一些