2.1.4-相关性分析

news2024/11/26 2:55:17

跳转到根目录:知行合一:投资篇

已完成:
1、投资&技术
  1.1.1 投资-编程基础-numpy
  1.1.2 投资-编程基础-pandas
  1.2 金融数据处理
  1.3 金融数据可视化
2、投资方法论
  2.1.1 预期年化收益率
  2.1.2 一个关于y=ax+b的故事
  2.1.3-数据标准化
  2.1.4-相关性分析
3、投资实证
  [3.1 2023这一年] 被鸽

文章目录

  • 1. 致敬E大、有知有行
  • 2. seaborn热力图
    • 2.1. 一月效应
    • 2.2. 各资产相关性
    • 2.3. 相关性结论
    • 2.4. 结果验证
      • 2.4.1. 黄金和新能源
      • 2.4.2. 黄金和房地产
      • 2.4.3. 沪深300和中证500
  • 3. 结论

很多人因为缺乏耐心、急于求成,总想跳过行动环节,寻求捷径,最后发现:这才是走了弯路,真正的捷径正是那条看起来漫长且低效的行动之路。

----《认知觉醒》

我们都知道,在投资的时候,要做到分散。

那什么才叫分散?我们投资的那些品种算是分散了吗?

举个例子,沪深300和中证500,算是相关性很高的品种吗?投了沪深300,还有没有必要再投中证500?

又比如,我就看好了A和B,能不能通过计算,得出这2个品种的相关性如何?

以上,就是分析相关性的目的,给我们的投资,提供数学理论基础。

1. 致敬E大、有知有行

关于相关性分析,是从有知有行整理的关于E大的系列文章中看到的。

这篇文章是:从相关性的角度谈资产配置

文章中,有一个图,印象是很深刻的:

图看起来还是很容易理解的,正所谓,大道至简,越简单的东西,越容易包含很深刻的道理。

正如我们行文开头所要寻找的答案,沪深300和中证500,相关度高吗?上图结果是0.772,还是要对比着看,这个数值,基本上算是比较高了,如果要找负相关的标的,应该要寻找那种是负值的,比如“全指能源”和“创业板指”。

那有时候,我们想要自己“检测”我们看好的标的相关性如何,要怎么做呢?

2. seaborn热力图

第一个案例,是使用seaborn的heatmap热力图来绘制。

2.1. 一月效应

什么是“一月效应”?

一月效应是从统计学角度分析股市走势的一种惯常现象,指一月份的回报率往往是“正数”。最初出现一月效应的国家是美国,然后其他国家的学者也陆续发现一月效应存在其他股市之中。

我们的大A股,是否也有一月效应呢?我们做一下沪深300逐月统计其收益率情况,看看是否有所谓的1月效应?

#导入数据分析和量化常用库
import pandas as pd
import numpy as np
import qstock as qs
#导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

# 只需要用收盘价进行计算和绘图用,其他字段暂不需要
index_price = qs.get_data("510300")[['close']]

# shift(1)是向下移动1个单位,然后相除正好就是当日的涨跌幅;to_period('M')是将行索引保留到月维度,便于后面分组统计月收益率
heat_data=(index_price/index_price.shift(1)-1).to_period('M')
# 分组统计月收益率
heat_data=heat_data.groupby(heat_data.index).apply(lambda x: ((((1+x).cumprod()-1).iloc[-1])*100).round(2))
heat_data=heat_data['2012':'2024']
print(heat_data)

# 开始年份
min_year = min(heat_data.index.year.tolist())
# 终止年份
max_year = max(heat_data.index.year.tolist())
# 年份数组
years = np.arange(min_year, max_year + 1, 1)
print("years=", years)
for y in range(max_year-min_year+1):
    print(y)
# 从 heat_data 取出对应年月的close值
value = [[i,j,heat_data['close'].get(str(min_year+i)+'-'+str(1+j))] for i in range(max_year-min_year+1) for j in range(12)]
month=[str(i)+'月' for i in range(1,13)]  # 1月、2月、3月....12月
print("value结果是:\n", value)

# 绘图
g = (HeatMap()
    .add_xaxis([str(i) for i in years])
    .add_yaxis("", month, value,
        label_opts=opts.LabelOpts(is_show=True, position="inside"),)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="沪深300月收益率(%)"),
        visualmap_opts=opts.VisualMapOpts(is_show=False,min_=-30,max_=30,)))
