引言

股票市场的波动往往存在一定的共振,尤其是同一个行业或主题概念的公司股票,当面临行业基本面的冲击时,其波动存在一定的相似性,即表现出同涨同跌。如果能通过交易行情数据对股票市场的波动结构进行刻画,对于我们深入理解板块轮动和网络关联性具有重要的启示作用。那么如何借助可视化的手段对股票市场结构进行分析呢?机器学习中的无监督学习算法或许可以帮助我们解决这一问题。本文以上证50指数成分股为例,使用稀疏逆协方差(GraphicalLassoCV)计算股票之间的条件相关性,然后使用聚类分析将行为相似的股票分组在一起并进行可视化。

数据获取

使用tushare pro获取上证50指数成分股收盘价和开盘价数据,以收盘价减去开盘价作为日波动的替代变量。以下代码使用Jupyter notebook运行。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn import cluster, covariance, manifold
%matplotlib inline #Jupyter Notebook显示图形专用
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
import tushare as ts
token='到tushare pro官网获取你的token'
pro=ts.pro_api(token)
#获取上证50成分股票代码和名称
def get_50_code():#获取上证50成分股代码dd=pro.index_weight(index_code='000016.SH')dd=dd[dd.trade_date=='20201130']codes50=dd.con_code.values#获取全市场股票基本信息df = pro.stock_basic(exchange='', list_status='L')df=df[df.ts_code.isin(codes50)]codes=df.ts_code.valuesnames=df.name.valuesstocks=dict(zip(codes,names))return stocksdef get_data(code,start='20191210',end='20201210'):df=ts.pro_bar(ts_code=code,adj='qfq', start_date=start, end_date=end)df.index=pd.to_datetime(df.trade_date)df=df.sort_index()return dfcodes, names = np.array(sorted(get_50_code().items())).T
data=pd.DataFrame({name:(get_data(code).close-get_data(code).open) for code,name in zip(codes,names)})
variation=data.dropna().values
data.head()

上证50成分股股价日变动情况:

聚类分析

由于相互关联的股票会在交易中产生共波动,所以我们可以使用无监督学习算法从历史报价中提取股票市场结构的变化,如使用(收盘价-开盘价)来刻画股价每日价格变动,然后使用稀疏逆协方差估计找出哪些股票存在条件相关性。换句话说,稀疏逆协方差可以得到一个方差关联性列表,对于每只股票来说,与之相关的股票有助于解释其波动。然后再使用聚类分析将行为相似的股票分组在一起。scikit-learn提供了十种不同的聚类算法,本文用“Affinity_propagation”(AP算法),主要基于该算法可以从数据中自动选择聚类的数量。AP算法的基本思想是将全部样本看作网络的节点,然后通过网络中各条边的消息传递计算出各样本的聚类中心,关于该算法的详细原理可参考scikit-learn官网或相关书籍。

