可视化上证50结构图

news2024/11/28 0:54:52

可视化上证50结构图

      • 缘由
      • 收集数据
        • 先获取50支成分股列表
        • 获取各成分股票K线数据
      • 数据处理
        • 找出来,再删除,然后重新下载数据
        • 最终获得每日报价的变化值
      • 图形结构处理
      • 聚类分析
        • 使用affinity_propagation(亲和传播)聚类
      • 嵌入二维平面空间
      • 可视化
      • 小结
        • 热力图

缘由

前些日子,看到sklearn 官网上一个事例,可视化的股市结构 ,由于萌发给咱沪深也整张图,经过一段时间的研究,现分享给大家。

收集数据

原文,是数据是来自2003年至2008年 data.nasdaq.com和alphavantage.co等API中获得。
本文的数据 采用 baostock 2020-至今天(2023-09-30)的交易数据(除权),选择上证50成分股。

import numpy as np
import pandas as pd
import baostock as bs
先获取50支成分股列表
# 登陆系统
lg = bs.login()
# 获取上证50成分股
rs = bs.query_sz50_stocks()
# 打印结果集
sz50_stocks = []
while (rs.error_code == '0') & rs.next():
    # 获取一条记录,将记录合并在一起
    sz50_stocks.append(rs.get_row_data())
result = pd.DataFrame(sz50_stocks, columns=rs.fields)
bs.logout()