g.render_notebook()




         close
date          
2012-05   1.34
2012-06  -7.39
2012-07  -6.28
2012-08  -7.52
2012-09   6.04
...        ...
2023-09  -1.99
2023-10  -3.25
2023-11  -2.29
2023-12  -1.80
2024-01  -4.52

[141 rows x 1 columns]
years= [2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024]
0
1
2
3
4
5
6
7
8
9
10
11
12
value结果是:
 [[0, 0, None], [0, 1, None], [0, 2, None], [0, 3, None], [0, 4, 1.34], [0, 5, -7.39], [0, 6, -6.28], [0, 7, -7.52], [0, 8, 6.04], [0, 9, -3.12], [0, 10, -7.48], [0, 11, 26.2], [1, 0, 8.69], [1, 1, -0.93], [1, 2, -8.95], [1, 3, -2.27], [1, 4, 8.84], [1, 5, -19.15], [1, 6, 0.69], [1, 7, 7.99], [1, 8, 5.78], [1, 9, -1.97], [1, 10, 3.45], [1, 11, -6.3], [2, 0, -7.87], [2, 1, -1.25], [2, 2, -1.9], [2, 3, 0.52], [2, 4, 0.32], [2, 5, 1.6], [2, 6, 13.76], [2, 7, -0.83], [2, 8, 6.02], [2, 9, 3.31], [2, 10, 15.06], [2, 11, 32.01], [3, 0, -3.95], [3, 1, 4.81], [3, 2, 15.7], [3, 3, 20.36], [3, 4, 1.89], [3, 5, -7.83], [3, 6, -16.1], [3, 7, -13.83], [3, 8, -6.12], [3, 9, 13.64], [3, 10, 0.79], [3, 11, 5.53], [4, 0, -24.71], [4, 1, -2.72], [4, 2, 14.61], [4, 3, -2.11], [4, 4, 0.64], [4, 5, -0.3], [4, 6, 3.5], [4, 7, 4.91], [4, 8, -2.32], [4, 9, 2.62], [4, 10, 6.95], [4, 11, -7.72], [5, 0, 2.94], [5, 1, 1.97], [5, 2, 0.3], [5, 3, -0.76], [5, 4, 1.94], [5, 5, 6.41], [5, 6, 3.27], [5, 7, 2.81], [5, 8, 0.52], [5, 9, 4.63], [5, 10, -0.22], [5, 11, 0.61], [6, 0, 6.64], [6, 1, -6.49], [6, 2, -3.43], [6, 3, -4.06], [6, 4, 1.46], [6, 5, -7.82], [6, 6, 1.21], [6, 7, -5.83], [6, 8, 3.95], [6, 9, -9.75], [6, 10, 1.07], [6, 11, -6.21], [7, 0, 7.6], [7, 1, 16.12], [7, 2, 6.2], [7, 3, 0.77], [7, 4, -7.43], [7, 5, 6.9], [7, 6, 1.05], [7, 7, -0.98], [7, 8, 0.23], [7, 9, 2.15], [7, 10, -1.61], [7, 11, 7.64], [8, 0, -2.62], [8, 1, -1.7], [8, 2, -7.23], [8, 3, 7.05], [8, 4, -1.16], [8, 5, 8.7], [8, 6, 14.67], [8, 7, 2.77], [8, 8, -4.96], [8, 9, 2.54], [8, 10, 6.12], [8, 11, 5.39], [9, 0, 2.66], [9, 1, -0.37], [9, 2, -5.45], [9, 3, 1.61], [9, 4, 4.27], [9, 5, -1.6], [9, 6, -7.61], [9, 7, 0.15], [9, 8, 1.2], [9, 9, 0.97], [9, 10, -1.47], [9, 11, 2.06], [10, 0, -7.9], [10, 1, 0.38], [10, 2, -7.95], [10, 3, -4.97], [10, 4, 1.91], [10, 5, 10.59], [10, 6, -6.58], [10, 7, -1.93], [10, 8, -6.81], [10, 9, -8.11], [10, 10, 10.08], [10, 11, 0.71], [11, 0, 7.49], [11, 1, -2.15], [11, 2, -0.52], [11, 3, -0.63], [11, 4, -5.64], [11, 5, 2.14], [11, 6, 5.3], [11, 7, -6.1], [11, 8, -1.99], [11, 9, -3.25], [11, 10, -2.29], [11, 11, -1.8], [12, 0, -4.52], [12, 1, None], [12, 2, None], [12, 3, None], [12, 4, None], [12, 5, None], [12, 6, None], [12, 7, None], [12, 8, None], [12, 9, None], [12, 10, None], [12, 11, None]]