# 相关系数
edge_model = covariance.GraphicalLassoCV()
X = variation.copy()
X /= X.std(axis=0)
edge_model.fit(X)
_, labels = cluster.affinity_propagation(edge_model.covariance_)
n_labels = labels.max()for i in range(n_labels + 1):print('Cluster %i: %s' % ((i + 1), ', '.join(names[labels == i])))
#输出结果:
Cluster 1: 万华化学
Cluster 2: 恒瑞医药, 贵州茅台, 伊利股份
Cluster 3: 山东黄金
Cluster 4: 三安光电, 闻泰科技, 汇顶科技
Cluster 5: 浦发银行, 民生银行, 中国石化, 招商银行, 兴业银行, 农业银行, 中国平安, 交通银行, 工商银行, 邮储银行, 光大银行, 中国石油, 中国银行
Cluster 6: 三一重工, 保利地产, 海螺水泥, 中国神华, 中国铁建, 中国建筑
Cluster 7: 上海机场, 中信证券, 中国联通, 上汽集团, 海尔智家, 海通证券, 中信建投, 工业富联, 国泰君安, 红塔证券, 中国人保, 新华保险, 中国太保, 中国人寿, 华泰证券, 中国中免, 中国重工, 洛阳钼业
Cluster 8: 京沪高铁
Cluster 9: 复星医药, 用友网络, 隆基股份, 药明康德
数据可视化为了将上述聚类分析进行可视化,需要在一个2D画布上布置不同的股票。为此,需要使用“流形”技术来检索二维嵌入。模型的输出组合成一个二维图,其中节点代表股票名称,边表示:
集群标签用于定义节点的颜色使用稀疏协方差模型来显示边缘的强度二维嵌入用于在平面中定位节点
node_position_model = manifold.LocallyLinearEmbedding(n_components=2, eigen_solver='dense', n_neighbors=6)embedding = node_position_model.fit_transform(X.T).T
# 可视化
plt.figure(1, facecolor='w', figsize=(10, 8))
plt.clf()
ax = plt.axes([0., 0., 1., 1.])
plt.axis('off')# 计算偏相关系数
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)# 使用嵌入的坐标绘制节点
plt.scatter(embedding[0], embedding[1], s=100 * d ** 2, c=labels,cmap=plt.cm.nipy_spectral)# 画相互关联的边
start_idx, end_idx = np.where(non_zero)
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, .7 * values.max()))
lc.set_array(values)
lc.set_linewidths(15 * values)
ax.add_collection(lc)#向每个节点添加一个标签,难点在于定位标签,以避免与其他标签重叠
for index, (name, label, (x, y)) in enumerate(zip(names, labels, embedding.T)):dx = x - embedding[0]dx[index] = 1dy = y - embedding[1]dy[index] = 1this_dx = dx[np.argmin(np.abs(dy))]this_dy = dy[np.argmin(np.abs(dx))]if this_dx > 0:horizontalalignment = 'left'x = x + .002else:horizontalalignment = 'right'x = x - .002if this_dy > 0:verticalalignment = 'bottom'y = y + .002else:verticalalignment = 'top'y = y - .002plt.text(x, y, name, size=10,horizontalalignment=horizontalalignment,verticalalignment=verticalalignment,bbox=dict(facecolor='w',edgecolor=plt.cm.nipy_spectral(label / float(n_labels)),alpha=.6))plt.xlim(embedding[0].min() - .15 * embedding[0].ptp(),embedding[0].max() + .10 * embedding[0].ptp(),)
plt.ylim(embedding[1].min() - .03 * embedding[1].ptp(),embedding[1].max() + .03 * embedding[1].ptp())plt.show()

图表反映了变量之间的条件关系,而聚类反映了边际属性:聚在一起的变量可以被认为在整个股票市场水平上具有类似的影响。从下图中可以看出,无监督学习通过对交易报价信息的提取,可以大致勾勒出上证50指数成分股的一个市场结构,具有相同行业属性或概念属性的个股其波动表现出相似性,如医药、银行、券商、保险、大基建等。

结语

机器学习是量化分析的一个重要工具,掌握机器学习算法的基本原理和应用场景可以为我们分析和研究金融市场提供一个参考框架。无监督机器学习中的聚类分析能够从纷繁复杂的数据中提取有用信息,刻画多维特征的“相似性”和“关联性”,再借助网络分析的视角,可以进一步考察数据变量间的微观结构和运动状态。本文参考scikit-learn官方网站示例,对上证50指数成分股的“共波动”结构进行了可视化分析,为大家深入学习机器学习抛砖引玉。关于网络分析方面,Python有个很好用的第三方库——networkx,可以画出各种精美的网络分析图,感兴趣的读者可以进一步了解。

参考资料:

scikit-learn官方网站案例:

https://scikit-learn.org

/stable/auto_examples/applications/plot_stock_market.html?highlight=plot%20stock%20market

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