df=result.iloc[:,1:3]
df1=df.set_index('code')
symbol_dict =df1.to_dict()['code_name']
symbols, names = np.array(sorted(symbol_dict.i

如下图
在这里插入图片描述

获取各成分股票K线数据
def get_kdata(code):
    rs = bs.query_history_k_data_plus(code,
        "date,open,close",
        start_date='2020-01-01', end_date='2023-09-30',
        frequency="d", adjustflag="3")
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    result = pd.DataFrame(data_list, columns=rs.fields)
    return result
bs.login()
quotes = []
# 
for symbol in symbols:
    #print(symbol)
    ddf=get_kdata(symbol)
    quotes.append(ddf)
bs.logout()

数据处理

由于这里有些股票数据个数不一致,导致后继执行出错,因此,将不一致的数据进行删除。

for i,quote in enumerate(quotes):
    if (len(quote)!=910):
        print(i,symbols[i],names[i],len(quote))

23 sh.600905 三峡能源 563
42 sh.601995 中金公司 711
49 sh.688599 天合光能 806

找出来,再删除,然后重新下载数据

那样的话,并非50支票,而是47支。

result.drop(labels=[23,42,49],inplace=True)
df=result.iloc[:,1:3]
df1=df.set_index('code')
symbol_dict =df1.to_dict()['code_name']
symbols, names = np.array(sorted(symbol_dict.items())).T
bs.login()
quotes = []
for symbol in symbols:
    ddf=get_kdata(symbol)
    quotes.append(ddf)
bs.logout()
最终获得每日报价的变化值
close_prices = np.vstack([q["close"].astype("float") for q in quotes])
open_prices = np.vstack([q["open"].astype("float") for q in quotes])

# 报价的每日变化是信息最多的地方
variation = close_prices - open_prices

图形结构处理

我们使用稀疏逆协方差估计来找出哪些引号与其他引号有条件地相关。具体来说,稀疏逆协方差给了我们一个图,这是一个连接列表。对于每个符号,它所连接的符号都是用来解释其波动的。

协方差矩阵的逆矩阵,通常称为精度矩阵(precision matrix),它与部分相关矩阵(partial correlation matrix)成正比。 它给出部分独立性关系。换句话说,如果两个特征在其他特征上有条件地独立, 则精度矩阵中的对应系数将为零。这就是为什么估计一个稀疏精度矩阵是有道理的: 通过从数据中学习独立关系,协方差矩阵的估计能更好处理。这被称为协方差选择。

在小样本的情况,即 n_samples 是数量级 n_features 或更小, 稀疏的逆协方差估计往往比收敛的协方差估计更好。 然而,在相反的情况下,或者对于非常相关的数据,它们可能在数值上不稳定。 此外,与收敛估算不同,稀疏估计器能够恢复非对角线结构 (off-diagonal structure)。

from sklearn import covariance

alphas = np.logspace(-1.5, 1, num=10)
edge_model = covariance.GraphicalLassoCV(alphas=alphas)

#标准化时间序列:使用相关性而不是协方差
#前者对结构恢复更有效
X = variation.copy().T
X /= X.std(axis=0)
edge_model.fit(X)

聚类分析

使用affinity_propagation(亲和传播)聚类

我们使用聚类将行为相似的引号分组在一起。在这里,在scikit-learn中可用的各种集群技术中,我们使用Affinity Propagation,因为它不强制执行相同大小的集群,并且它可以从数据中自动选择集群的数量。
请注意,这给了我们一个与图不同的指示,因为图反映了变量之间的条件关系,而聚类反映了边际性质:聚集在一起的变量可以被认为在整个股市水平上具有类似的影响。

Affinity Propagation是一种基于图论的聚类算法,旨在识别数据中的"exemplars"(代表点)和"clusters"(簇)。与K-Means等传统聚类算法不同,Affinity Propagation不需要事先指定聚类数目,也不需要随机初始化簇心,而是通过计算数据点之间的相似性得出最终的聚类结果。

Affinity Propagation算法的优点是不需要预先指定聚类数目,且能够处理非凸形状的簇。但是该算法的计算复杂度较高,需要大量的存储空间和计算资源,并且对于噪声点和离群点的处理能力较弱。

from sklearn import cluster

_, labels = cluster.affinity_propagation(edge_model.covariance_, random_state=0)
n_labels = labels.max()

for i in range(n_labels + 1):
    print(f"Cluster {i + 1}: {', '.join(names[labels == i])}")

Cluster 1: 中信证券, 上汽集团, 航发动力, 中信建投, 华泰证券
Cluster 2: 包钢股份, 北方稀土, 国电南瑞
Cluster 3: 三一重工, 万华化学, 恒力石化, 紫金矿业, 中远海控
Cluster 4: 通威股份, 隆基绿能, 长城汽车, 合盛硅业, 华友钴业
Cluster 5: 复星医药, 恒瑞医药, 片仔癀, 贵州茅台, 海尔智家, 山西汾酒, 伊利股份, 中国中免, 药明康德, 海天味业
Cluster 6: 中国神华, 陕西煤业, 中国石油
Cluster 7: 中国石化, 农业银行, 工商银行
Cluster 8: 招商银行, 兴业银行, 中国平安, 中国太保, 中国人寿
Cluster 9: 保利发展, 海螺水泥, 长江电力, 中国建筑, 中国电建
Cluster 10: 闻泰科技, 韦尔股份, 兆易创新

嵌入二维平面空间

为了出于可视化目的,我们需要在二维画布上显示不同的符号。为此,我们使用流形学习技术来检索2D嵌入。我们使用密集的本征分解器来实现再现性(arpack是用我们不控制的随机向量启动的)。此外,我们使用大量的邻居来捕捉大规模的结构。

#为可视化寻找低维嵌入:找到 最佳的二维平面位置(股票)

from sklearn import manifold

node_position_model = manifold.LocallyLinearEmbedding(
    n_components=2, eigen_solver="dense", n_neighbors=6
)
embedding = node_position_model.fit_transform(X.T).T

可视化

3种模型的输出组合成一个二维平面图,其中节点表示股票,边缘表示:

  • 集群标签用于定义节点的颜色
  • 使用稀疏协方差模型来显示边的强度(边的宽度)
  • 二维嵌入用于定位平面中的节点

这个示例包含大量与可视化相关的代码,因为可视化在这里对于显示图形至关重要。其中一个挑战是定位标签,使重叠最小化。为此,我们使用基于每个轴上最近邻居方向的启发式方法。

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 #有中文出现的情况,需要u'内容'

plt.figure(1, facecolor="w", figsize=(20, 16))
plt.clf()
ax = plt.axes([0.0, 0.0, 1.0, 1.0])
plt.axis("off")

# Plot the graph of partial correlations
partial_correlations = edge_model.precision_.copy()
d = 1 / np.sqrt(np.diag(partial_correlations))
partial_correlations *= d
partial_correlations *= d[:, np.newaxis]
non_zero = np.abs(np.triu(partial_correlations, k=1)) > 0.02

# Plot the nodes using the coordinates of our embedding
plt.scatter(
    embedding[0], embedding[1], s=100 * d**2, c=labels, cmap=plt.cm.nipy_spectral
);

# Plot the edges
start_idx, end_idx = np.where(non_zero)
# a sequence of (*line0*, *line1*, *line2*), where::
#            linen = (x0, y0), (x1, y1), ... (xm, ym)
segments = [
    [embedding[:, start], embedding[:, stop]] for start, stop in zip(start_idx, end_idx)
]
values = np.abs(partial_correlations[non_zero])
lc = LineCollection(
    segments, zorder=0, cmap=plt.cm.hot_r, norm=plt.Normalize(0, 0.7 * values.max())
)
lc.set_array(values)
lc.set_linewidths(15 * values)
ax.add_collection(lc)

# Add a label to each node. The challenge here is that we want to
# position the labels to avoid overlap with other labels
for index, (name, label, (x, y)) in enumerate(zip(names, labels, embedding.T)):

    dx = x - embedding[0]
    dx[index] = 1
    dy = y - embedding[1]
    dy[index] = 1
    this_dx = dx[np.argmin(np.abs(dy))]
    this_dy = dy[np.argmin(np.abs(dx))]
    if this_dx > 0:
        horizontalalignment = "left"
        x = x + 0.002
    else:
        horizontalalignment = "right"
        x = x - 0.002
    if this_dy > 0:
        verticalalignment = "bottom"
        y = y + 0.002
    else:
        verticalalignment = "top"
        y = y - 0.002
    plt.text(
        x,
        y,
        name,
        size=10,
        horizontalalignment=horizontalalignment,
        verticalalignment=verticalalignment,
        bbox=dict(
            facecolor="w",
            edgecolor=plt.cm.nipy_spectral(label / float(n_labels)),
            alpha=0.6,
        ),
    )

plt.xlim(
    embedding[0].min() - 0.15 * embedding[0].ptp(),
    embedding[0].max() + 0.10 * embedding[0].ptp(),
)
plt.ylim(
    embedding[1].min() - 0.03 * embedding[1].ptp(),
    embedding[1].max() + 0.03 * embedding[1].ptp(),
)

plt.show();

sz50

小结

从上图可以看出同类股票,并非分布在同一区域,距离的远近也反映了两两的相关性。
从一个侧面也反映了各股票之间的关系。如果有可能,将二维平面扩展成三维立体图,可能会更加直观。

热力图

基于相关性,本文引入了热力图来进一步可视化。

import seaborn as sns
fig = plt.figure(figsize= (15,10))
ax = fig.add_subplot(111)
sns.set()
ax = sns.heatmap(edge_model.covariance_)

heat
从上图可以看出,相关性绝大多数在0.2 左右,只有小数达到0.8以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel和图片如何互相转换?有何技巧?

一、将图片转为excel表格 首先,打开金鸣识别网站,点击“点击添加需转换的图片或PDF”按钮,添加待识别的图片或PDF文件。 添加完待识别的图片或PDF后,点击“提交识别”按钮,程序便开始识别。 识别完成后,系…

无效的 page.json [“window“] 页面.json配置了“window“: {“disableScroll“: true}

问题:启动小程序时报错 无效的 page.json ["window"] 页面 解决: app.json 全局配置才使用window对象,在单独的页面直接写disableScroll:true即可 //app.json中添加,window里面添加就可以了 "window": { …

儿童写作业用的护眼灯哪种好?双十一写作业护眼灯推荐

这些年大家对于身体健康越来越重视,尤其是关于儿童青少年的眼睛健康问题,因此作为学生们常用的护眼台灯也成为了非常多家长为孩子选择的学习台灯。而还没给孩子准备台灯的家长们也都想买上一盏台灯给孩子使用,但市面上的护眼台灯太多了&#…

【ElasticSearch】学习笔记

【ElasticSearch】学习笔记 【一】ElasticSearch是什么?【二】Mac安装ElasticSearch【三】Mac安装可视化界面Kibana 【一】ElasticSearch是什么? ElasticSearch是一个分布式、Restful风格的搜索和数据分析引擎,Stark的核心。 可以应用在比如…

XnViewMP forMac/Windows中文版:轻松管理和浏览您的图片库

您是否厌倦了使用不方便、功能有限的图片浏览软件?现在,让我向您介绍一款强大而全面的图片浏览软件——XnViewMP! XnViewMP是一款免费开源的跨平台图片浏览软件,它具有出色的功能和易用性,适用于个人用户和专业摄影师…

助力森林火情预警检测,基于YOLOv7-tiny、YOLOv7和YOLOv7x开发构建无人机航拍场景下的森林火情检测是别预警系统

火情的预警与检测识别对于保障林业安全,减少人员伤亡有着重要的意义,科学有效地早发现早扑灭是最有效的干预手段,本文的主要是想就是想要建立基于无人机航拍场景下的森林火情检测预警系统,整体效果如下所示: 这里文中选…

TikTok整合谷歌搜索功能,探索新的流量入口

随着社交媒体平台的不断崛起和发展,用户们的需求也在不断演变。如今,人们不仅仅是在社交媒体上分享自己的生活点滴,还希望从中获取更多有用的信息。 因此,社交媒体平台正积极寻找与搜索引擎的整合方式,以满足用户的多…

小程序开发平台源码系统+万能门店小程序功能+完整的搭建教程

大家好啊,今天来给大家分享一个小程序开发平台,这款平台源码系统中包含了万能门店小程序功能,一起来看看吧。 系统特色功能一览: 全端覆盖:独立版万能门店全端云小程序可以一键生成全端小程序,包括微信小程…

2023_Spark_实验十三:Spark RDD 求员工工资总额

一、主题:Spark RDD 求员工工资总额及排名 问题提出:近三年来,全球新冠疫情已经严重影响了现有经济情况,公司高层领导对公司运行情况进行深入了解,需要了解每个部门的人力成本,以至于更加合理的优化人力资…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归,你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数,它们被链接在一起形成一个网络…

vim基础命令批量替换

正常模式 v(小写)正常模式下面会出现VISUAL,可以可以选择指定连续区域可以随意选择,这个用的最多 ctrl v(小写) 这个可以类似于sublime这种按照固定前几个字符选择 最后一列哪个a其实已经选择了&#xf…

论文导读 | 八月下旬特征选择专题期刊精选

推文作者:丰于杭 编者按 在“八月下旬特征选择专题期刊精选”中,我们有主题、有针对性地选择了MSOM, Operations Research, Management Science等管理科学杂志中一些有趣的文章,不仅对文章的内容进行了概括与点评,而且也对文章的结…

c++视觉处理----图像模板匹配

模板匹配matchTemplate() matchTemplate() 是OpenCV中用于模板匹配的函数之一。它的主要作用是在一幅图像中搜索模板图像的位置,即找到模板在图像中的匹配位置。 函数原型如下: void cv::matchTemplate(InputArray image,InputArray templ,OutputArra…

生物信息学研究方向

一、生信的两个大类研究方向: 目录 一、生信的两个大类研究方向: 前者偏理论,后者偏向证明 第一类研究方向: 第二类研究方向: 二、具体的研究方向 1、序列分析 2、计算进化生物学 3、生物多样性的度量 4、蛋…

云原生与服务网格

云原生与服务网格 目录 文章来源 【优点知识】 istio课程大纲: https://youdianzhishi.com/web/course/1047 1、云原生技术范畴解读 什么是云原生 2大架构特征:不可变基础设施,声明式API CNCF 云原生整体视图 provisioning 供应 compli…

摩尔信使MThings数据配置参数详述

摩尔信使MThings支持丰富的数据配置方法,以适配一定程度的非标Modbus场景。 针对标准Modbus数据协议,用户仅需修改少量的配置,如寄存器地址、数量,其他参数默认即可。 同时为了便于用户全面了解配置参数,文中详述了每…

我献出这篇 go 精华总结,阁下该如何应对

文章目录 1.初识包管理2.输出3.注释4.初识数据类型5.变量5.1 声明变量的意义?5.2 变量名要求5.3 变量简写5.4 作用域5.5 赋值及内存相关注意事项 阶段练习题6.常量6.1 因式分解6.2 全局6.3 iota 7.输入8.条件语句8.1 最基本8.2 多条件判断8.3 嵌套 9. 荐书 《Go编程…

什么是Token?一文带你深入理解Token

Token在各种技术领域和应用场景中都扮演着重要的角色,它的含义和用途也是非常广泛的。下面我将从不同角度对Token进行深入解析,带你全面了解Token的含义、用途和重要性。 一、计算机科学和网络安全 在计算机科学和网络安全领域,Token通常指的…

400电话-申请400电话-400电话如何申请-400电话申请指南:简单步骤助您顺利获得400电话

引言: 随着企业竞争日益激烈,提供优质客户服务和建立品牌形象变得至关重要。而拥有一个易记且专业的400电话,不仅能提升企业形象,还能为客户提供便利与信任。本文将为您介绍如何申请400电话,帮助您顺利获得专属电话号码…