上面就是用热力图绘制的每个月的收益率情况,从13到23年的1月份,5年是下跌的6年是上涨的,并没有非常特别。

倒是7月和12月上涨的概率稍大些。

所以:不要光听所谓的名词,自己算一算自己的标的的历史回测,是否有这样的效果。

上面的案例,直接换一下qs.get_data("510300") 的证券代码,就可以回测其他标的了。

2.2. 各资产相关性

整体来说,就是构造一个dataframe,包含各标的的收盘价,然后通过seaborn的heatmap直接进行绘图即可。

import qstock as qs
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#正常显示画图时出现的中文
from pylab import mpl
#这里使用微软雅黑字体
mpl.rcParams["font.sans-serif"] = ["Arial Unicode MS"]  #mac

stocks_info = [
    {'code': '510300', 'name': '沪深300'},
    {'code': '510500', 'name': '中证500'},
    {'code': '512010', 'name': '医药ETF'},
    {'code': '512000', 'name': '券商ETF'},
    {'code': '516160', 'name': '新能源ETF'},
    {'code': '510800', 'name': '红利ETF'},
    {'code': '518880', 'name': '黄金ETF'},
    {'code': '512200', 'name': '房地产ETF'}
]
for stock in stocks_info:
    df = qs.get_data(stock['code'])  # 从qstock获取对应的股票历史数据
    stock['history_df'] = df         # 将其存在 history_df 这个key里面。

# 只保留收盘价,合并数据
df_all = pd.DataFrame()
for stock in stocks_info:
    df = stock['history_df']
    df = df[['close']]         # 只需要 date 和 close 2列就行了。
    df.rename(columns={'close': stock['name']}, inplace=True)  # 用股票的名字来重命名close列
    if df_all.size == 0:
        df_all = df
    else:
        df_all = df_all.join(df)  # join是按照index来连接的。

print(df_all)

# Plot
plt.figure(figsize=(12,10), dpi= 80)
sns.heatmap(df_all.corr(), xticklabels=df_all.corr().columns, yticklabels=df_all.corr().columns, cmap='RdYlGn', center=0, annot=True)
# Decorations
plt.title('指数相关性图', fontsize=22)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.show()


            沪深300  中证500  医药ETF  券商ETF  新能源ETF  红利ETF  黄金ETF  房地产ETF
date                                                                
2012-05-28  1.935    NaN    NaN    NaN     NaN    NaN    NaN     NaN
2012-05-29  1.975    NaN    NaN    NaN     NaN    NaN    NaN     NaN
2012-05-30  1.967    NaN    NaN    NaN     NaN    NaN    NaN     NaN
2012-05-31  1.961    NaN    NaN    NaN     NaN    NaN    NaN     NaN
2012-06-01  1.961    NaN    NaN    NaN     NaN    NaN    NaN     NaN
...           ...    ...    ...    ...     ...    ...    ...     ...
2024-01-15  3.276  5.279  0.385  0.817   0.626  1.001  4.673   0.507
2024-01-16  3.298  5.274  0.385  0.826   0.636  1.004  4.677   0.502
2024-01-17  3.223  5.141  0.376  0.811   0.614  0.988  4.631   0.487
2024-01-18  3.268  5.146  0.381  0.818   0.632  0.995  4.616   0.486
2024-01-19  3.275  5.106  0.381  0.812   0.625  1.002  4.643   0.485

[2836 rows x 8 columns]

绘图结果是:

2.3. 相关性结论

  1. 沪深300和中证500,相关性结果达到0.81,还是比较高的。

  2. 医药和沪深300的相关性也很高,这倒是没想到的。如果你同时买沪深300和医药,可能并不能达到分散的效果。

  3. 黄金和新能源,负相关很显著,这是为什么呢?下面一节进行验证。