机器学习刻画股票市场结构和可视化——以上证50成分股为例相关推荐

  1. 上证50成分股聚类可视化

    上证50成分股聚类可视化 参考:sklearn中的股票可视化例子 Visualizing the stock market structure 数据来源:tushare 到网站 https://tus ...

  2. python画资本市场线_【投资组合理论】Python绘制上证50成分股有效前沿和CML

    马科维茨有效前沿是经典的资产配置模型,对于给定收益率,有效前沿上的投资组合风险最小. 初学时,感觉绘制有效前沿是个极其有难度的事情,基本不可能完成.后来学了Python的一些数值计算方法,才感觉用程序 ...

  3. 上证50成分股聚类分析

       使用tushare我们可以获取上证50成分股历史数据,使用covariance对其历史数据进行聚类分析,我们可以得到其相关强度,对此,在其相关股价显著变化的时候,我们就可以根据其相关 ...

  4. SkLearn 对上证50成分股聚类

    1. 为什么要对股票进行聚类 1.1 投资组合优化理论 股票聚类的基本原因就是从股市中选取一部股票进行投资.哪怕是上证50对一般的投资模型来说50条股票也太多了. 按照投资组合优化理论选取标准为: ( ...

  5. 可视化股票市场结构||沪深300股票聚类可视化

    前半部分是Visulizing the stock maket structure文章翻译,对代码进行逐行解释,并在文后附录所有参考链接.后半部分是基于案例做的沪深300可视化 此案例采用了几种非监督 ...

  6. 漂亮,LSTM模型结构的可视化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就 ...

  7. 收藏 | LSTM模型结构的可视化

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:知乎  作者 | master苏 链接 | https:// ...

  8. lstm结构图_LSTM模型结构的可视化

    目录: 1.传统的BP网络和CNN网络 2.LSTM网络 3.LSTM的输入结构 4.pytorch中的LSTM 4.1 pytorch中定义的LSTM模型 4.2 喂给LSTM的数据格式 4.3 L ...

  9. 【计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩】 https://b23.tv/GLkWcjb

    [计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩] https://b23.tv/GLkWcjb https://b23.tv/GLkWcjb

  10. 【FDTD Lumerical sweep扫描参数数据提取及可视化【以S参数为例】】

    FDTD Lumerical sweep扫描参数数据提取及可视化[以S参数为例] 一.背景介绍 二.各重要脚本指令的含义 三.S参数扫描结果提取 本文以Lumerical官方提供的超透镜例程中的单元结 ...

最新文章

  1. Git超实用总结,再也不怕记忆力不好了
  2. 节能无线信标Ver0:功率测试
  3. python画出的雷达图效果-PYTHON绘制雷达图代码实例
  4. Python+Opencv识别两张相似图片
  5. 为什么机器学习算法要与人类水平比较
  6. 求一个容器的最值的索引_初中数学:一道几何好题,学会“胡不归问题”动点最值解题方法...
  7. 八、IO优化(3)稀疏列
  8. LINUX打印机报错:ipp error(1034, client-error-document-format-not-supported)
  9. 微信小程序中使用vue-star
  10. 第三代oid铺码软件_点读笔的原理
  11. 动态表情与超链接制作
  12. 作为ARM Cortex-M家族的继承者 Cortex-M23与M33有哪五大特色?
  13. 工程项目管理系统-----装修装饰行业的管理软件
  14. 笔记本过热、电脑cpu过热、限制CPU运行功率上限,轻松设置解决过热
  15. 小米路由器同一wifi局域网下,各主机无法ping连
  16. 资本寒冬融资难,具备这四大特质的创业者更受青睐
  17. 数模学校道路整修_如何在您的浴室或厨房重新整修区域
  18. Retrofit 上传文件
  19. 通信系统通信过程仿真(联合信源信道编码)
  20. 怎么下载电脑自带的office版本

热门文章

  1. cad插入块_CAD中创建块,有一种最快捷的方式,看看你用过没?
  2. 51单片机最小系统及晶振电容的选择
  3. 脉冲定理和人性惯性定律,我想这段时间我处于波峰状态。
  4. 【UCSC Genome Browser】Genes and Gene Predictions - GENCODE
  5. 电路交换、报文交换、分组交换
  6. DVR NVR CVR有什么区别
  7. BAT病毒-让电脑快速蓝屏
  8. python area函数,python3 函数
  9. 计算机复制方法有,如何在电脑上复制粘贴文字(包括快捷键),来学习吧
  10. java功能模块_系统功能模块详解 java应该学习什么?