2.4. 结果验证

在验证结果的时候,我们是通过绘制2者的收盘价图来直观对比看一下。

然而,由于不同标的,收盘价可能绝对值相差很大,例如贵州茅台和沪深300,单位价格放一起不太好观察,所以要进行数据标准化。

数据标准化,参考之前的一篇文章: 2.1.3-数据标准化

2.4.1. 黄金和新能源

黄金和新能源,-0.77非常扎眼,主要原因是:选取的新能源标的存续时间很短,而且在较长时间里是下跌趋势。而黄金,由于在这段时间里,由于一些地缘事件和其他时间,基本趋势是向上的,所以它们俩的相关性结果,就是很强的负相关。

之前也在 2.1.3-数据标准化 这篇文章里做了绘图,黄金和新能源的收盘价走势图如下:

上图绘制的完整代码如下,主要就是将2者数据先进行标准化,再用pyecharts绘图即可:

import qstock as qs
import pandas as pd
#导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

stocks_info = [
    {'code': '518880', 'name': '黄金ETF'},
    {'code': '516160', 'name': '新能源ETF'}
]
for stock in stocks_info:
    df = qs.get_data(stock['code'])  # 从qstock获取对应的股票历史数据
    stock['history_df'] = df         # 将其存在 history_df 这个key里面。

# 只保留收盘价,合并数据
df_all = pd.DataFrame()
for stock in stocks_info:
    df = stock['history_df']
    df = df[['close']]         # 只需要 date 和 close 2列就行了。
    df.rename(columns={'close': stock['name']}, inplace=True)  # 用股票的名字来重命名close列
    if df_all.size == 0:
        df_all = df
    else:
        df_all = df_all.join(df)  # join是按照index来连接的。

print('数据标准化前:\n', df_all)   # 取第1列和第2列的方法: df_all.iloc[:, 0:2]

# 对dataframe的数据进行标准化处理
import sklearn
from sklearn import preprocessing
z_scaler = preprocessing.StandardScaler()   # 建立 StandardScaler 对象
z_data = z_scaler.fit_transform(df_all)     #数据标准化
z_data = pd.DataFrame(z_data)               #将数据转为Dataframe
z_data.columns = df_all.columns
z_data.index = df_all.index
z_data = z_data.round(3)
print('数据标准化后:\n', z_data)


# 将标准化的数据绘图
g=(Line()
  .add_xaxis(z_data.index.strftime('%Y-%m-%d').tolist())
  .add_yaxis(series_name=stocks_info[0]['name'],y_axis=z_data[stocks_info[0]['name']],symbol="circle",is_symbol_show=True,itemstyle_opts={"color": "green"},symbol_size=8)
.add_yaxis(series_name=stocks_info[1]['name'],y_axis=z_data[stocks_info[1]['name']],symbol="pin",is_symbol_show=True,itemstyle_opts={"color": "red"},symbol_size=8)
)
g.render_notebook()

2.4.2. 黄金和房地产

其实,黄金和房地产的负相关性,很大一部分,还是因为房地产也是一个下降趋势。

2.4.3. 沪深300和中证500

按照我们在相关性热力图来看,沪深300和中证500,相关性值是0.81,还是很高的,我们也绘图看一下:

3. 结论

如果有想测算的标的,直接使用此文章里”各资产相关性“小节,进行绘图观察即可。

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

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

相关文章

【redis13】集群前奏:sentinel模式

1.哨兵sentinel引入背景 我们现在来思考一个问题:如何实现服务的高可用。我们首先想到至少要满足两个要求:1.服务端能够实现主从自动切换;2.对于客户端来说,如果发生了主从切换,则能够自动连接到最新的master节点。 我…

第04章_IDEA的安装与使用(上)(认识,卸载与安装,JDK相关设置,详细设置,工程与模块管理,代码模板的使用)

文章目录 第04章_IDEA的安装与使用(上)本章专题与脉络1. 认识IntelliJ IDEA1.1 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA的主要优势:(vs Eclipse)1.4 IDEA 的下载 2. 卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4 注册2…

Django REST Framework入门之序列化器

文章目录 一、概述二、安装三、序列化与反序列化介绍四、之前常用三种序列化方式jsonDjango内置Serializers模块Django内置JsonResponse模块 五、DRF序列化器序列化器工作流程序列化(读数据)反序列化(写数据) 序列化器常用方法与属…

使用 Node 创建 Web 服务器

Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块,代码如下: var http require(http); 以下是演示一个最基本的 HTTP 服务器架构(使用 8080 端口)&#x…

acwing讲解篇之94. 递归实现排列型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 定义递归深度deep,数字使用情况used,选择的数字顺序path 进行递归 终止条件为递归深度达到n层时,打印path,然后返回 深度加一 遍历未使用的数字,选择数字&am…

web架构师编辑器内容-编辑器组件图层面板功能开发-锁定隐藏、键盘事件功能的开发

我们这一部分主要是对最右侧图层面板功能进行剖析,完成对应的功能的开发: 每个图层都对应编辑器上面的元素,有多少个元素就对应多少个图层,主要的功能如下: 锁定功能:点击锁定,在编辑器中没法编辑对应的组…

Elasticsearch的映射操作

本文来记录下Elasticsearch的映射操作 文章目录 映射的概述 映射的概述 Elasticsearch与mysql数据库对比 映射的概述 有了索引库,等于有了数据库中的 database。索引库(index)中的映射,类似于数据库(database)中的表结构(table)。创建数据库表需要设置字…

3、非数值型的分类变量

非数值型的分类变量 有很多非数字的数据,这里介绍如何使用它来进行机器学习。 在本教程中,您将了解什么是分类变量,以及处理此类数据的三种方法。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、三种方法的使用1…

Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel

前言 本文主要讲解,使用不同的 Channel 让 Flutter 和 Android原生 进行通信,由于只是讲解两端通信,所以可视化效果不好; 不过我写了一篇专门讲解 Flutter 嵌入 Android原生View的文章 Flutter 页面嵌入 Android原生 View-CSDN…

小程序使用echarts图表-雷达图

本文介绍下小程序中如何使用echarts 如果是通过npm安装,这样是全部安装的,体积有点大 我这边是使用echarts中的一个组件来实现的,下边是具体流程,实际效果是没有外边的红色边框的,加红色边框的效果是这篇说明 1.echa…

精品基于Uniapp+springboot疫情防控管理系统App

《[含文档PPT源码等]精品基于Uniappspringboot疫情防控管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:Java 后台框架:springboot、ssm …

keil软件仿真

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要…

Excel 根据日期按月汇总公式

Excel 根据日期按月汇总公式 数据透视表日期那一列右击,选择“组合”,步长选择“月” 参考 Excel 根据日期按月汇总公式Excel如何按着日期来做每月求和

Centos 8 安装 Elasticsearch

简介:CentOS 8是一个基于Red Hat Enterprise Linux(RHEL)源代码构建的开源操作系统。它是一款稳定、可靠、安全的服务器操作系统,适合用于企业级应用和服务的部署。CentOS 8采用了最新的Linux内核和软件包管理系统,提供…

测试覆盖与矩阵

4. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测…

【linux驱动】用户空间程序与内核模块交互-- IOCTL和Netlink

创建自定义的IOCTL(输入/输出控制)或Netlink命令以便用户空间程序与内核模块交互涉及几个步骤。这里将分别介绍这两种方法。 一、IOCTL 方法 1. 定义IOCTL命令 在内核模块中,需要使用宏定义你的IOCTL命令。通常情况下,IOCTL命令…

【js】js 异步机制详解 Generator / Async / Promise

三种语法功能放在一起,是因为他们都有相似特点: 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题: 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构?async 函数为什么返回一个 promise&#xf…

关于常见分布式组件高可用设计原理的理解和思考

文章目录 1. 数据存储场景和存储策略1.1 镜像模式-小规模数据1.2 分片模式-大规模数据 2. 数据一致性和高可用问题2.1 镜像模式如何保证数据一致性2.2 镜像模式如何保证数据高可用2.2.1 HA模式2.2.2 分布式选主模式 2.3 分片模式如何数据一致性和高可用 3. 大规模数据集群的架构…

Qt事件过滤

1.相关说明 监控鼠标进入组件、出组件、点击组件、双击组件的事件,需要重写eventFilter函数 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中,有效的并发控…